• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Циклы в Vb

  • Автор темы Alex77777
  • Дата начала
A

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

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

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

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 ? (иначе опять ошибка)
 
A

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
 
T

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
'но тут тебе виднее, поскольку может тебе как раз и нужно выделить эту строку
 
A

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
 
D

`Dmitry

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

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

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

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
 
D

`Dmitry

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

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
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!