powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Код в VB - работа с массивом
6 сообщений из 6, страница 1 из 1
Код в VB - работа с массивом
    #34696809
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, решение одного вопроса: в файле А есть несколько рабочих листов, каждый из которых представляет счет. В другом файле (Б) указана номенклатура. Надо чтобы программа по номеру инвойса перенесла номера товара и кол-ва в файл Б. Особенность заключается в том, что в одном и том же счете может быть несколько строк по одному товару.
Еще одна закавыка - в структуре файла Б. Пример вложен. Надо чтобы программа не записала информацию поверх существующей и т.д.
Написал код, но не работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Sub Processing()
Dim i As Integer
Dim q As Integer
Dim z As Integer
Dim v As Integer
Dim component( 500 )
Dim qty( 500 )
Dim a As Integer
Dim НомерСчет As Long

НомерСчет = InputBox("Введите номер счета", "Входные данные", "O")

 

Windows("Инвойсы.xls").Activate
i = ActiveWorkbook.Worksheets.Count
Do

    q = q +  1 
    Worksheets(q).Select
Loop Until НомерСчета = Cells( 18 ,  3 ) Or q = i
    a = - 1 
    For r =  33  To  147 
    If Cells( 33 ,  2 ) <> "" Then
    a = a +  1 
    component(a) = Cells(r,  2 )
    qty(a) = Cells(r,  6 )
    End If
    Next r
    

 
   
    
    Windows("Поставки").Activate
    Sheets("Transit").Select
      
      l =  2 

For l =  2  To  2000 
 
     If Cells(l,  2 ) = component(j) Then
        If Cells(l,  1 ) <> "" Then
            If Cells(l,  6 ) = "" Then
                Cells(l,  8 ) = qty(a)
                Cells(l,  6 ) = НомерСчет
            End If
         End If
      End If
 l = l +  1 

Exit For
    
 
    l = l +  1 
Next
MsgBox "Обработка информации завершена!", vbExclamation

End Sub
Модератор:
используйте тег SRC для форматирования кода
...
Рейтинг: 0 / 0
Код в VB - работа с массивом
    #34697355
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хотите получить помощь, то приложите все файлы и опишите детально, как должна работать программа
...
Рейтинг: 0 / 0
Код в VB - работа с массивом
    #34706076
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо. Попробую разъяснить (кое-что уже сам сделал).
Есть два файла - в файл "Инвойсы" оператор вводит данные по товарам - номер детали и кол-во. Файл "Поставки" служит базой статистики и используется для накопления данных.
Трудность заключается в том - что в инвойсе могут быть несколько строчек по одному товару. Поставщика не убедить следовать правилу 1 товар = 1 строка в инвойсе.
У меня следующая идея - из файла "Поставки" запускаю макрос, который по номеру инвойса в файле "Инвойсы" находит нужный рабочий лист, потом по данным этого листа со строк 33 по 147 формирует массив данных (номер детали, кол-во), потом опять переходит в файл "Поставки", ищет по номеру детали нужную, проверяет есть ли в строке что-либо (если есть - строка занята, переходит на следующую), и вставляет данные - номер инвойса, дату и кол-во. Как же сделать чтобы несколько строк из массива данных посвященных одной детали вставлялись одной строкой, при том что кол-во суммировалось? Подскажите пожалуйста.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Sub Processing()

Dim i As Integer
Dim q As Integer
Dim z As Integer
Dim v As Integer
Dim component( 500 )
Dim qty( 500 )
Dim Invdate( 500 )
Dim a As Integer
Dim o As Integer
Dim НомерСчет As Long

НомерСчет = InputBox("Введите номер счета", "Входные данные", "O")

 

Windows("Инвойсы.xls").Activate
i = ActiveWorkbook.Worksheets.Count
Do

   q = q +  1 
   Worksheets(q).Select
Loop Until НомерСчет = Cells( 18 ,  3 ) Or q = i
   a = - 1 
    For r =  33  To  147 
    If Cells(r,  2 ) <> "" Then
    a = a +  1 
    component(a) = Cells(r,  2 )
    qty(a) = Cells(r,  6 )
    Invdate(a) = Cells( 17 ,  3 )
    End If
    Next r
    
   
    
    Windows("Поставки").Activate
    Sheets("Transit").Select
      
     l =  2 
    b =  0 
     
            
            For l =  2  To  2548 
 
              If Cells(l,  2 ) = component(b) And Cells(l,  1 ) <>  2  And Cells(l,  5 ) =  0  Then
            
              Cells(l,  8 ) = Cells(l,  8 ) + qty(b)
              Cells(l,  6 ) = НомерСчет
              Cells(l,  7 ) = Invdate(b)
              
              b = b +  1 
              End If
      
            Next
            
MsgBox "Обработка информации завершена!", vbExclamation

    

End Sub
...
Рейтинг: 0 / 0
Код в VB - работа с массивом
    #34706245
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно сделать по разному: сделать двумерный массив или использовать Dictionary и суммировать в нем по каждому ключу, т.е. номеру товара, а потом переносить уже суммированные значения.
А можно сначала составить массив номеров товаров, потом использовать функцию листа:
Код: plaintext
1.
2.
3.
    CurrentSum=Application.WorksheetFunction.SumIf( _
                        [диапазон с номерами деталей], _
                        [текущий номер детали],_
                        [соотв. диапазон количествами])
и в цикле для каждого товара расчитывать сумму и вносить одной строкй в "Поставки"

как использовать эту функцию - ищи в помощи самого Excel, а не VBA SumIf или СуммЕсли
...
Рейтинг: 0 / 0
Код в VB - работа с массивом
    #34706429
Admiral67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про двумерный массив можно по-подробней и на примере если это возможно?
...
Рейтинг: 0 / 0
Код в VB - работа с массивом
    #34707672
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Admiral67Про двумерный массив можно по-подробней и на примере если это возможно?Хотел сделать пример с двумерным массивом, очень трудоемко получается. Лучше с Dictionary:
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Код в VB - работа с массивом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]