Копировать строки из нескольких листов в один

Вы можете использовать только псевдонимы столбцов в предложениях GROUP BY, ORDER BY или HAVING.

Стандартный SQL не позволяет ссылаться на псевдоним столбца в предложении WHERE. Это ограничение наложено, потому что, когда выполняется код WHERE, значение столбца еще не может быть определено.

blockquote>

Скопировано из Документация MySQL

Как указано в комментариях, использование HAVING вместо этого может выполнить эту работу. Обязательно прочитайте это WHERE vs HAVING .

0
задан Jenny 18 January 2019 в 09:37
поделиться

3 ответа

Вы можете попробовать:

Option Explicit

Sub test()

    Dim ws As Worksheet
    Dim strSearch As String
    Dim rngSearch As Range
    Dim LastrowMaster As Long

    'Set what you are looking for
    strSearch = "2019"

    'Loop all sheets
    For Each ws In ThisWorkbook.Worksheets
        'Loop sheets except the master sheet
        If ws.Name <> "Master" Then

            'Set ws as search range & get the row
            Set rngSearch = ws.UsedRange.Find(strSearch)

            'Find master sheet lastrow
            LastrowMaster = wsMaster.Cells(wsMaster.Rows.Count, "A").End(xlUp).Row

            'Paste the copied line in master sheet
            ws.Rows((rngSearch.Row)).EntireRow.Copy wsMaster.Range("A" & LastrowMaster + 1)

        End If

    Next

End Sub
0
ответ дан Error 1004 18 January 2019 в 09:37
поделиться
 Dim ws as worksheet
 For each ws in worksheets
   if ws.index <> 2 then 'ship second sheet because I think that's your master?
       set c = ws.find .... etc 

       if not c is nothing then
             firstResult = c.Address
            Do
                 c.entire.row.copy ....
                 set c = ws.findnext
            loop until...
        end if
      end if
      next ws
0
ответ дан Harassed Dad 18 January 2019 в 09:37
поделиться

От всех листов до мастер-листа

Версия массива

Sub AllSheetsToMaster()

  Const cMaster As Variant = "Master"   ' Master Worksheet Name/Index
  Const cSearch As String = "2019"      ' Search String
  Const cFirstR As Long = 1             ' Source First Row Number
  Const cFirstC As Variant = 1          ' Source First Column Letter/Number

  Dim vntS As Variant   ' Source Array
  Dim vntC As Variant   ' Count Array
  Dim vntT As Variant   ' Target Array
  Dim LastUR As Long    ' Source Last Used Row Number
  Dim LastUC As Long    ' Source Last Used Column Number
  Dim LastR As Long     ' Target Last Used Row Number
  Dim x As Long         ' Worksheet Counter
  Dim i As Long         ' Source Array Row Counter
  Dim j As Long         ' Source/Target Array Column Counter
  Dim k As Long         ' Target Array Row Counter

  For x = 1 To ThisWorkbook.Worksheets.Count ' Worksheets

    ' From Source Worksheet to Source Array.

    With ThisWorkbook.Worksheets(x)
      ' Check if current worksheet name is th same as Master Worksheet Name.
      If .Name = cMaster Then GoTo NextWorksheet
      ' Check if current worksheet is empty.
      If .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
          Is Nothing Then GoTo NextWorksheet
      ' Calculate Last Used Row and Column in current Source Worksheet.
      LastUR = .Cells.Find("*", , , , , 2).Row
      LastUC = .Cells.Find("*", , , , 2, 2).Column
      ' Copy current used range to Source Array.
      vntS = .Range(.Cells(cFirstR, cFirstC), .Cells(LastUR, LastUC))
    End With

    ' From Source Array to Count Array.

    ' Count Array cannot be bigger than Source Array.
    ReDim vntC(1 To UBound(vntS))
    k = 0 ' Reset Target Array Row Counter!!!
    For i = 1 To UBound(vntS) ' Rows
        For j = 1 To UBound(vntS, 2) ' Columns
            If vntS(i, j) = cSearch Then
                k = k + 1 ' Increase Target Array Row Counter.
                vntC(k) = i ' Write Source Array Row number to Count Array.
                Exit For ' Stop checking as soon as found.
            End If
        Next
    Next
    ReDim Preserve vntC(1 To k) ' Resize Count Array (make it smaller).

    ' From Source Array to Target Array.

    ' Resize Target Array to the Count Array rows and Source Array columns.
    ReDim vntT(1 To k, 1 To j)
    For i = 1 To k ' Rows
        For j = 1 To UBound(vntS, 2) ' Columns
            vntT(i, j) = vntS(vntC(i), j) ' Write to Target Array.
        Next
    Next

    ' From Target Array to Target Range.

    With ThisWorkbook.Worksheets(cMaster)
      ' Calculate Target Last Used Row Number.
      If Not .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
              Is Nothing Then LastR = .Cells.Find("*", , , , , 2).Row
      ' Copy Target Array to Target Range.
      .Cells(LastR + 1, cFirstC).Resize(UBound(vntT), UBound(vntT, 2)) = vntT
    End With

NextWorksheet:
  Next

End Sub
0
ответ дан VBasic2008 18 January 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: