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

Страницы: 1 2 3 4 След.
VBA странность при работе с переменными
 
Апострофф, спасибо.
VBA странность при работе с переменными
 
Добрый день, коллеги!

При написании простейшего кода столкнулся со странностью - при использовании переменной типа integer и приравниванию к ней значения пустой ячейки, длина данной переменной через len = 2.

Подскажите, в чем дело, чтобы не попадаться на такое в будущем.
Спасибо!
Изменено: cray - 27.04.2016 13:39:49
VBA. Вытягивание данных с закрытых книг их автоматическая группировка
 
Hugo, круто!
Ваш код пока слишком сложен для моего уровня знаний, буду изучать, и может быть, годиков эдак через семь смогу сделать что-то наподобие)

Спасибо!
VBA. Вытягивание данных с закрытых книг их автоматическая группировка
 
Hugo, после прочтения Вашего сообщения в моей душе поселилась печаль, ибо что нужно сделать - примерно понимаю, а вот как перенести это дело в код - нет.
Не встречалась ли Вам подобная задача с реализацией через эти самые словари/коллекции? Именно подобная, потому что, как показала практика в лице совета ув. Sanja из #4 примеры задач с использованием коллекций особой ясности не вносят.

Тем временем, переспав со своей проблемой, на утро на ум пришел простой вариант ее решения - через введение переменной LastRow и конструкции Select Case. Если у кого возникнет похожая проблема и кто также не разбирается в коллекциях, то я сделал так:
Первый Case - в случае если Application.Match названия новой книги по отношению к уже загруженному диапазону названий = 0 (т.е. название книги встречается впервые), то смещение  по строкам относительно первой ячейки происходит не на величину счетчика количества открываемых файлов, как раньше, а на LastRow (последняя заполненная строка диапазона имен открываемых книг). Дополнительное условие в этом Case - если счетчик открываемых книг = 1 (т.е. открыта самая первая книга), то смещение происходит как раньше - на этот счетчик открытий.
Второй Case -   Application.Match >0 (т.е. название уже встречалось), в котором смещение происходит на LastRow - 1

В принципе, свою задачу я решил и номинально тема закрыта, но мне интересна ее реализация через словари/коллекции. Так что если кто захочет реализовать идею ув. Hugo, буду благодарен. Для этого прикрепляю доделанные файлы-примеры, в которых на этот раз происходит некая выгрузка данных.
VBA. Вытягивание данных с закрытых книг их автоматическая группировка
 
Hugo, спасибо, теория стала чуть понятнее, кроме момента
Цитата
Hugo написал:
3 сверились с словарём
Что понимается под словарем в данном контексте? Диапазон уже выгруженных названий?  


А по поводу Вашего замечания по поводу постановки вопроса -
Цитата
Hugo написал:
По файлам-примерам - если из открываемых ничего не берёте - их и открывать вообще незачем.
В общем пока задача непонятна, делать рано имхо...
данные из книг вытаскиваются (в смысле, не из файлов для примера, а из моих рабочих - пример же нужен для упрощения).
Структура рабочих книг такова, что в каждом из них - данные по 2 годам, (например, А_2001 содержит данные за 2000-2001гг).
Целевой же файл содержит таблицу с диапазоном 2000-2014 гг, и в случае, если в конкретной открываемой книге нет данных нужного периода, данные ячейки просто не изменяются.
Сейчас выгрузка происходит "лесенкой", см. пример
При объединении в одну строку данные будут выгружаться корректно (при условии, что необходимую величину смещения получится загнать в переменную)  
VBA. Вытягивание данных с закрытых книг их автоматическая группировка
 
Hugo, претензия принимается) Уточняю - не доводилось сталкиваться при личном написании кода - чужое-то использовать много ума не требует
Изменено: cray - 26.04.2016 19:59:40
VBA. Вытягивание данных с закрытых книг их автоматическая группировка
 
Sanja, я изучил Ваш пример, уже час с ним мучаюсь, пытаясь приладить под свои нужды, но особого понимания не добавилось - в Вашем примере было два сформированных массива, а в моем случае - ни одного (либо один, если за него принять еще пустой массив с выгруженными названиями). А как сделать сверку с названием новой выгружаемой книги с этой коллекцией, как вернуть номер совпадения этого названия (через application.match, же?), и самый главный вопрос, как в итоге прийти к уменьшению смещения в целевой книге с количества открываемых книг на количество их уникальных наименований?

Я не могу понять, какой должен быть алгоритм, снова смиренно прошу помощи.
Изменено: cray - 26.04.2016 19:31:09
VBA. Вытягивание данных с закрытых книг их автоматическая группировка
 
Hugo, к сожалению, мне еще не доводилось сталкиваться ни со словарями, ни с коллекциями на практике, но буду копать в этом направлении, спасибо за наводку!

А пока я сделал упрощенный пример-шаблон, выгружающий имена книг, буду благодарен, если кто-нибудь подскажет как советы, ув. Hugo реализуются на практике.

Прилеплены: файл "пример" и три пустых загружаемых файла.
Изменено: cray - 26.04.2016 17:46:29
VBA. Вытягивание данных с закрытых книг их автоматическая группировка
 
Добрый вечер, уважаемые!

Стоит следующая задача - необходимо выгрузить данные из закрытых книг в целевую книгу. При выгрузке, книга открывается, из нее данные вставляются в строку целевого файла, книга закрывается, после чего в целевом файле происходит смещение на 1 строку вниз и цикл повторяется.
Некоторые книги могут иметь схожее название, отличающееся лишь идентификатором (например, А_2010, А_2011, Б_2010). Необходимо выгрузить данные так, чтобы книги с одинаковым общим названием выгружались в одну строку (смещения не происходило).

Выгрузка у меня реализована должным образом, но вот никак не могу сделать это проклятое объединение строк. Прикрепляю пример того, что нужно получить (при этом суммировать значения объединяемых данных не нужно)
Выглядит это все как задача извлечения уникальных значений массива (я уже вставил макрос, уважаемого The_Prist), но есть одна тонкость - в этом примере исходные данные уже введены, в то время как в моем случае они подгружаются по одному - не знаю как сделать пример, чтобы отражалась именно моя проблема.

В случае необходимости пришлю рабочий файл (здоровенный и туманный)
Спасибо!  
Спецвставка с умножением на константу или переменную, макрос
 
Понял, спасибо!
Спецвставка с умножением на константу или переменную, макрос
 
kuklp, вот так и знал, что не надо activesheet в примере давать)
Код
workbooks("1").worksheets("111").Range("a1:a2") = Evaluate(workbooks("1").worksheets("111").Range("a1:a2/1000"))
Что делать в таком случае?
Изменено: cray - 25.04.2016 14:19:01
Спецвставка с умножением на константу или переменную, макрос
 
Цитата
MCH написал:
Range("B1:B10") = Evaluate("-1*A1:A10")
Прошу прощения, что реанимирую труп, но иначе бы пришлось вообще устраивать археологические раскопки http://www.planetaexcel.ru/forum/?FID=8&PAGE_NAME=read&TID=1420 ;)


Можно ли и если да, то каким образом применить данную конструкцию при полном обращении к диапазону?
К примеру, такой код у меня выдает ошибку:
Код
ActiveSheet.Range("a1:a2") = Evaluate(ActiveSheet.Range("a1:a2/1000"))
Покамест использую конструкцию select, но хотелось бы обойтись без нее
Код
ActiveSheet.Range("a1:a2").Select
Selection.Value = Evaluate(Selection.Address & "/1000")
Метод Application.Match со ссылкой на другую книгу, ошибка в коде
 
kuklp, большое спасибо за наводку и совет! Как обычно, подводит невнимательность(
Цитата
kuklp написал: Вам бы, сударь книжку почитать по работе с отладчиком
Так это мы с удовольствием, была б хорошая книжка!
Изменено: cray - 09.04.2016 21:19:27
Метод Application.Match со ссылкой на другую книгу, ошибка в коде
 
Ну так в данном случае MsgBox как раз и используется для вывода значений этой переменной в цикле. Других способов мне, к сожалению, не известно
По идее должно выводится числовое значение, но этого не происходит.
Метод Application.Match со ссылкой на другую книгу, ошибка в коде
 
Добрый вечер!

Уже несколько часов бьюсь над кодом, не могу понять в чем ошибка. Помогите разобраться, пожалуйста.

Сама ошибка сидит в модуле "Vlookup", в блоке "поиск №столбца с годом". Там используется метод Application.Match, который не находит нужные значения (и, судя по всему, вообще не работает, хотя его отдельные составляющие функционируют как надо). Проверку провожу при помощи MsgBoxa, который и выкидывает ошибку.

Сам макрос должен загружать данные из другой книги, поэтому скидываю 2 файла (при запуске макроса нужно выбрать файл с данными).

Спасибо!
Отзывы о работодателях и исполнителях, Посмотрите, прежде чем взять/предложить работу
 
Доволен работой с пользователем Sanja, все сделано в оговоренный срок, были соблюдены личные просьбы вне тз (просьбы комментировать код), необходимые правки вносились очень оперативно. Рекомендую!  
Помощь в доработке макроса
 
Добрый день!

В продолжение темы на форуме
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=76401&TITLE_SEO=76401-vypolnenie-chasti-makrosa-pri-izmenenii-sootvetstvuyushchikh-yacheek

К сожалению, все оказалось не так радужно.
При попытке адаптировать вариант уважаемого Sanja к своим нуждам, у меня возникли следующие проблемы:
1) при работе первого макроса, выгружающего данные из файлов-исходников, происходит конфликт с макросом модуля листа, что приводит к бесконечному (или конечному, но требующему более 5 минут) циклу пересчета изменяющихся значений, и их постоянному перемножению (критично).
2) при обработке введенных ранее значений, макрос из модуля листа работает исключительно долго, пересчитывая 32 значения около 10 секунд (неприятно, но терпимо)
3) при попытке изменения более 2 ячеек одновременно происходит пересчет всего столбца, вне зависимости от прописанных условий (неприятно, но терпимо)

Путем измышлений я пришел к следующим возможным решениям:
а) Основной макрос при выгрузке изменяет значение "-" (введенное по-умолчанию) на один из вариантов "млн / млрд". Для решения этой проблемы нужно как-то задать очередность выполнения макросов, чтобы модуль листа работал только после загрузки данных основным макросом, т.е. после первого изменения значения "-" на значение "млн/млрд", т.е. нужно как-то объявить переменные в 1 макросе и счетчики количества их изменений, которые привязать к модулю листа;
б) Для решения второй проблемы нужно как-то перенести тело макроса листа в отдельный модуль, оставив на листе исключительно вызов этого макроса при выполнении условия а)

Просидев часов 5 над решением этих задач, я понял, что знаний у меня резко недостает, поэтому готов рассмотреть вариант платной помощи уважаемых гуру, в случае, если задача излишне трудоемкая.

По запросу могу выслать образец файла-исходника для загрузки данных.
Нужно только это, оптимизация уже написанного кода не обязательна. В общем-то, я бы удовлетворился и советом с форума о механизме реализации задачи, но, к сожалению, нет времени ждать.
Напишите приблизительную цену.

Спасибо!
Изменено: cray - 01.04.2016 16:47:21
Автозамена в формулах незащищенных ячеек
 
bedvit, спасибо за ответ!
Действительно, замена макросом работает отлично. Но дело в том, что я делаю инструмент для своих коллег, которые не очень дружны с экселем, и подавно - с вба, так что использование кода для индивидуального использования каждого пользователя отпадает.

Я надеялся обнаружить решение, подобное решению для работы структурированных строк/столбцов в защищенных листах - код, прописываемый в модуль книги, и нормализующий его работу. Однако даже на англоязычных ресурсах пока не натыкался ни на что похожее.
Пока вопрос остается открытым.
Выполнение части макроса при изменении соответствующих ячеек
 
Все работает, спасибо!
Автозамена в формулах незащищенных ячеек
 
Да, прошу прощение что ввел в заблуждение.

Под автозаменой понималась замена при помощи "Найти и заменить" (ctrl+h).
Выполнение части макроса при изменении соответствующих ячеек
 
Sanja, большое спасибо за ответ!

Однако у меня не получилось. Этот код работает на лету, однако по прежнему изменяет все столбцы при изменении одной ячейки
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim col As Range
    If Not Intersect(Target, [B21:E21]) Is Nothing Then
        For Each col In Range(Cells(22, Target.Column), Cells(26, Target.Column)).Cells
           ' мой код
             Dim measure As String, mln As String, mlrd As String, y As Integer, rang As Range, ValueCheck As Variant
                mln = ActiveSheet.Range("b18")
                mlrd = ActiveSheet.Range("b19")
                    For y = 0 To 3
                      measure = ActiveSheet.Range("b21").Offset(0, y)
                      ValueCheck = ActiveSheet.Range("b21").Offset(4, y)
                        For Each rang In Range(Cells(22, y + 2), Cells(26, y + 2))
                            If measure = mln And ValueCheck <> 0 Then
                                    rang.Value = rang.Value * 1000
                                ElseIf measure = mlrd And ValueCheck <> 0 Then
                                    rang.Value = rang.Value / 1000
                                Else
                                    Exit Sub
                            End If
                        Next
              Next
        Next
    End If
End Sub
Выполнение части макроса при изменении соответствующих ячеек
 
Добрый день!

Немного дурацкое название темы, но оно лучше всего отображает проблему.

Предыстория следующая - в целевой файл выгружаются данные из нескольких источников, каждому столбцу целевой таблицы соответствует свой файл-источник. В разных источниках могут быть разные измерители (млн/млрд). В макросе, выгружающем данные, реализована выгрузка измерителя, вставляющегося сразу в выпадающий список (млн/млрд) в шапке каждого столбца.

Необходимо: написать макрос, который бы при изменении измерителя в выпадающем списке на лету пересчитывал значения соответствующего столбца (домножая или деля их на 1000).
Важно, чтобы данный макрос выполнялся только при ручном изменении значения в выпадающем списке (а не при выгрузке значений из первоисточников первым макросом), и применялся только к соответствующему столбцу (а не ко всей таблице).  

В настоящий момент реализовано домножение/деление данных при изменении значения выпадающего списка, но я не знаю, как ограничить макрос исключительно тем столбцом, в котором произошло изменение измерителя.
(пример во вложении)

Поиски навели меня на конструкцию If Not Intersect(Target, Range)) Is Nothing Then, но мне она не совсем понятна.

Подскажите, пожалуйста, как можно решить проблему.
Спасибо!
Автозамена в формулах незащищенных ячеек
 
Задачу решил путем добавления костыля - кнопок снятия и установки пароля. Вопрос в сабже остается открытым.
Автозамена в формулах незащищенных ячеек
 
Добрый день, уважаемые!
Традиционно не обнаружил ответа через поиск, поэтому создаю тему.

Ситуация следующая: при защите листа и отмене защиты некоторых ячеек, в данных ячейках возможно изменение как значений, так и формул вручную. Однако при попытке изменений формул в данных ячейках при помощи замены ("найти и заменить" - Ctrl+F) возникает ошибка (запрет об использовании данной команды на защищенном листе".

Вопрос: можно ли каким-то образом разрешить замену без снятия пароля с листа?

Спасибо!  
Изменено: cray - 31.03.2016 19:09:55
Изменение макроса при помощи другого макроса
 
The_Prist,спасибо!
Изменение макроса при помощи другого макроса
 
Александр Сергеевич, отличный вариант! Но вопрос был именно в возможности изменения макросом макроса
The_Prist, в краску вгоняете  :oops: Это именно то, что нужно! Только единственное непонятно осталось - можно ли вносить изменения в конкретный модуль книги, а не удалять старый модуль и вставлять новый? (на самом деле вопрос праздный, т.к. описываемый функционал справится отлично)    
Изменение макроса при помощи другого макроса
 
Здравия желаю!

У меня появился теоретический вопрос, ответ на который я не смог найти за двадцать минут интенсивного гугления. Если эта тема поднималась на форуме, прошу - подскажите куда рыть.

Предположим, у меня есть 100 книг, абсолютно одинаковых по своей структуре и содержащих одинаковые макросы. Отличаются только уже введенными в них значениями.
В ходе изысканий было обнаружено, что при создании шаблона этих книг в макросе была допущена ошибка и теперь имеется 100 косячных книг, которые используются некими юзерами. Можно исправить ошибку в макросе, по новой создать 100 книг и отправить их юзерам, что долго, нудно и создаст дополнительную мороку пользователям по переносу данных из косячных книг в актуальные. Либо же можно отправить всем по почте мастер-файл, в котором будет кнопка выбора файла и кнопка "патч", которая заменит текст макроса на новый.

Так вот вопрос - можно ли провернуть второй вариант и как это сделать?

Спасибо!    
VBA: application.vlookup - error 91, Есть 2 макроса, в одном нет ошибки, в другом - есть
 
Спасибо!
А вот статья о том, почему лучше не использовать .select
http://www.businessprogrammer.com/power-excel-vba-secret-avoid-using-select/

И еще http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros
Изменено: cray - 16.02.2016 15:39:11
VBA: application.vlookup - error 91, Есть 2 макроса, в одном нет ошибки, в другом - есть
 
Sanja, когда прочитал Ваш ответ засмеялся сквозь слезы) Два часа сидел ошибку выискивал. Спасибо огромное!

Hugo, замечание по option explicit учту, спасибо.
Кстати, не сочтите за оффтоп (т.к. в продолжение option explicit). Вы не подскажите, нет ли где эдакого "перечня хорошего тона при написании макросов vba"?
Я вот, например, слышал, что не приветствуется использование конструкций GoTo и ActiveBook/Cell, теперь вот OptionExplicit добавилась в копилку знаний, но таких тонкостей же гораздо больше.  
VBA: application.vlookup - error 91, Есть 2 макроса, в одном нет ошибки, в другом - есть
 
Добрый день, уважаемые!

Собственно, проблема описана в названии темы.
Я написал два макроса с vlookup'ом (практически идентичных), однако в одном случае макрос выкидывает ошибку 91, а в другом - работает отлично.
Подскажите, пожалуйста, где косяк.

Спасибо!
Страницы: 1 2 3 4 След.
Наверх