подсчитывать ячейки строк и копировать и вставлять

#vba #loops #count #copy #row

#vba #циклы #подсчитывать #Копировать #строка

Вопрос:

Я использую свой код для работы с программным макросом на основе c #, но я хочу, чтобы мой макрос выполнялся только с помощью VBA, а не с помощью c #, может ли он это сделать? не использовать point?

  1. Данные в B2 ~ Bxxxxx
  2. моя программа на c # копирует значение ячейки B2 и вставляет другую ячейку K3 рабочего листа
  3. запустите макрос под кодом
     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
  
  1. затем моя программа на 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