Приветствую, уважаемые. Возникла такая проблема, не знаю, в какую сторону "копать". В книге два листа ааа и ххх ххх это своего рода общая таблица в которой хранится расписка по заказам. данные туда записываются из формы ввода, с этим проблем нет. иногда возникает необходимость изменить расписку. То ли название пришлось менять, то ли кол-во строк увеличилось или уменьшилось. Главный момент и состоит в том, что может увеличиться кол-во строк. Мне нужно сосчитать кол-во строк в таблице ааа, скопировать данные которые там есть, перейти на лист ххх, найти по коду строку соответствующую ааа и заменить/вставить/удалить строки. Если бы была одна строка, то с этим проблем не было, но вот когда несколько строк нужно вставить (расширить таблицу) то не понимаю как это сделать.
Приветствую, уважаемые. Возникла такая проблема, не знаю, в какую сторону "копать". В книге два листа ааа и ххх ххх это своего рода общая таблица в которой хранится расписка по заказам. данные туда записываются из формы ввода, с этим проблем нет. иногда возникает необходимость изменить расписку. То ли название пришлось менять, то ли кол-во строк увеличилось или уменьшилось. Главный момент и состоит в том, что может увеличиться кол-во строк. Мне нужно сосчитать кол-во строк в таблице ааа, скопировать данные которые там есть, перейти на лист ххх, найти по коду строку соответствующую ааа и заменить/вставить/удалить строки. Если бы была одна строка, то с этим проблем не было, но вот когда несколько строк нужно вставить (расширить таблицу) то не понимаю как это сделать.Stormy
Это все мысли виноваты, крутятся в разных направлениях )) Поиск провожу по столбцу С , заголовок Номер. Сейчас пришла мысль, что как вариант можно сделать так: При первой записи блока строк в таблицу на листе ххх давать запас. Максимальное кол-во записываемых строк не может превышать количества 10. То есть получится, что будет к примеру запись (с одинаковым номером) из 6 строк. В след. раз при необходимости замены в из листа ааа, находить и менять эти строки. Этим самым физическое удаление/добавление строк в ххх отпадает. Осталось придумать как правильно все это организовать и насколько верно будет работать таблица, которая содержит кучу пустых строк между блоками ((
Это все мысли виноваты, крутятся в разных направлениях )) Поиск провожу по столбцу С , заголовок Номер. Сейчас пришла мысль, что как вариант можно сделать так: При первой записи блока строк в таблицу на листе ххх давать запас. Максимальное кол-во записываемых строк не может превышать количества 10. То есть получится, что будет к примеру запись (с одинаковым номером) из 6 строк. В след. раз при необходимости замены в из листа ааа, находить и менять эти строки. Этим самым физическое удаление/добавление строк в ххх отпадает. Осталось придумать как правильно все это организовать и насколько верно будет работать таблица, которая содержит кучу пустых строк между блоками ((Stormy
Пошел немного по другому пути, стал дописывать снизу и удалять предыдущие записи. Если вдруг кому-то понадобится.
[vba]
Код
Sub UpdateDataFromIsxodToBaza() Dim wsSource As Worksheet, wsTarget As Worksheet Dim lastRowSource As Long, lastRowTarget As Long Dim i As Long, targetRow As Long Dim codeToFind As String Dim found As Range Dim copyRange As Range Dim row As Long
' Проверяем, существует ли лист "isxod" On Error Resume Next Set wsSource = ThisWorkbook.Sheets("isxod") On Error GoTo 0 If wsSource Is Nothing Then MsgBox "Лист 'isxod' не найден!" Exit Sub End If
' Проверяем, существует ли лист "baza" On Error Resume Next Set wsTarget = ThisWorkbook.Sheets("baza") On Error GoTo 0 If wsTarget Is Nothing Then MsgBox "Лист 'baza' не найден!" Exit Sub End If
' Находим последнюю строку на листе isxod в столбце E lastRowSource = wsSource.Cells(wsSource.Rows.Count, "E").End(xlUp).row
' Находим последнюю строку на листе baza в столбце C lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).row
' Проходим по строкам на листе isxod, начиная с 4-й For i = 4 To lastRowSource ' Начинаем с 4-й строки на листе isxod codeToFind = wsSource.Cells(i, "C").Value ' Получаем код из столбца "Номер" на листе isxod
' Ищем все строки с таким же кодом в столбце C на листе baza Set found = wsTarget.Range("C4:C" & lastRowTarget).Find(codeToFind, LookIn:=xlValues)
' Если найдено совпадение, очищаем все строки с таким же номером на листе baza Do While Not found Is Nothing found.EntireRow.ClearContents ' Ищем следующее совпадение Set found = wsTarget.Range("C4:C" & lastRowTarget).FindNext(found) Loop
' Находим следующую пустую строку на листе baza lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).row + 1
' Определяем диапазон для копирования данных на листе isxod (A4:E последняя строка) Set copyRange = wsSource.Range("A4:E" & lastRowSource) ' Копируем все строки с A4 до последней строки с данными
' Копируем диапазон с листа isxod и вставляем в следующую строку на листе baza copyRange.Copy wsTarget.Range("A" & lastRowTarget).PasteSpecial Paste:=xlPasteValues Next i
' Удаляем пустые строки на листе baza lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).row For row = lastRowTarget To 4 Step -1 ' Идем от последней строки вверх If WorksheetFunction.CountA(wsTarget.Rows(row)) = 0 Then wsTarget.Rows(row).Delete End If Next row
MsgBox "Данные обновлены на листе 'baza'!" End Sub
[/vba]
Пошел немного по другому пути, стал дописывать снизу и удалять предыдущие записи. Если вдруг кому-то понадобится.
[vba]
Код
Sub UpdateDataFromIsxodToBaza() Dim wsSource As Worksheet, wsTarget As Worksheet Dim lastRowSource As Long, lastRowTarget As Long Dim i As Long, targetRow As Long Dim codeToFind As String Dim found As Range Dim copyRange As Range Dim row As Long
' Проверяем, существует ли лист "isxod" On Error Resume Next Set wsSource = ThisWorkbook.Sheets("isxod") On Error GoTo 0 If wsSource Is Nothing Then MsgBox "Лист 'isxod' не найден!" Exit Sub End If
' Проверяем, существует ли лист "baza" On Error Resume Next Set wsTarget = ThisWorkbook.Sheets("baza") On Error GoTo 0 If wsTarget Is Nothing Then MsgBox "Лист 'baza' не найден!" Exit Sub End If
' Находим последнюю строку на листе isxod в столбце E lastRowSource = wsSource.Cells(wsSource.Rows.Count, "E").End(xlUp).row
' Находим последнюю строку на листе baza в столбце C lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).row
' Проходим по строкам на листе isxod, начиная с 4-й For i = 4 To lastRowSource ' Начинаем с 4-й строки на листе isxod codeToFind = wsSource.Cells(i, "C").Value ' Получаем код из столбца "Номер" на листе isxod
' Ищем все строки с таким же кодом в столбце C на листе baza Set found = wsTarget.Range("C4:C" & lastRowTarget).Find(codeToFind, LookIn:=xlValues)
' Если найдено совпадение, очищаем все строки с таким же номером на листе baza Do While Not found Is Nothing found.EntireRow.ClearContents ' Ищем следующее совпадение Set found = wsTarget.Range("C4:C" & lastRowTarget).FindNext(found) Loop
' Находим следующую пустую строку на листе baza lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).row + 1
' Определяем диапазон для копирования данных на листе isxod (A4:E последняя строка) Set copyRange = wsSource.Range("A4:E" & lastRowSource) ' Копируем все строки с A4 до последней строки с данными
' Копируем диапазон с листа isxod и вставляем в следующую строку на листе baza copyRange.Copy wsTarget.Range("A" & lastRowTarget).PasteSpecial Paste:=xlPasteValues Next i
' Удаляем пустые строки на листе baza lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "C").End(xlUp).row For row = lastRowTarget To 4 Step -1 ' Идем от последней строки вверх If WorksheetFunction.CountA(wsTarget.Rows(row)) = 0 Then wsTarget.Rows(row).Delete End If Next row
MsgBox "Данные обновлены на листе 'baza'!" End Sub