#vba #loops #count #copy #row
#vba #циклы #подсчитывать #Копировать #строка
Вопрос:
Я использую свой код для работы с программным макросом на основе c #, но я хочу, чтобы мой макрос выполнялся только с помощью VBA, а не с помощью c #, может ли он это сделать? не использовать point?
- Данные в B2 ~ Bxxxxx
- моя программа на c # копирует значение ячейки B2 и вставляет другую ячейку K3 рабочего листа
- запустите макрос под кодом
Sub CopyRows()
Application.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Dim bottomL As Long
Dim x As Long
bottomL = Sheets("Total").Range("L" amp; Rows.Count).End(xlUp).Row: x = 1
Dim c As Range
Dim lr As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
For Each c In Sheets("Total").Range("K1:K" amp; bottomL)
If c.Value = "Inside" Then
c.EntireRow.Copy Worksheets("filter").Range("A" amp; Rows.Count).End(xlUp).Offset(1, 0)
x = x 1
End If
Next c
End Sub
- затем моя программа на c # выбирает b3 и копирует в ячейку otherworksheet k3, затем запускает макрос, затем выполняет цикл этого процесса и завершает ячейку на Bxxxxx
кто-нибудь знает, что работает только с использованием VBA?
Спасибо и извините за мой плохой английский
Ответ №1:
В VBA сделайте полный код следующим образом:
Function CopyRows()
Application.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Dim bottomL As Long
Dim x As Long
bottomL = Sheets("Total").Range("L" amp; Rows.Count).End(xlUp).Row
x = 1
Dim c As Range Dim lr As Long
lr = Cells(Rows.Count, 1).End(xlUp).Row
For Each c In Sheets("Total").Range("K1:K" amp; bottomL)
If c.Value = "Inside" Then
c.EntireRow.Copy
Worksheets("filter").Range("A" amp; Rows.Count).End(xlUp).Offset(1, 0)
x = x 1
End If
Next c
End Function
Sub Main()
Dim bottomB As Long
Dim y As Long
bottomB = Range("B" amp; Rows.Count).End(xlUp).Row
For y = 2 To bottomB
Range("B" amp; 2).Copy Worksheets("Total").Range("K3")
CopyRows
Next
End Sub
Затем запускайте только Sub Main().
Ответ №2:
Спасибо Васиф Хасан
Я уже использую подобный код, который я сделал
Sub dual()
Application.ScreenUpdating = False ActiveSheet.DisplayPageBreaks = False
Dim i As Long
Dim totalRows As Long
Dim lastRow As Long
Dim Number As Long
Dim nowRows As Long
Dim bottomL As Long
Dim x As Long
Dim c As Range
Dim lr As Long
bottomL = Sheets("Total").Range("L" amp; Rows.Count).End(xlUp).Row: x = 1
lr = Cells(Rows.Count, 1).End(xlUp).Row
With Worksheets("List")
'for looping
totalRows = .Cells(.Rows.Count, "B").End(xlUp).Row
'index of row to add from
lastRow = totalRows 1 '<--| start pasting values one row below the last non empty one in column "B"
'data starts at row #2
For i = 2 To totalRows
If .Cells(i, 2).Value > 0 Then
Worksheets("List").Cells(i, "B").Copy
Worksheets("Total").Range("K3").PasteSpecial Paste:=xlPasteValues
lastRow = lastRow Number
For Each c In Sheets("Total").Range("L1:L" amp; bottomL)
If c.Value = "Inside" Then
c.EntireRow.Copy Worksheets("filter").Range("A" amp; Rows.Count).End(xlUp).Offset(1, 0)
x = x 1
End If
Next c
End If
Next i
End With Application.ScreenUpdating = True ActiveSheet.DisplayPageBreaks = True End Sub
но при копировании и вставке было потеряно много данных
, поэтому нужно дождаться завершения вставки
, поэтому я использую другую программу
, есть ли возможность выполнить ожидание вставки?
Спасибо за ваш ответ
Ответ №3:
Если нет необходимости копировать и вставлять, попробуйте не использовать эту команду. Быстрее просто использовать cell1.Value = cell2.Value . В вашем случае вы должны объявить переменную для подсчета общего количества столбцов в b. Затем используйте цикл, чтобы пройти через b2 до bx. Пример:
dim i как целое
число dim j как целое
число j = 3
Для i = 2 для totalCount
Рабочий лист.Ячейки (2, i).Значение = Worksheet2.Ячейки (11, j)
j = j 1
Далее я
В приведенном выше 2 = столбец B и 11 = столбец K