Циклы в Vb

Тема в разделе "Visual Basic", создана пользователем Alex77777, 4 май 2007.

  1. Alex77777

    Alex77777 Гость

    тема такая: при нажатии на форме клавиши "сохранить", данные из формы должны попасть в Excel-файл, при этом форма закрывается, далее при повторном открытии формы и нажатии кл. "Сохранить", данные должны попасть в файл, но при этом нужно проверить строки на наличие в них информации- если есть, то проверить след строку и так пока не найдет пустую (когда нашел пустую добавляет новую строку и данные в нее из формы. пробовал через циклы не получается, при одном нажатии "Сохранить" он вводит в файл десять строк и все, либо вставляет данные в первую строку невзирая на то, есть там информация или нет:

    Dim b As Long
    For b = 2 To Cells(10, 1)
    If Range(b, 1) = "" Then

    Cells(b, 1) = txtInt.Text
    Cells(b, 2) = txtDate.Text
    Else
    Rows(b+1: b+1).Select
    Selection.Insert Shift:=xlDown
    End If
    Next b

    делал наоборот :

    Dim b As Long
    For b = 2 To Cells(10, 1)
    If Range(b, 1) <> "" Then
    Rows(b+1: b+1).Select
    Selection.Insert Shift:=xlDown
    Else
    Cells(b, 1) = txtInt.Text
    Cells(b, 2) = txtDate.Text
    End If
    Next b

    но результат тот же.
    Либо вообще зависает при запуске программы.

    Кто знает подскажите в чем тут "собака" зарыта :)
    Заранее спасибо!
     
  2. Tanya

    Tanya Гость

    For b = 2 To Cells(10, 1)
    То есть цикл от 2 до значения, хранящегося в ячейке A10

    Так и должно быть?
    Если нет и необходимо найти пустую строку, то
    а) если найти первую попавшуюся пустую строку можно использовать CurrentRegion
    то есть, посик осуществляется по столбцу C = первая найденная пустая ячейка в этом столбце
    будет обозначать, что эта строка должна быть заполнена
    пусть первая строка поиска = 3, тогда
    REmpty = Cells(3,C).CurrentRegion.Rows.Count + 3 и будет искомой строкой

    б) найти самую последнюю заполненную строку на листе, при этом не важно,
    что в диапазоне есть пустые строки, тогда можно использовать UsedRange:
    REmpty = UsedRange.Row + UsedRange.Rows.Count

    После нахождения пустой строки можно информацию сразу в найденную записывать, а не вставлять
    новую строку, кстати ты вставляешь строки, как только нашел не пустую, не взирая на то,
    есть ли за ней еще строки с записями или нет


    If Range(b, 1) = "" Then
    Имеется ввиду Cells(b,1) - ? (иначе ошибка)

    Rows(b+1: b+1).Select
    А здесь как Rows(b+1 & ":" & b+1).Select ? (иначе опять ошибка)
     
  3. Alex77777

    Alex77777 Гость

    да, мне нужно найти пустую строку, вставить в нее данные и добавить после нее еще одну новую пустую строку, (т.к. внизу после вставленных строк стоит еще стандартная шапка, где должны расписываться сотрудники после распечатывания файла). и так проверять-вставлять-добавлять он должен каждый раз при открытии с последующим сохранением файла. Если я правильно понял, то сначала мы ищем пустую строку при помощи вот этой штуки:

    REmpty = Cells(3,C).CurrentRegion.Rows.Count + 3 ( в этом случае он пишет переменная "C" не определена, в екселе я пользуюсь обозначением ячеек цифра-цифра, а не буква-цифра, поэтому "C"=столбец я меняю на столбец "1"- по другому это столбец "А")
    таким образом первая строка получается:

    REmpty = Cells(3, 1).CurrentRegion.Rows.Count + 3 ( в этом случае он пишет переменная "REmpty"),
    тогда пишу все по другому:

    Dim x As New Excel.Workbook
    Dim s As String

    s = "C:\Мои документы\шаблон" & Format$(Now, "mmmm yyyy") & ".xls"

    Set xl = Application.Workbooks.Open(s)
    x.Activate

    Static b@
    b = 2
    Dim REmpty As String
    REmpty = Cells(b, 1).CurrentRegion.Rows.Count + b
    Cells(b, 1) = txtText1.Text
    Cells(b, 2) = txtText2.Text
    Cells(b, 3) = txtText3.Text
    Cells(b, 4) = txtText4.Text

    b@ = b@ +1

    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs FileName:= _
    "C:\Мои документы\шаблон" & " " & Format$(Now, "mmmm yyyy") & ".xls", FileFormat _
    :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _
    False, CreateBackup:=False
    ActiveWorkbook.Save
    ActiveWorkbook.Close
    Unload Me

    в итоге он сохраняет все в одну и ту же строку.
    Еще раз объясните мне непонятливому поподробнее как это сделать. :p


    кстати если перед

    Cells(b, 1) = txtText1.Text
    вставить вот эту часть кода, то он добавляет пустую строку в самом верху(это связано я думаю с тем, что в нчале я принял В=2),

    Rows(b + 1 & ":" & b + 1).Select
    Selection.Insert Shift:=xlDown
     
  4. Tanya

    Tanya Гость

    В общем-то С и имелась ввиду, объявленная ранее переменная, обозначающая номер столбца :)
    извини за неточность

    Static b@
    b = 2
    Dim REmpty As String 'не очень верно - это номер строки, значит Iteger или Long
    'в твоем теперешнем коде это не важно, т.к ты его дальше не используешь
    REmpty = Cells(b, 1).CurrentRegion.Rows.Count + b

    'а вот тут, скорее всего ты перепутал, нужно ссылаться на строку не b а REmpty
    'или не вводить переменную REmpty а присваивать b номер пустой строки
    Cells(b, 1) = txtText1.Text
    Cells(b, 2) = txtText2.Text
    Cells(b, 3) = txtText3.Text
    Cells(b, 4) = txtText4.Text

    'вот здесь, лишняя операция в приведенном коде, поскольку
    'это статическая переменная, и ты ее вроде бы запоминаешь, НО!
    'прикаждом входе в процедуру ты ее переопредедляешь равной 2 (см. выше)
    b@ = b@ +1

    'поэтому, используя, то что b=0 при первом входе в процедуру,
    'можно так заменить строку b = 2 на следующую:
    if b=0 then b=2
    и строка b@ = b@ +1 уже имеет смысл


    Ну, и уже пользуясь случаем, 2 маленьких замечания :)

    1)
    'Сохранил книгу под указанным именем
    ActiveWorkbook.SaveAs FileName:= _
    "C:\Мои документы\шаблон" & " " & Format$(Now, "mmmm yyyy") & ".xls", FileFormat _
    :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _
    False, CreateBackup:=False

    'и тут же следом сохранил ее снова - лишняя операция
    ActiveWorkbook.Save

    2)
    Rows(b + 1 & ":" & b + 1).Select
    Selection.Insert Shift:=xlDown

    'Можно заменить на
    Rows(b + 1 & ":" & b + 1).Insert Shift:=xlDown
    'потомучто без все операции выполняются быстрее, если не использовать Select
    'но тут тебе виднее, поскольку может тебе как раз и нужно выделить эту строку
     
  5. Alex77777

    Alex77777 Гость

    ты просто кладезь информации!!!
    ты очень очень облегчила написание проги, я тыкался по этому вопросу несколько недель!
    СПАСИБО ! ! !

    Кстати отдельное спасибо за замечания, извините за тафталогию: замечания - замечательные <_< (скорость обработки событий мне тоже необходима)

    Таким образом с помощью отзывчивых программистов ответ на мой вопрос такой:

    'находим в открытом файле первую пустую строку
    Dim REmpty As Long
    REmpty = Cells(1, 1).CurrentRegion.Rows.Count + 1

    'добавляем пустую строку
    Rows(REmpty + 1 & ":" & REmpty + 1).Insert Shift:=xlDown

    'вносим данные из формы в соответствующие ячейки файла
    Cells(REmpty, 1) = txtText1.Text
    Cells(REmpty, 2) = txtText2.Text
     
  6. `Dmitry

    `Dmitry Гость

    Здравствуйте. Сразу оговорюсь, без стеснения - я начинающий.
    Поставил перед собой такой вопрос. В Excle надо сотворить такое.
    Лист с отсортированными данными по столбцу А. Взять ячейку первой строки и
    сравнить с последующей ячейкой. Если они равны взять следующую,
    если нет то вставить пустую строку между теми которые не равны.

    пример:
    было 1 стало 1
    _____1__________1
    _____2___________
    _____2__________2
    _____3__________2
    _____3___________
    _____3__________3
    ________________3
    ________________3

    Всю голову изломал, но запутался в цикле. Направьте пожалуйста на путь истинный. :)
     
  7. Tanya

    Tanya Гость

    Выполняет действие по столбцу B. Наглядно будет, если столбец А будет содержать то же и столбец В, тогда после выполнения столбец А - состояние до сортировки, столбец В - после сортировки

    Sub nn()
    Dim i As Integer
    i = 2
    Do While Len(Cells(i, 2).Value)
    If Cells(i, 2).Value <> Cells(i - 1, 2).Value Then
    Cells(i, 2).Insert Shift:=xlDown
    i = i + 2
    Else
    i = i + 1
    End If
    Loop
    End Sub
     
  8. `Dmitry

    `Dmitry Гость

    Огромное спасибо Tanya. Прав был Alex77777.
    Пока высказывал слова благодарности и лести :D созрел вопросик. Как обозначается пустая строка?
    В добавленную сторку буду вставлять формулу.
    И ещё, строка вставляются в одни столбец. А у меня цель вставить по ширине всего листа, так как в соседних столбцах
    есть данные, их то я и стал бы считать.
     
  9. Tanya

    Tanya Гость

    в смысле? В ячейки вставленной строки добавить формулы или данные?
    уже будем отслеживать по содержимому первого столбца :),
    вставлять строку и в ячейку первого столбца вставленной строки записывать текст

    Sub nn()
    Dim i As Integer
    i = 2
    Do While Len(Cells(i, 1).Value)
    If Cells(i, 1).Value <> Cells(i - 1, 1).Value Then
    Rows(i).Insert Shift:=xlDown
    Cells(i, 1).Value = "Эта строка добавлена"
    i = i + 2
    Else
    i = i + 1
    End If
    Loop
    End Sub
     
Загрузка...
Похожие Темы - Циклы
  1. Maddy101d
    Ответов:
    3
    Просмотров:
    1.015
  2. Homka
    Ответов:
    12
    Просмотров:
    2.878
  3. Smile1995
    Ответов:
    2
    Просмотров:
    1.135
  4. Antonim
    Ответов:
    2
    Просмотров:
    1.473

Поделиться этой страницей