Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2010, 13:09   #1
kzld
Форумчанин
 
Регистрация: 24.01.2009
Сообщений: 625
По умолчанию Макрос, вытащить данные и расставить по местам

Имеем вот такой макрос
Код:
Public Sub materialykredit01()
    Dim Sht1 As Worksheet, Sht2 As Worksheet, flag As Boolean
    For Each Sht1 In Workbooks("Materialy_2009_add203.xlsm").Worksheets 'это файл Materialy_2009_add203.xlsm
        flag = False 'false если неправильно
        For Each Sht2 In Workbooks("allwork_2009_year.xlsm").Worksheets 'это файл allwork_2009_year.xlsm
            If Sht2.Name = Sht1.Name Then 'это сооветствие имён листов в книгах
                flag = True 'true - правильно
                Exit For 'выход
            End If
            Next 'следующий
        If flag Then 'если флаг then (затем) тогда
            Sht1.Range("J8:K655").ClearContents 'очищаем предыдущие значения
            For I = 3 To 5000 'просматриваем файл "allwork_2009_year.xlsm" от 3 строки до 5000
                If Sht2.Cells(I, 5).Value = 202 And Sht2.Cells(I, 7).Value <> "" Then 'просматриваем столбец 5 "allwork_2009_year.xlsm" КРЕДИТ ищем 202, просматриваем столбец 7 дата
                    For k = 8 To 655 'ищем в кассе совпадение даты
                        If Sht1.Cells(k, 10).Value = 0 And Sht1.Cells(k, 1).Value = Sht2.Cells(I, 7).Value Then 'если в кассе КРЕДИТ НАИМЕНОВАНИЕ пусто, смотрим кассу столбец 1 дата, если совпадает тогда
                           Sht1.Cells(k, 10).Value = Sht2.Cells(I, 12).Value 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 12 наименование, копируем из работы в кассу
                           Sht1.Cells(k, 11).Value = Sht2.Cells(I, 8).Value 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 8 сумма, копируем из работы в кассу
                Exit For
                End If
                    Next k
                End If
            Next I
        End If
    Next
End Sub
Суть работы макроса
просматриваем файл allwork_2009_year.xlsm ищем в 5 столбце значение равное 202. Смотрим этот же файл столбец 7 - это дата, запоминаем. Переходим в файл Materialy_2009_add203.xlsm просматриваем столбец 1 - это тоже дата, находим соответствие. Смотрим по строке столбец 10, если пусто вставляем значением из столбца 12 файла allwork_2009_year.xlsm . Если не пусто, спускаемся на строку ниже, если пусто - вставляем, если нет - спускаемся ещё на строку вниз.

Так вот , желаю добавить ещё одно условие.
Кроме поиска значения 202 в файле allwork_2009_year.xlsm , осуществить поиск значения 203
kzld вне форума Ответить с цитированием
Старый 03.11.2010, 13:15   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Пример бы увидеть...
На массивах аналогичный код будет работать в 38 раз быстрее.
Но правда если в промежутке на листе нужны формулы - массивы не годятся.
Кроме того, можно сделать код на Find - я тут недавно alexey_nv86 примеры приводил
http://www.programmersforum.ru/showthread.php?t=119802
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.11.2010, 13:31   #3
kzld
Форумчанин
 
Регистрация: 24.01.2009
Сообщений: 625
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Пример бы увидеть...
На массивах аналогичный код будет работать в 38 раз быстрее.
Интересно. Подскажите с чего начать.
А вот и пример
Вложения
Тип файла: rar macros_raznos.rar (416.7 Кб, 28 просмотров)
kzld вне форума Ответить с цитированием
Старый 03.11.2010, 15:14   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Только заменил обращение к листу на массив (ну и пересчёт перенёс в конец):
Код:
Public Sub materialykredit0_2()
Dim tm
tm = Timer
    Dim Sht1 As Worksheet, Sht2 As Worksheet, flag As Boolean
    Dim a, b
    Application.Calculation = xlCalculationManual
    
    For Each Sht1 In Workbooks("Materialy_2009_add203.xlsm").Worksheets 'это файл Materialy_2009_add203.xlsm
        flag = False 'false если неправильно
        For Each Sht2 In Workbooks("allwork_2009_year.xlsm").Worksheets 'это файл allwork_2009_year.xlsm
            If Sht2.Name = Sht1.Name Then 'это сооветствие имён листов в книгах
                flag = True 'true - правильно
                Exit For 'выход
            End If
            Next 'следующий
        If flag Then 'если флаг then (затем) тогда
            Sht1.Range("J8:K655").ClearContents 'очищаем предыдущие значения
            a = Range(Sht1.Cells(8, 10), Sht1.Cells(655, 11))
            aa = Range(Sht1.Cells(8, 1), Sht1.Cells(655, 1))
            b = Range(Sht2.Cells(3, 5), Sht2.Cells(5000, 12))
            For i = 1 To UBound(b)
                If b(i, 1) = 202 Then
                If b(i, 3) <> "" Then 'просматриваем столбец 5 "allwork_2009_year.xlsm" КРЕДИТ ищем 202, просматриваем столбец 7 дата
                For k = 1 To UBound(a) 'ищем в кассе совпадение даты
                    If a(k, 1) = 0 Then
                    If aa(k, 1) = b(i, 3) Then 'если в кассе КРЕДИТ НАИМЕНОВАНИЕ пусто, смотрим кассу столбец 1 дата, если совпадает тогда
                           a(k, 1) = b(i, 8) 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 12 наименование, копируем из работы в кассу
                           a(k, 2) = b(i, 4) 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 8 сумма, копируем из работы в кассу
                           Exit For
                    End If
                    End If
                Next k
                End If
                End If
            Next i
            Range(Sht1.Cells(8, 10), Sht1.Cells(655, 11)) = a
        End If
    Next
Application.Calculation = xlCalculationAutomatic
Debug.Print Timer - tm
End Sub
Разница по времени не 38 раз, вероятно потому, что там не 5000-3 внутренних цикла, а только 48:
1.296875
0.21875
1.296875
0.265625

Отключил это условие - массивы отработали за 29 секунд, Ваш код 822:
29.23438
822.2539

Забыл про главный вопрос:
If (Sht2.Cells(i, 5).Value = 202 Or Sht2.Cells(i, 5).Value = 203) And Sht2.Cells(i, 7).Value <> "" Then 'просматриваем столбец 5 "allwork_2009_year.xlsm" КРЕДИТ ищем 202, просматриваем столбец 7 дата
скобки можно не ставить, но так понятнее.
Или в моём коде
If b(i, 1) = 202 Or b(i, 1) = 203 Then

или через Select Case:
Код:
            For i = 1 To UBound(b)
            Select Case b(i, 1)
                Case 202, 203
                If b(i, 3) <> "" Then 'просматриваем столбец 5 "allwork_2009_year.xlsm" КРЕДИТ ищем 202, просматриваем столбец 7 дата
                For k = 1 To UBound(a) 'ищем в кассе совпадение даты
                    If a(k, 1) = 0 Then
                    If aa(k, 1) = b(i, 3) Then 'если в кассе КРЕДИТ НАИМЕНОВАНИЕ пусто, смотрим кассу столбец 1 дата, если совпадает тогда
                           a(k, 1) = b(i, 8) 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 12 наименование, копируем из работы в кассу
                           a(k, 2) = b(i, 4) 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 8 сумма, копируем из работы в кассу
                           Exit For
                    End If
                    End If
                Next k
                End If
            End Select
            Next i
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 03.11.2010 в 15:55.
Hugo121 вне форума Ответить с цитированием
Старый 03.11.2010, 16:07   #5
kzld
Форумчанин
 
Регистрация: 24.01.2009
Сообщений: 625
По умолчанию

Спасибо за ответ, однако небольшая просьба.
Соедините Ваш макрос с Вашими же дополнениями, чтобы выбирались значения и 202 и 203
kzld вне форума Ответить с цитированием
Старый 03.11.2010, 16:10   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Но проверьте внимательно результат.
Код:
Public Sub materialykredit0()
    Dim Sht1 As Worksheet, Sht2 As Worksheet, flag As Boolean
    Dim a, aa, b
    Application.Calculation = xlCalculationManual
    
    For Each Sht1 In Workbooks("Materialy_2009_add203.xlsm").Worksheets 'это файл Materialy_2009_add203.xlsm
        flag = False 'false если неправильно
        For Each Sht2 In Workbooks("allwork_2009_year.xlsm").Worksheets 'это файл allwork_2009_year.xlsm
            If Sht2.Name = Sht1.Name Then 'это сооветствие имён листов в книгах
                flag = True 'true - правильно
                Exit For 'выход
            End If
            Next 'следующий
        If flag Then 'если флаг then (затем) тогда
            Sht1.Range("J8:K655").ClearContents 'очищаем предыдущие значения
            a = Range(Sht1.Cells(8, 10), Sht1.Cells(655, 11))
            aa = Range(Sht1.Cells(8, 1), Sht1.Cells(655, 1))
            b = Range(Sht2.Cells(3, 5), Sht2.Cells(5000, 12))
            For i = 1 To UBound(b)
            Select Case b(i, 1)
                Case 202, 203
                If b(i, 3) <> "" Then 'просматриваем столбец 5 "allwork_2009_year.xlsm" КРЕДИТ ищем 202, просматриваем столбец 7 дата
                For k = 1 To UBound(a) 'ищем в кассе совпадение даты
                    If a(k, 1) = 0 Then
                    If aa(k, 1) = b(i, 3) Then 'если в кассе КРЕДИТ НАИМЕНОВАНИЕ пусто, смотрим кассу столбец 1 дата, если совпадает тогда
                           a(k, 1) = b(i, 8) 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 12 наименование, копируем из работы в кассу
                           a(k, 2) = b(i, 4) 'если в кассе КРЕДИТ наименование пусто, смотрим в работу столбец 8 сумма, копируем из работы в кассу
                           Exit For
                    End If
                    End If
                Next k
                End If
            End Select
            Next i
            Range(Sht1.Cells(8, 10), Sht1.Cells(655, 11)) = a
        End If
    Next
Application.Calculation = xlCalculationAutomatic
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.11.2010, 16:16   #7
kzld
Форумчанин
 
Регистрация: 24.01.2009
Сообщений: 625
По умолчанию

Первое испытание - полёт нормальный
Спасибо
kzld вне форума Ответить с цитированием
Старый 03.11.2010, 18:03   #8
kzld
Форумчанин
 
Регистрация: 24.01.2009
Сообщений: 625
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Но проверьте внимательно результат.
Код:
  вырезано
И ещё прошу помощи.
Какие значения надо изменить в макросе, что-бы из файла allwork_2009_year.xlsm бралось значение не 12 а 23 столбца
kzld вне форума Ответить с цитированием
Старый 03.11.2010, 18:06   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вот это
b = Range(Sht2.Cells(3, 5), Sht2.Cells(5000, 12))
значит, что берём в массив с 5-ого по 12-ый столбец, но в массиве они будут с 1-го по 8-й элемент.
Вот исходя из этого и меняйте размер и соответственно всюду обращение к элементам массива.
Можно отдельно создать массив именно только для 23-го столбца, как я сделал массив aa для дат.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 03.11.2010, 21:06   #10
kzld
Форумчанин
 
Регистрация: 24.01.2009
Сообщений: 625
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Вот это
b = Range(Sht2.Cells(3, 5), Sht2.Cells(5000, 12))
значит, что берём в массив с 5-ого по 12-ый столбец, но в массиве они будут с 1-го по 8-й элемент.
Вот исходя из этого и меняйте размер и соответственно всюду обращение к элементам массива.
Можно отдельно создать массив именно только для 23-го столбца, как я сделал массив aa для дат.
Два часа просидел, но так и не смог добиться желаемого результата.
Я только начинаю изучать VB. Всё же попрошу Вас помочь мне, вытащитьзначение 23 столбца, вместо 12
kzld вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вытащить данные из бинарного файла Sanprof Общие вопросы Delphi 21 25.06.2010 10:37
Как "вытащить" данные из 1С 7.07.1 Феска БД в Delphi 2 18.03.2009 23:39
Вытащить данные из MySQL Droid PHP 3 22.12.2008 23:23
Помогите вытащить из строки нужные данные! Romashkaz Общие вопросы C/C++ 0 22.11.2008 13:30
Как вытащить данные из Excel в бд dephi, а потом (после работы с данными) сформировать новый файл excel. Геля БД в Delphi 1 10.04.2007 15:11