Объединение листов Excel с использованием VBA - PullRequest
2 голосов
/ 23 октября 2008

У меня есть лист Excel (например, OG.xls), в котором уже есть некоторые данные, с 5000 строк с заголовками в первой строке и до столбцов "AN". Это количество строк (5000) не меняется в течение всего года. Теперь у меня есть 5 файлов XL (скажем, A, B, C, D, E), и данные из этих файлов должны добавляться в этот файл OG, начиная с 5001-й строки каждый раз. Все эти 5 файлов имеют разные столбцы, но идентичны файлам OG. Я должен извлечь данные из этих файлов и поместить их в файл OG. Из файла A: столбцы A, B, C, D, E, F, G & H переходят в столбец F, G, T, U, V, W, X и Y файла OG.xls. Аналогичным образом данные других файлов должны быть извлечены в соответствии с соответствующим столбцом с OG.xls

Данные второго файла должны быть добавлены прямо под следующей строкой, где заканчивается файл A. (Скажем, после заполнения данных из файла A теперь OG.xls имеет 5110 строк, Данные файла B должны быть заполнены из 5111-й строки OG.xls. То же самое относится и к другим файлам. Данные этих 5 файлов должны быть заполнены строка за строкой, но столбцы должны соответствовать столбцам OG.xls

Каждый раз одна и та же операция повторяется путем заполнения данных из 5001-й строки OG.xls. Для удобства мы можем хранить все эти файлы в одной папке.

Как мы можем это сделать.

Пожалуйста, помогите мне в этом !!! Также дайте мне знать для любых разъяснений.

Ответы [ 3 ]

1 голос
/ 23 октября 2008

Почему столбец A заканчивается в столбце F, а почему C - в T? Есть ли какое-то правило, например, что первая строка - это заголовок с тем же текстом?

Может быть, картинка может помочь.

Исходя из того, что я могу догадаться, я бросил бы каждый лист в RecordSet со значимыми именами полей (вам нужно будет ссылаться на Microsoft ActiveX Data Objects 2.8 Library). После этого будет очень легко добавить каждый набор записей и выбросить их в один лист.

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

Редактировать ...

Ниже приведен пример того, как вы можете делать то, что вам нужно в VBA. Дьявол кроется в деталях, таких как пустые листы, и как обращаться с формулами (это полностью их игнорирует), и как правильно объединить столбцы (снова игнорируется).

Это было проверено в Excel 2007.

Option Explicit
Const MAX_CHARS = 1200



Sub MergeAllSheets()
  Dim rs As Recordset
  Dim mergedRS As Recordset
  Dim sh As Worksheet
  Dim wb As Workbook

  Dim fieldList As New Collection
  Dim rsetList As New Collection

  Dim f As Variant
  Dim cols As Long
  Dim rows As Long
  Dim c As Long
  Dim r As Long

  Dim ref As String
  Dim fldName As String
  Dim sourceColumn As String



  Set wb = ActiveWorkbook
  For Each sh In wb.Worksheets
    Set rs = New Recordset
    ref = FindEndCell(sh)
    cols = sh.Range(ref).Column
    rows = sh.Range(ref).Row

    If ref <> "$A$1" Or sh.Range(ref).Value <> "" Then '' This is to catch empty sheet
      c = 1
      r = 1
      Do While c <= cols
        fldName = sh.Cells(r, c).Value
        rs.Fields.Append fldName, adVarChar, MAX_CHARS
        If Not InCollection(fieldList, fldName) Then
          fieldList.Add fldName, fldName
        End If
        c = c + 1
      Loop
      rs.Open


      r = 2
      Do While r <= rows
        rs.AddNew
        c = 1
        Do While c <= cols
          rs.Fields(c - 1) = CStr(sh.Cells(r, c).Value)
          c = c + 1
        Loop
        r = r + 1
        Debug.Print sh.Name & ": " & r & " of " & rows & ", " & c & " of " & cols
      Loop
      rsetList.Add rs, sh.Name
    End If
  Next


  Set mergedRS = New Recordset
  c = 1
  sourceColumn = "SourceSheet"
  Do While InCollection(fieldList, sourceColumn) '' Just in case you merge a merged sheet
    sourceColumn = "SourceSheet" & c
    c = c + 1
  Loop
  mergedRS.Fields.Append sourceColumn, adVarChar, MAX_CHARS
  For Each f In fieldList
    mergedRS.Fields.Append CStr(f), adVarChar, MAX_CHARS
  Next
  mergedRS.Open

  c = 1
  For Each rs In rsetList
    If rs.RecordCount >= 1 Then
      rs.MoveFirst
      Do Until rs.EOF
        mergedRS.AddNew
        mergedRS.Fields(sourceColumn) = "Sheet No. " & c
        For Each f In rs.Fields
          mergedRS.Fields(f.Name) = f.Value
        Next
        rs.MoveNext
      Loop
    End If
    c = c + 1
  Next


  Set sh = wb.Worksheets.Add

  mergedRS.MoveFirst
  r = 1
  c = 1
  For Each f In mergedRS.Fields
    sh.Cells(r, c).Formula = f.Name
    c = c + 1
  Next

  r = 2
  Do Until mergedRS.EOF
    c = 1
    For Each f In mergedRS.Fields
      sh.Cells(r, c).Value = f.Value
      c = c + 1
    Next
    r = r + 1
    mergedRS.MoveNext
  Loop
End Sub

Public Function InCollection(col As Collection, key As String) As Boolean
  Dim var As Variant
  Dim errNumber As Long

  InCollection = False
  Set var = Nothing

  Err.Clear
  On Error Resume Next
    var = col.Item(key)
    errNumber = CLng(Err.Number)
  On Error GoTo 0

  '5 is not in, 0 and 438 represent incollection
  If errNumber = 5 Then ' it is 5 if not in collection
    InCollection = False
  Else
    InCollection = True
  End If

End Function


Public Function FindEndCell(sh As Worksheet) As String
  Dim cols As Long
  Dim rows As Long
  Dim maxCols As Long
  Dim maxRows As Long
  Dim c As Long
  Dim r As Long

  maxRows = sh.rows.Count
  maxCols = sh.Columns.Count

  cols = sh.Range("A1").End(xlToRight).Column
  If cols >= maxCols Then
      cols = 1
  End If


  c = 1
  Do While c <= cols

    r = sh.Cells(1, c).End(xlDown).Row
    If r >= maxRows Then
      r = 1
    End If

    If r > rows Then
      rows = r
    End If
    c = c + 1
  Loop

  FindEndCell = sh.Cells(rows, cols).Address

End Function
1 голос
/ 23 октября 2008

Если вам нужен более точный ответ, вам сначала нужно что-то попробовать, а затем попросить помощи в области, где вы застряли. Мое предложение, вы начинаете с; 1. Начните писать сценарий VBA в OG.XLS, в качестве первого шага попробуйте получить доступ к файлу A.xls, прочитать столбцы и вставить их (они могут изначально находиться в любом месте в любом порядке). 2. Как только вы сможете это сделать, следующим шагом будет посмотреть, поместите ли вы данные в правильный столбец (скажем, 5000 в вашем примере), установив правильные переменные, используя их и увеличивая их. 3. Ваш следующий шаг должен состоять в том, чтобы прочитать заголовки столбцов в A.XLS и найти их OG.XLS и идентифицировать их. Первоначально вы можете начать с простого сравнения строк, затем вы можете уточнить это, чтобы сделать VLOOKUP. 4. Если во время этого процесса вы столкнетесь с какой-либо конкретной проблемой, поднимите ее, чтобы получить лучший ответ.

Мало кто из сообщества пойдет на то, чтобы написать весь код для вас.

0 голосов
/ 23 сентября 2010

Я столкнулся с этой проблемой, когда один из моих клиентов пришел ко мне в поисках решения для объединения своих списков акций, которые сохранены в более чем 200 отдельных файлах. Если вы оказались в том же положении, что и мой клиент; не волнуйтесь, я написал простую программу, которая делает эту работу. :) Проверьте ссылку ниже:

JMC Excel - объединение, объединение, объединение нескольких листов Excel или рабочих книг Excel

С уважением, JeeShen Lee www.jeeshenlee.wordpress.com

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