Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Код в VB - работа с массивом / 6 сообщений из 6, страница 1 из 1
31.07.2007, 21:03:00
    #34696809
Admiral67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в VB - работа с массивом
Подскажите пожалуйста, решение одного вопроса: в файле А есть несколько рабочих листов, каждый из которых представляет счет. В другом файле (Б) указана номенклатура. Надо чтобы программа по номеру инвойса перенесла номера товара и кол-ва в файл Б. Особенность заключается в том, что в одном и том же счете может быть несколько строк по одному товару.
Еще одна закавыка - в структуре файла Б. Пример вложен. Надо чтобы программа не записала информацию поверх существующей и т.д.
Написал код, но не работает.
Код: 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
01.08.2007, 10:50:45
    #34697355
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в VB - работа с массивом
если хотите получить помощь, то приложите все файлы и опишите детально, как должна работать программа
...
Рейтинг: 0 / 0
05.08.2007, 13:34:29
    #34706076
Admiral67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в VB - работа с массивом
Хорошо. Попробую разъяснить (кое-что уже сам сделал).
Есть два файла - в файл "Инвойсы" оператор вводит данные по товарам - номер детали и кол-во. Файл "Поставки" служит базой статистики и используется для накопления данных.
Трудность заключается в том - что в инвойсе могут быть несколько строчек по одному товару. Поставщика не убедить следовать правилу 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
05.08.2007, 16:04:48
    #34706245
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Код в VB - работа с массивом
можно сделать по разному: сделать двумерный массив или использовать Dictionary и суммировать в нем по каждому ключу, т.е. номеру товара, а потом переносить уже суммированные значения.
А можно сначала составить массив номеров товаров, потом использовать функцию листа:
Код: plaintext
1.
2.
3.
    CurrentSum=Application.WorksheetFunction.SumIf( _
                        [диапазон с номерами деталей], _
                        [текущий номер детали],_
                        [соотв. диапазон количествами])
и в цикле для каждого товара расчитывать сумму и вносить одной строкй в "Поставки"

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


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