Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, нет, не нужно. в массив должны попасть только заполненные строки.

а вставку на лист 000 делать по размеру выделенного диапазона.  
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Цитата
написал:
Если Вы серьезно намерены заниматься VBA
Было время, когда нужно было передать один проект под себя, очень увлекся vba. Потом заглохло. Сейчас по воспоминаниям пытаюсь решить единичную задачу. Но получается, что знаний не достаточно.
Цитата
написал:
Вы можете приложить весь переработанный код
Да, конечно.
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, я попробовал, ошибки не появляется. А как увидеть, что попадает в массив?

UPD/
после ошибки пошел в дебаг, в
Код
  arr = .Range(ColSearch.Address(0, 0, xlA1)).Value
отображается выбранный диапазон, например B5:B20. А ошибка появляется в
Код
With Worksheets("000")
  arr = .Range(ColSearch.Address(0, 0, xlA1)).Value
  For I = LBound(arr, 1) To UBound(arr, 1)
    If iDic.Exists(arr(I, 1)) Then
--->> arr(I, 2) = iDic(arr(I, 1))
    End If
  Next
  .Range("C5").Resize(UBound(arr, 1)) = Application.Index(arr, 0, 2)
End With

как понять, что он хочет?

subscript out of range, индекс за пределами диапазона...

Изменено: trovial - 07.12.2023 04:35:25
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, то есть можно ограничиться ?
Код
arr = .Range(ColSearch.Address(0, 0, xlA1)).Value
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
МатросНаЗебре, это первый элемент массива?
первую координату последнего элемента можно получить через номер последней строки из выделенной области в ColSearch, а вторую через через номер столбца  ColSearch (переменная iCSc) с добавлением смещения для вставки данных (переменная iOPc)?
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, извините, но можете еще подсказать?
вот здесь
Код
With Worksheets("000")
  arr = .Range("B5:C" & .Cells(.Rows.Count, "B").End(xlUp).Row).Value
на листе 000 переопределяются границы массива?
если так, то получается первый элемент массива можем получить из
Код
Set ColSearch = Application.InputBox("Выберите столбец для поиска:", Type:=8)
iCSc = ColSearch.Column 'номер столбца искомых данных
iCSr = ColSearch.Rows 'номер столбца искомых данных
...
With Worksheets("000")
  arr = .Range(iCSc&iCSr 
?
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, подход с применением формы ввода данных и/или выбора диапазона выбран по причине возможного использования данного макроса не только мной.
Если углубиться в суть вопроса и откуда пошло желание найти решение моего вопроса через макрос, то получается следующая история:
- есть 2 файла, первый - тот что с номерами листов от 1 до 10, второй - с именем 000.
- перед проверкой лист из второго файла копируется в первый.
- на каждом листе имеется шапка с текстовыми данными.
Отсюда и желание ускорить процесс проверки. Данные в файле №2 считаем правильными, а данные на листах файла №1 остается сверить.
Определять каждый раз в новом файле ячейки для ввода диапазона поиска и смещений для меня не проблема. А человек (далекий от темы макросов, да и в принципе в формулах экселя разбирающийся на уровне сложить/поделить/получить среднее значение) может не понять принципа работы и подготовки листа для правильной работы (да и вообще работы) макроса.
Ну и, к тому же, при успешной отладке данного решения, есть желание сделать данный макрос надстройкой.

Попрошу Вас, по возможности, оценить работоспособность такого решения. Если нет, будем думать...

UPD/
В таком виде ...
Код
Sub trovial()
Dim iSh As Worksheet
Dim arr()
Dim iDic As Object
Dim ColSearch As Range
Dim I&, iCS&, iOC&, iOP&

Set ColSearch = Application.InputBox("Выберите столбец для поиска:", Type:=8)
iOCc = Application.InputBox("Смещение искомой ячейки с данными:", Type:=2)
iOPc = Application.InputBox("Смещение для вставки суммы:", Type:=2)

iCSc = ColSearch.Column 'номер столбца искомых данных

Set iDic = CreateObject("Scripting.Dictionary")
For Each iSh In ThisWorkbook.Worksheets
  If iSh.Name <> "000" Then
    With iSh
      arr = .Range(.Cells(1, iCSc), .Cells(.Cells(.Rows.Count, iCSc).End(xlUp).Row, iCSc + iOCc)).Value
    End With
    For I = LBound(arr, 1) To UBound(arr, 1)
      If iDic.Exists(arr(I, 1)) Then
        iDic(arr(I, 1)) = iDic(arr(I, 1)) + arr(I, 1 + iOCc)
      Else
        iDic.Add arr(I, 1), arr(I, 1 + iOCc)
      End If
    Next
    Erase arr
  End If
Next
... ошибки уже не возникает
Изменено: trovial - 06.12.2023 05:49:00
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja,
Код
Sub trovial()
Dim iSh As Worksheet
Dim arr()
Dim iDic As Object
Dim ColSearch As Range
Dim I&, iCS&, iOC&, iOP&

Set ColSearch = Application.InputBox("Выберите столбец для поиска:", Type:=8)
Set iOCc = Application.InputBox("Смещение искомой ячейки с данными:")
Set iOPc = Application.InputBox("Смещение для вставки суммы:")

iCSc = ColSearch.Column 'номер столбца искомых данных
'iOCc = OffsetCopy.Value 'столбец смещения данных для копирования
'iOPc = OffsetPaste.Value 'столбец смещения данных для вставки

Set iDic = CreateObject("Scripting.Dictionary")
For Each iSh In ThisWorkbook.Worksheets
  If iSh.Name <> "000" Then
    With iSh
      arr = .Range(.Cells(1, iCSc), .Cells(.Cells(.Rows.Count, iCSc).End(xlUp).Row, iCS + iOCc)).Value
    End With
    For I = LBound(arr, 1) To UBound(arr, 1)
      If iDic.Exists(arr(I, 1)) Then
        iDic(arr(I, 1)) = iDic(arr(I, 1)) + arr(I, 4)
      Else
        iDic.Add arr(I, 1), arr(I, 4)
      End If
    Next
    Erase arr
  End If
Next


Пробую так. Но при запросе ввода смещения, после ввода числа вылетает ошибка. Аргументы параметра Type пробовал 2 и без него, одинаково "runtime error 13 type mismatch"
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, Данные на всех листах, кроме "000" одинаковой структуры, как и смещение ячейки, которую нужно копировать (и суммировать при количестве более 1 позиции). Данные на листе "000" по структуре будут отличаться. Разве что номер столбца с поиском может совпадать, а смещение может быть рандомным.
Как я вижу реализацию запросов:
Код
Set ColSearch = Application.InputBox("Выберите столбец для поиска:", Type:=8)
Set OffsetCopy = Application.InputBox("Выберите столбец для поиска:", Type:=8)
Set OffsetPaste = Application.InputBox("Выберите столбец для поиска:", Type:=8)
а как применить полученные данные от пользователя?
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, Я вот понять не могу, как перейти от выделенного столбца к поиску значений, в нем находящихся.
Если при вызове
Код
Set ColSearch = Application.InputBox("Выберите столбец для поиска:", Type:=8)
указывать не весь столбец, а допустим с B5 по B10, как получить отсюда координаты в массив

Код
arr = .Range(.Cells(5, 2), .Cells(10, 2)).Value

чтобы дальше с ним работать?

UPD/

Хотя вроде начал понимать логику Вашего решения. Макрос пробегает по листам и из заранее указанного диапазона формирует массив, из которого извлекает необходимые данные.

Если допустить, что макрос не знает заранее по каким столбцам искать, и в каком соседнем столбце нужное для суммирования значение.

Тогда перед подсчетами спросить у пользователя, какие исходные данные, офсет для суммируемых значений, офсет для вставки суммы на листе с которого идет выборка и поиск...

Насколько сложно поменять логику подсчета? Т.е. не заранее в коде указать столбцы для формирования массива, а спросить какие данные ищем и искать их по листам?  

Изменено: trovial - 05.12.2023 04:35:16
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Sanja, вижу, что в решении выше идет поиск по маске "х.х.х.х". А как быть, если  формат этих данных может принимать не только такой вид? В ячейке могут находиться значения следующих типов (1/1, 1.1, 1.1.1, 1.1.1.1, 1.1.1.1/1.1, 1/1.1.1.1, 11)
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Цитата
написал:
Если структура листов одинаковая, то зачем пользователю выбирать столбец?
Для данной задачи структура одинаковая. Предусматривал момент, когда нужно часть столбца проверить, а не весь целиком.
Да и будущем может что-то измениться, думал об универсальном решении... А может и что-то типа надстройки сделать.
Цитата
написал:
Выглядит как 'на слабо'. Тут так не надо.
Извините, не хотел вызвать подобной реакции.

А за решение - огромное спасибо!!!  
Поиск по книге и суммирование значений, Макрос из указанного столбца производит поиск по всем листам книги и копирует на текущий лист значение в одной из соседних ячеек от найденного значения
 
Доброго времени суток!
Возникла необходимость с помощью макроса произвести поиск по книге, с определенными условиями:
1. Выбирается столбец с данными, которые поочередно нужно найти в книге.
2. Выбирается столбец для вставки значений.
3. При успешном поиске, необходимо значение в соседней ячейке (в моем случае - через 2 ячейки справа) скопировать на лист, с которого осуществляется выборка значений (п. 1), и вставить в ячейку в той строке, из которой идет поиск (номер столбца ячейки выбрали в п. 2).
4. Если искомое значение присутствует в книге несколько раз, то у каждой из найденных ячеек соседнее (или через 2 справа) значение суммировать и вставить на лист со столбцом, по которому идет поиск (по аналогии с п. 3).

Пока получилось организовать поиск (без суммирования) с копированием значений в ячейке через 2 справа. Но заполняет только первые 15 строк. При попытке суммировать - почему то некорректно считает.
Есть умельцы, кто подскажет решение вопроса?
Ошибка "microsoft ожидает пока другое приложение завершит действие ole"
 
Дмитрий(The_Prist) Щербаков, поставил. Создается только первый файл, далее вывод "Успешно". И все, остальные не создаются  :(  
Ошибка "microsoft ожидает пока другое приложение завершит действие ole"
 
Доброго времени суток, дамы и господа.
Есть макрос в Excel, который заполняет шаблон в Word. Раньше выбирал каждую строку вручную через Combobox, проблем не было.
Но лень - двигатель прогресса, и теперь есть 2 Combobox'а, в первом выбирается начальная строка, во втором - конечная, и макрос, обрабатывая это, должен создать такое же количество файлов, сколько строк между значениями этих Combobox'ов. Но есть одно НО. Макрос создает только первый файл (от первой строки), а далее происходит ошибка "microsoft ожидает пока другое приложение завершит действие ole".
Код
Private Sub CommandButton4_Click()
ИмяФайлаШаблона = "[шаблон]\ГСМ.docx"
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
КоличествоОбрабатываемыхСтолбцов = Range("Таблица2").Columns.Count
If Range("Таблица2").Rows.Count < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application")    ' без подключения библиотеки Word
i1 = ComboBox4.Value + 5
i2 = ComboBox5.Value + 5
For i = i1 To i2
    Filename = NewFolderName & "\" & "Путевой лист " & Sheets("Лист1").Cells(i, 4).Value & " от " & Sheets("Лист1").Cells(i, 2).Value & ".docx"
    Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
    On Error Resume Next
            For k = 1 To КоличествоОбрабатываемыхСтолбцов
                FindText = Cells(3, k): ReplaceText = Trim$(Cells(i, k))
                If Not FindText = "" Then
                    If Not WD.Bookmarks.Item(FindText) Is Nothing Then
                    WD.Bookmarks.Item(FindText).Range.Text = ReplaceText
                    End If
                End If
                DoEvents
            Next k
    WD.SaveAs Filename: WD.Close False: DoEvents
    WA.Quit False
Next i
    msg = "Успешно!"
    MsgBox msg, vbInformation, "Готово"
End Sub

Как это победить?

Если есть у кого какие мысли по этому поводу, поделитесь, пожалуйста.

Функция (или класс) для многих Combobox_AfterUpdate
 
Nordheim, возможно. В силу своих навыков я видел это возможным сделать так.))) в access вроде AfterUpdate можно обработать в Form_Load...
Возможно, выхожу за рамки темы, но если знаете, как реализовать заполнение маршрутов, именно с таким функционалом и последовательностью, как у меня в Combobox'ах, буду Вам очень признателен.
Функция (или класс) для многих Combobox_AfterUpdate
 
Цитата
Nordheim написал:
Зачем заполняя второй столбец ComboBox(ов), заполняется первый причем со смещением?
Затем, что это нужно для одной из основных функций "программы", которую пишу - для заполнения путевых листов и списания ГСМ. ComboBox из второго столбца подставляет данные в первый столбец, так как маршрут расписывается следующим образом :
- из пункта "А" - в пункт "Б"
- из пункта "Б" - в пункт "В"
- и т.д.

Добиться желаемого результата помогло использование ComboBox с событием AfretUpdate. Была проблема с накоплением данных, здесь - https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=103478&a... ее решили. Форма, в принципе работает, но хочется сделать код короче.
Функция (или класс) для многих Combobox_AfterUpdate
 
Nordheim, не должна, а работает. Когда ввожу слово в комбобокс, начиная с первой буквы, если такое слово или слова с одинаковыми буквами вначале есть, то они подставляются автоматически. Если слово уникальное - вводим целиком, после переключаемся на другой комбобокс, а наше новое слово, если начинать вводить с первой буквы, автоматически подставится в следующий раз.
По сути, это то же самое что вводить одинаковые слова в ячейках листа Excel, но теперь уже в рамках формы.
Функция (или класс) для многих Combobox_AfterUpdate
 
Nordheim,первое моё сообщение содержит код подобной процедуры. Private Sub ComboBox101_AfterUpdate() и т.д.
Функция (или класс) для многих Combobox_AfterUpdate
 
Nordheim, ComboBox в данном случае работает на то, чтобы при вводе первых букв находить значение, которые собираются на листе, и вставлять его. Если такого значения нет, то записывать его, после того, как текст будет введён целиком, чтобы в следующий раз можно было также при вводе первых букв предложить его для вставки. В процедуре AfterUpdate это работало, но там для каждого ComboBox прописана своя процедура. Я же хочу все это объединить в класс, чтобы было компактнее.  
Функция (или класс) для многих Combobox_AfterUpdate
 
Nordheim, не совсем. если убрать из формы весь код, что идет ниже (для каждого updateafter) добавление новых данных не происходит сразу, а только после закрытия формы. И, причем, добавление происходит побуквенно. А если слово будет длиной 10 букв, то будет 10 строк, и каждой на 1 букву больше. Я понимаю, что Вы скинули пример, но не могли бы помочь до конца разобраться?
Изменено: trovial - 19.02.2019 15:58:42
Функция (или класс) для многих Combobox_AfterUpdate
 
И снова здравствуйте! Недавно разобрались с написанием класса для многих textbox_change, спасибо всем за помощь.
Понимаю, что, возможно, надоел, но хочу разобраться с написанием (скорее всего функции) для множества процедур для  Combobox со свойством AfterUpdate.
Если в частном виде для одной процедуры мы имеем код
Код
Private Sub ComboBox101_AfterUpdate()
        i = 1
            Do While ThisWorkbook.Sheets(2).Cells(i, 1) <> ""
                i = i + 1
            Loop
            ThisWorkbook.Sheets(2).Cells(i, 1) = ComboBox101.Value
        Call UserForm_Activate
        End Sub
, то как поступить в данном случае.
Проверка ввода данных для многих TextBox
 
Дмитрий(The_Prist) Щербаков, да, все работает, спасибо Вам.
Ну я только учусь время от времени. По профессии не программист, но порой приходится делать вещи, которые облегчают жизнь.
И, кстати, вопрос такой: сделать класс на процедуру After Update тоже получится, или через функцию делать.
Проверка ввода данных для многих TextBox
 
Дмитрий(The_Prist) Щербаков,  я тоже думал через функцию или класс.
попробовал сделать согласно инструкции, но где то ошибка.
Проверка ввода данных для многих TextBox
 
Доброго времени суток, господа и дамы!
Я к Вам снова за помощью.
Сложилась следующая ситуация: имеем на форме несколько текстбоксов. В этих текстбоксах через код
Код
Private Sub TextBox1_Change()
    If TextBox1.Text Like "*[!0-9]*" Then TextBox1.Text = TextBox1.Tag Else TextBox1.Tag = TextBox1.Text
    End Sub
разрешаю ввод только цифр. Но если на форме овердофига текстбоксов, то количество процедур многократно возрастает.
Так вот, есть ли способ сделать что-то наподобие цикла, но для процедуры в целом (включая ее имя) или идея бессмысленна?  
Ошибка ReplaceText = Trim(.Cells
 
skais675, действительно, поставил cells(i, k), и все заработало. Спасибо Вам
Ошибка ReplaceText = Trim(.Cells
 
Здравствуйте, уважаемые участники сообщества!
Сделал я в Экселе на основе форм и макросов программу для списания ГСМ. Изначально она работала с шаблоном на листе в этом же Экселе, но по определенным причинам решил вынести шаблон в Ворд. Но при попытке скопировать данные из ячеек и разнести их по ссылкам шаблона в Ворде выскакивает ошибка  "Compile error: Invalid or unqualified reference" и выделяется ".Cells" в строке "FindText = Cells(3, k): ReplaceText = Trim(.Cells(k))".
Подскажите, пожалуйста, в каком месте я делаю ошибку.
Изменено: trovial - 13.02.2019 16:18:35
Значения в Combobox по 2 столбцам
 
Nordheim,тоже работает. Сейчас только доперло, что цикл прогоняет до последнего значения, поэтому и происходило сие.
Спасибо большое Вам
Значения в Combobox по 2 столбцам
 
Юрий М, буду признателен, если покажете, как сделать сортировку по скрытому столбцу.  
Значения в Combobox по 2 столбцам
 
Возможно и перемудрил. Спасибо за намек. Ваш вариант работает, но до тех пор, пока в списке не появится более одного человека с одной и той же организации и одинаковой ролью. Как вариант, попробую сделать перебор по трем столбцам.
Еще раз спасибо за намек.
Страницы: 1 2 След.
Наверх