В нем список клиентов и сумма, которую оплатил каждый клиент Из программы отчет выгружается криво, делает разбивку по счетам клиентов и в итоге вместо того чтобы видеть сколько (например за 6 мес) оплатил 1 клиент, я вижу 4 строки с одним и тем же клиентом https://yadi.sk/i/JkF2hkeQLC0_Wg (руками нереально все списки суммировать)
Необходимо объединить данные таким образом, чтобы имя клиента не повторялось в отчете, и при этом все данные по нему суммировались в 1 строку с его именем Также необходимо отделить нумерацию списка от наименования клиента
Подскажите, как такое сделать плз Заранее благодарен!
Ну, если текст как числа преобразовать в числа (заменить неразрывные пробелы и пробелы на пусто, точку на запятую), плюс, регулярками вытащить наименование клиента, то потом можно простой сводной подбить суммы.
Sub iRead()
Dim a&, txt$, t$, arr(), b&, c%, t1$, ArrF(), x%
a = 1
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False: .Show
t = .SelectedItems(1)
End With
If Len(t) = 0 Then Exit Sub
Open t For Input As #a
Do
Line Input #a, txt
txt = Replace(txt, Chr(34), "")
If Left(txt, 1) Like "#" Then
b = b + 1: ReDim Preserve arr(1 To b): c = 1: t1 = ""
Do While Mid$(txt, c, 1) Like "#"
t1 = t1 & Mid$(txt, c, 1): c = c + 1
Loop
'If Mid$(txt, c, 1) = "w" Then c = c + 1
txt = t1 & ";" & Mid$(txt, c)
arr(b) = Split(txt, ";"): t1 = arr(b)(UBound(arr(b))): t = ""
If InStr(t1, ".") Then t1 = Left$(t1, InStr(t1, ".") - 1)
For x = 1 To Len(t1)
If Mid$(t1, x, 1) Like "#" Then t = t & Mid$(t1, x, 1)
Next
If Len(t) > 0 Then arr(b)(UBound(arr(b))) = CDbl(t)
End If
Loop Until EOF(a)
Close #a
ReDim ArrF(1 To b, 1 To UBound(arr(1)) + 1)
For a = 1 To b
For b = 1 To UBound(ArrF, 2)
If b - 1 <= UBound(arr(a)) Then ArrF(a, b) = arr(a)(b - 1)
Next
Next
[A:F].Clear
With [A1].Resize(UBound(ArrF), UBound(ArrF, 2))
.Value = ArrF: .Borders.LineStyle = 1
End With
[A1].CurrentRegion.EntireColumn.AutoFit
End Sub
Андрей VG, в данном случае наверное не поможет Кроме Абдуллаевой (#3) там еще встречаются типа 3880Ярыгин Олег Иванович и 3881Ярыгин Олег Иванович, похоже, что нужно либо выгрузку настраивать, либо объяснять операторам по вводу данных, что у одного и того же клиента не должно быть разных имен
Anchoret, открывается пустой файл видимо к меня не хватает знаний что-то там настроить) то что выше написан код, я к сожалению не понимаю в этом ничего, даже не представляю куда его применять)) Если не сложно и это пояснимо, дайте комент плз
Наверное,я неправильно понял - из стартового сообщения понял так, что нужно сделать список клиентов (удалить дубликаты), и в строку напротив каждого вывести все значения, которые встречаются у этого клиента в исходной таблице, т.е. писать макрос. А наверное достаточно суммы
3395ФБГУ Центр Системы Мониторинга Рыболовства и Связи;4 100.000
ФГАУ УПРАВЛЕНИЕ ПО ОРГАНИЗАЦИИ И;
3396ПРОВЕДЕНИЮ СПОРТИВНЫХ МЕРОВПРИЯТИЙ;28 951.000
3397ФГАУ УПРАВЛЕНИЕ ПО ОРГАНИЗАЦИИ И;36 650.000
ФГАУ УПРАВЛЕНИЕ ПО ОРГАНИЗАЦИИ ИПРОВЕДЕНИЮ СПОРТИВНЫХ МЕРОВПРИЯТИЙ;
3398ПРОВЕДЕНИЮ СПОРТИВНЫХ МЕРОВПРИЯТИЙ;57 151.010
ФГАУ УПРАВЛЕНИЕ ПО ОРГАНИЗАЦИИ И;
3399ПРОВЕДЕНИЮ СПОРТИВНЫХ МЕРОВПРИЯТИЙ;40 332.000
3400ФГБОУ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО;289 815.000
ОБРАЗ.РОССИЙСКИЙ УНИВ-ТДРУЖБЫ НАРОДОВ;
3401РЫБОЛОВСТВА И СВЯЗИФГБУ ЦЕНТР СИСТЕМЫ МОНИТОРИНГА;34 315.000
Думаю, как её победить...
Да, и по кнопке в файле нужно выбрать файл *csv для выгрузки на лист. А приведенный выше макрос именно такие файлы и обрабатывает.
Пока вариант с суммированием по дублям в списке такой:
Скрытый текст
Код
Sub iRead()
Dim a&, txt$, t$, arr(), b&, c%, t1$, ArrF(), x%, DC As Object, dd1(), dd2(), tt$()
a = 1
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False: .Show
t = .SelectedItems(1)
End With
If Len(t) = 0 Then Exit Sub
Set DC = CreateObject("Scripting.Dictionary")
Open t For Input As #a
Do
Line Input #a, txt
txt = Replace(Replace(Replace(txt, Chr(34), ""), Chr(185), ";"), "w", "")
b = b + 1: ReDim Preserve tt(1 To b): tt(b) = txt
Loop Until EOF(a)
Close #a: b = 2: ReDim arr(1 To 2)
arr(1) = Array(tt(1), "", ""): arr(2) = Split(tt(4), ";")
For a = 5 To UBound(tt)
txt = tt(a)
If Left(txt, 1) Like "#" Then
b = b + 1: ReDim Preserve arr(1 To b): c = 1: t1 = ""
Do While Mid$(txt, c, 1) Like "#"
t1 = t1 & Mid$(txt, c, 1): c = c + 1
If b > 3 Then
If CLng(t1) - CLng(arr(b - 1)(0)) = 1 Then Exit Do
End If
Loop
txt = t1 & ";" & Mid$(txt, c): arr(b) = Split(txt, ";")
If UBound(arr(b)) < 2 Then arr(b) = Array(arr(b)(0), arr(b)(1), 0)
t1 = arr(b)(2): t1 = Replace(Replace(t1, ".", ","), Chr(160), "")
If Len(t1) > 0 Then arr(b)(2) = t1 Else arr(b)(2) = 0
If Not DC.exists(arr(b)(1)) Then
DC.Add arr(b)(1), CDbl(arr(b)(2))
Else: DC.Item(arr(b)(1)) = DC.Item(arr(b)(1)) + CDbl(arr(b)(2))
End If
End If
Next
ReDim ArrF(1 To DC.Count + 2, 1 To 3)
dd1 = DC.keys: dd2 = DC.items
ArrF(1, 1) = arr(1)(0): ArrF(2, 1) = arr(2)(0)
ArrF(2, 2) = arr(2)(1): ArrF(2, 3) = arr(2)(2)
For a = 3 To UBound(ArrF)
ArrF(a, 1) = a - 2: ArrF(a, 2) = dd1(a - 3): ArrF(a, 3) = dd2(a - 3)
Next
[A:C].Clear
With [A1].Resize(UBound(ArrF), UBound(ArrF, 2))
.Value = ArrF: .Borders.LineStyle = 1
End With
Intersect(Rows(1), Columns("A:C")).Merge
[A1].CurrentRegion.EntireColumn.AutoFit
Set DC = Nothing
End Sub