Здравствуйте. Изучаю вба с нуля, мне необходимо посчитать сумму по годам (при этом дата выгружается в формате дата время) при условии, что статус зарегистрирован и так же сумму рядом при другом статусе, топорным способом где я указываю год у меня считает, но мне не обходимо переделать работу, я же не могу писть на все года формулы. Не могли бы вы мне помочь, файл прилагаю. Таблица должна выглять как на листе кторый добавляется автоматически (Год/Сумма/Акт Сумма)
Здравствуйте. Изучаю вба с нуля, мне необходимо посчитать сумму по годам (при этом дата выгружается в формате дата время) при условии, что статус зарегистрирован и так же сумму рядом при другом статусе, топорным способом где я указываю год у меня считает, но мне не обходимо переделать работу, я же не могу писть на все года формулы. Не могли бы вы мне помочь, файл прилагаю. Таблица должна выглять как на листе кторый добавляется автоматически (Год/Сумма/Акт Сумма)LOG
Sub Macro() Dim Wb As Workbook, Sh As Worksheet, A() Set Sh = ActiveSheet Set Wb = Sh.Parent LastRow = Sh.Cells(Sh.Rows.Count, "C").End(xlUp).Row Set List = CreateObject("scripting.dictionary") dx = Sh.Range("C1:G" & LastRow) For n = 2 To UBound(dx) Key = Year(CDate(dx(n, 5))) Total = Val(Replace(dx(n, 1), ",", ".")) reg = 0 If dx(n, 4) = "Зарегистрирован" Then reg = Total End If If List.Exists(Key) Then A = List.Item(Key) A(1) = A(1) + Total A(2) = A(2) + reg List.Item(Key) = A Else List.Item(Key) = Array(Key, Total, reg) End If Next
Wb.Worksheets.Add After:=Wb.Worksheets(Wb.Worksheets.Count) Set Sh = Wb.Worksheets(Wb.Worksheets.Count) Sh.Range("B1").Value = "ВЕСЬ ДОХОД" Sh.Range("C1").Value = "АКТ ДОХОД" Sh.Range("A1").Value = "ГОД" Items = List.Items For n = 0 To List.Count - 1 Item = Items(n) Sh.Cells(n + 2, 1).Resize(1, 3) = Item Next End Sub
[/vba]
Здравствуйте[vba]
Код
Sub Macro() Dim Wb As Workbook, Sh As Worksheet, A() Set Sh = ActiveSheet Set Wb = Sh.Parent LastRow = Sh.Cells(Sh.Rows.Count, "C").End(xlUp).Row Set List = CreateObject("scripting.dictionary") dx = Sh.Range("C1:G" & LastRow) For n = 2 To UBound(dx) Key = Year(CDate(dx(n, 5))) Total = Val(Replace(dx(n, 1), ",", ".")) reg = 0 If dx(n, 4) = "Зарегистрирован" Then reg = Total End If If List.Exists(Key) Then A = List.Item(Key) A(1) = A(1) + Total A(2) = A(2) + reg List.Item(Key) = A Else List.Item(Key) = Array(Key, Total, reg) End If Next
Wb.Worksheets.Add After:=Wb.Worksheets(Wb.Worksheets.Count) Set Sh = Wb.Worksheets(Wb.Worksheets.Count) Sh.Range("B1").Value = "ВЕСЬ ДОХОД" Sh.Range("C1").Value = "АКТ ДОХОД" Sh.Range("A1").Value = "ГОД" Items = List.Items For n = 0 To List.Count - 1 Item = Items(n) Sh.Cells(n + 2, 1).Resize(1, 3) = Item Next End Sub
doober, более менее поняла. А можете подсказать вот это [vba]
Код
If List.Exists(Key) Then A = List.Item(Key) A(1) = A(1) + Total A(2) = A(2) + reg List.Item(Key) = A Else List.Item(Key) = Array(Key, Total, reg) End If
[/vba] и почему тут -1 [vba]
Код
For n = 0 To List.Count - 1
[/vba]
doober, более менее поняла. А можете подсказать вот это [vba]
Код
If List.Exists(Key) Then A = List.Item(Key) A(1) = A(1) + Total A(2) = A(2) + reg List.Item(Key) = A Else List.Item(Key) = Array(Key, Total, reg) End If
Своими словами, это проверка наличия ключа в словаре.Если словарь содержит ключ, то делаем следующее. Извлекаем массив по ключу, суммируем значения и обратно в словарь. Иначе по новому ключу добавляем новый массив Array(Key, Total, reg)
Своими словами, это проверка наличия ключа в словаре.Если словарь содержит ключ, то делаем следующее. Извлекаем массив по ключу, суммируем значения и обратно в словарь. Иначе по новому ключу добавляем новый массив Array(Key, Total, reg)doober
- и вот как раз сейчас в этой задаче изучаете то, что покроет 90% практических потребностей. Разберите все детали, можете сохранить код как образец. Тут цикл, двумерный массив с листа, и одномерный массив, и словарь, и массив в словаре, осталось ещё коллекцию в словаре посмотреть, и выгрузку двумерного массива на лист (выгрузка одномерного тут тоже уже есть). В итем словаря когда он не массив можно собирать сумму прямо в словаре. Как и пополнять коллекцию. Ну может ещё Select Case True из нужного посмотреть. И всё ))
- и вот как раз сейчас в этой задаче изучаете то, что покроет 90% практических потребностей. Разберите все детали, можете сохранить код как образец. Тут цикл, двумерный массив с листа, и одномерный массив, и словарь, и массив в словаре, осталось ещё коллекцию в словаре посмотреть, и выгрузку двумерного массива на лист (выгрузка одномерного тут тоже уже есть). В итем словаря когда он не массив можно собирать сумму прямо в словаре. Как и пополнять коллекцию. Ну может ещё Select Case True из нужного посмотреть. И всё ))Hugo