Если кратенько. Есть статистика за несколько лет, собраная в книгах (срезы за период). Её необходимо обработать, для этого нужно объединять несколько книг в одну. Часть данных переносится (типа "название" и т.п.), часть суммируется(сумма). Проблема в том что эксель 2003. И просто собрать данные на 1 лист я не могу. делаю следующее:
1. Открываю книги по очереди
2. Лист в массив загоняется
3. Массив обрабатывается, в результате имеем динамический массив с невыясненым кол-вом элементов
4. Эти массивы объединяются в один и вставляются в книгу. И тут желательно, чтобы пустых строк не было, т.к. не влезет и некрасиво.
Файл прилагаю. Его можно размножить (копированием) и посмотреть итог. код:
Sub массив3()
Dim aa(), bb() As Variant, cc() As Variant, dd(), ee(), gg(), hh(), ll(), a%, b%, c%, e%, f%, g%, h%
ReDim dd(1 To 1000, 1 To 4)
h = 1
With Application
v = .GetOpenFilename("Excel Files (*.xl*),*.xl*,All Files (*.*),*.*", , "Выберите файлы", , True)
If Not IsArray(v) Then Exit Sub
.EnableEvents = False
.ScreenUpdating = False
.DisplayAlerts = False
For Each x In v
Application.Workbooks.Open (x)
d = 1
aa = [a1].CurrentRegion.Value
cc = [a1].CurrentRegion.Value
ReDim bb(1 To UBound(aa), 1 To 4)
For a = LBound(aa) To UBound(aa)
For b = a + 1 To UBound(aa)
If aa(a, 1) = aa(b, 1) And aa(a, 2) = aa(b, 2) Then aa(b, 1) = ""
Next b
Next a
For c = LBound(aa) To UBound(aa)
If aa(c, 1) <> "" Then: bb(d, 1) = aa(c, 1): bb(d, 2) = aa(c, 2): d = d + 1
Next c
For e = LBound(bb) To UBound(bb)
For f = LBound(cc) To UBound(cc)
If (bb(e, 1) = cc(f, 1)) And (bb(e, 2) = cc(f, 2)) Then bb(e, 3) = cc(f, 3): bb(e, 4) = bb(e, 4) + cc(f, 4)
Next f
Next e
ActiveWorkbook.Save
ActiveWorkbook.Close
.Workbooks.Add
[a1:d1].Resize(UBound(bb)) = bb
ee = [a1].CurrentRegion.Value
ActiveWorkbook.Close
For g = LBound(ee) To UBound(ee)
dd(h, 1) = ee(g, 1)
dd(h, 2) = ee(g, 2)
dd(h, 3) = ee(g, 3)
dd(h, 4) = ee(g, 4)
h = h + 1
Next g
Next
.Workbooks.Add
[a1:d1].Resize(UBound(dd)) = dd
d5 = 1
gg = [a1].CurrentRegion.Value
ll = [a1].CurrentRegion.Value
ReDim hh(1 To UBound(gg), 1 To 4)
For a5 = LBound(gg) To UBound(gg)
For b5 = a5 + 1 To UBound(gg)
If gg(a5, 1) = gg(b5, 1) And gg(a5, 2) = gg(b5, 2) Then gg(b5, 1) = ""
Next b5
Next a5
For c5 = LBound(gg) To UBound(gg)
If gg(c5, 1) <> "" Then: hh(d5, 1) = gg(c5, 1): hh(d5, 2) = gg(c5, 2): d5 = d5 + 1
Next c5
For e5 = LBound(hh) To UBound(hh)
For f5 = LBound(ll) To UBound(ll)
If (hh(e5, 1) = ll(f5, 1)) And (hh(e5, 2) = ll(f5, 2)) Then hh(e5, 3) = ll(f5, 3): hh(e5, 4) = hh(e5, 4) + ll(f5, 4)
Next f5
Next e5
.Workbooks.Add
[a1:d1].Resize(UBound(hh)) = hh
End With
End Sub