Excel - макрос для копирования динамического номера строки из одной книги в другую - PullRequest
1 голос
/ 21 марта 2011

Я пытался найти ответ на этот вопрос, но пока мне не повезло.

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

Другая проблема заключается в том, что при следующем запуске макроса мне нужно просмотреть следующую строкувниз в исходной книге, например,

Первый запуск копирует строку 2 (поскольку заголовки столбцов находятся в строке 1) в строку 2 другой книги. Второй запуск копирует строку 3 в строку 2 другой книги (как чтение программы).эта книга выглядит только в строке 2).

Итак, я предполагаю, что в коде необходим счетчик?

Если есть какие-либо предложения, это будет очень признательно.

Ответы [ 3 ]

1 голос
/ 21 марта 2011

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

Вы можете хранить это в одном из нескольких мест:

  • Скрытый и защищенный лист в той же книге
  • Защищенная ячейка в одной из существующих рабочих книг

Каждый раз, когда макрос выполняется успешно, вы обновляете значение для LastRowCopiedOver, чтобы вы знали, какую строку выбрать в следующий раз.

Когда вы дойдете до конца книги, вы можете отобразить окно сообщения с вопросом Да / Нет, чтобы вернуться к строке 2.

0 голосов
/ 21 марта 2011

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

Я изменил свой сценарий QAWP для запуска этого макроса Excel, и теперь он устанавливает данные в сценарии, используя новую электронную таблицу из одной строки.

Похоже, это работает до сих пор, и это означает, что я могу создавать новые тестовые данные отдельно от таблицы данных, используемой QAWP.

Я разместил скрипт Excel VBA ниже для справки:

Sub Copy_Next_Record()

Application.Workbooks.Open _
    "C:\Documents and Settings\user\My Documents\Personal_Data.xls"
Dim RowCount As Range
Set RowCount = _
    Workbooks("Full_Personal_Data.xls").Worksheets("Count").Range("A1")   
Workbooks("Full_Personal_Data.xls").Worksheets("Data").Activate   
Rows(RowCount).Copy _
    Destination:=Workbooks("Personal_Data.xls").Worksheets("Sheet1").Rows(2)    
RowCount.Value = RowCount.Value + 1    
Workbooks("Personal_Data.xls").Close True  
Workbooks("Full_Personal_Data.xls").Close True

End Sub
0 голосов
/ 21 марта 2011

A Static Function добьется цели.

Static Function RowCounter() As Long
    Dim i ' Value of locally declared variable is preserved between calls.
    i = i + 1
    RowCounter = i
End Function

Каждый раз, когда вы вызываете его из своей основной программы, i будет увеличиваться на 1. Поскольку RowCounter является статическим, он будет помнить, что значение i находится между вызовами.

Запустите следующую подпрограмму несколько раз и посмотрите шаг MsgBox. Текущая строка будет скопирована в «Sheet2». Замените его тем, что вы выбрали.

Sub main()
    Dim iRow As Long

    Do While iRow < 2 ' To skip headers row 1...
        ' Get next row number.
        iRow = RowCounter
    Loop
    MsgBox iRow ' To show that each time main is called, iRow will be incremented by 1.

    ' Copy and paste that row...
    Rows(iRow).Copy Destination:=Worksheets("Sheet2").Rows(2)

End Sub

Вы можете сбросить счетчик до нуля, зайдя в редактор VBA и нажав кнопку сброса (квадрат) на стандартной панели инструментов или в меню «Выполнить».

Если вы сохраните счетчик в какой-либо защищенной / скрытой ячейке или листе, его сброс будет PITA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...