Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA

Модерирует : ShIvADeSt

ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

RUSmafia



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами Excel (об этом можно уточнить здесь) или требующая автоматизации, попробуйте для начала записать макрос самим Excel через меню Сервис (Tools) - Макрос (Macro) - Начать запись (Record New Macro). Подробнее здесь. В большинстве случаев получившийся код (Сервис-Макрос-Макросы-Изменить) Вас не удовлетворит, но подскажет, какие объекты-методы-свойства использовать.  
    Другой Ваш помощник - Просмотр объектов (Object Browser). Ну и встроення помощь (F1), естественно.
     
    Если Вы в тупике, покажите Ваш код (или часть кода) здесь.  Если вылазит ошибка, цитируйте ее полностью. Если код слишком большой, используйте тeг [more].
    Используйте отладчик - Breakpoints (F9), Watches (Shift-F9), Steps (F8 и др.) Сильно облегчает поиск ошибок.

     
    Рекомендуется к прочтению:
  • Первые шаги с Excel VBA
  • Excel VBA: Приёмы программирования
  • WinApi. Лекция из курса "Основы офисного программирования и язык VBA" (для продвинутых)
  • Daily Dose of Excel (eng.) - тематический блог: советы по работе с Excel и прочие материалы
  • Excel Macros & Excel VBA Code Tips, Tricks (eng.) - советы, трюки и уловки
  • Mr. Excel (forum) (eng.) - весьма оживленный форум по Excel&VBA.
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов

  • Всего записей: 556 | Зарегистр. 31-07-2002 | Отправлено: 21:40 14-10-2004 | Исправлено: lucky_Luk, 20:44 13-04-2007
    Ergistael

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri, спасибо, я понял, тогда, видимо, не буду заморачиваться. Просто поставлю проверку, что количество листов открытой книги не равно 0, а как поступить с проверкой, что выбран не графический объект? Какие вообще правила хорошего тона в оформлении процедур, чтобы отсечь большинство очевидных ошибок, связанных с запуском макросов в неподходящее время?

    Всего записей: 18 | Зарегистр. 06-04-2007 | Отправлено: 14:06 06-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ergistael
    Количество листов в книге не может быть равно 0. Может быть 0 тActiveWorkbook.Worksheets.Count, например, но не Sheets.Count.
    По поводу проверок же. В процедуре связанной с кнопкой можно проверить, для книг
    Workbooks.Count - на количество книг, а чтобы выполнять действия только с Range сделать проверку:
    If TypeOf Application.Selection Is Range Then
    'код работы с ячейками
    End If

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 14:37 06-04-2007 | Исправлено: AndVGri, 14:39 06-04-2007
    Ergistael

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да, верно, количество книг. Про is Range - спасибо. Буду пробовать. Вылижу утилитку - куда выкладывать? Имхо, не только мне пригодится.

    Всего записей: 18 | Зарегистр. 06-04-2007 | Отправлено: 15:35 06-04-2007
    Oyger

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребят. Такой вопрос.
    Есть строка. У в строке забиты даы в формате "dd/mm/yy"
    Мне надо с полным годом
    Пешу .NumberFormat = "dd/mm/yyyy"
    В меню "формат ячейки" формат меняется. А чтобы изменился в самой ячейки надо "в нее зайти" и нажать "ентер".
    А как по другому? Ведь для того макрос и пишу.

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 17:05 06-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ergistael
    Да, в принципе, где угодно. В дополнении, если работаете не с выделенными блоками ячеек, а рабочим листом напрямую то проверку можно сделать на тип листа
    If TypeOf Activesheet Is Worksheet Then
     
    Oyger
    А что собственно не работает? Попробовал в макросе изменить
    .NumberFormat = "dd/mm/yyyy" - формат отображения даты в ячейке поменялся на требуемый.
    Может у вас ScreenUpdating или Calculation, или что-то в этом роде изменено?

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 17:40 06-04-2007
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    AndVGri
    Извините, долго не был на связи - работа  ;((
    Подскажите, как отправить файл или скришот  

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 18:41 06-04-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Oyger
    А какой исходный формат ячеек? Скорее всего Обший (или как там General). Возможно импортировалось криво.
    Можно попробовать Range(...).Value = Range(...).Text
     
     
     
    Добавлено:
    aks_sv

    Цитата:
    Подскажите, как отправить файл или скришот

    Для файла любой файлообменник. dump.ru например.
    Для скриншонов удобен imageshack.us

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:18 06-04-2007
    Mpa3b



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, что мне нужно, точнее какое событие использовать, что  бы  
    отслеживать изменения в ячеках листа, книги.  
    допустим, мне нужно перевод строки сделать если колличество определенных символов  
    (tab, enter ,пробел) достигнет нужного числа.  
    Есть ли возможность описывать условия для каждой ячейки, региона, регионов.  
    спасибо

    Всего записей: 1101 | Зарегистр. 23-03-2004 | Отправлено: 23:33 07-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mpa3b
    А куда без таких событий? SheetChange для Application, Workbook; Change - для Worksheet.
    Во всех случаях - передается объект класса Range - где произошли изменения. По соответствующим свойствам Range можно узнать, что ввели, куда ввели и проверить на ваши условия.
    Если не секрет, зачем вводятся
    Цитата:
    символов  
    (tab, enter

    С праздником

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 04:03 08-04-2007
    kiVAR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
     
    Dim iRow As Long
     
    iRow = Target.Row
     
     
    If Target.Column = 4& Then
        If IsNumeric(Cells(iRow, 5&).Value) And IsNumeric(Cells(iRow, 4&).Value) Then
            Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "-" & Cells(iRow, 4&).Address
        End If
    ElseIf Target.Column = 3& Then
        If IsNumeric(Cells(iRow, 3&).Value) And IsNumeric(Cells(iRow, 5&).Value) Then
            Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "+" & Cells(iRow, 3&).Address
        End If
    End If
     
    Application.EnableEvents = True
    Application.ScreenUpdating = True
     
    End Sub

    Цитата:
    Application.Calculation было бы не вредно вернуть назад

    возвращаю назад(т.е. пишу в самом конце Application.Calculation = xlCalculationAutomatic ) а он опять начинает считать както по косячному

    Всего записей: 10 | Зарегистр. 26-03-2007 | Отправлено: 13:25 08-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kiVAR

    Цитата:
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False  

    и

    Цитата:
    pplication.EnableEvents = True
    Application.ScreenUpdating = True

    убери, неявной рекурсии нет. К чему тогда код подавления? А неверно что-то считать может из-за того, для примера:
    в ячейке Е2 было число 3. Вводим в ячейку С2 значение 5, получаем в Е2 (как расчёт по формуле) 8, затем в ячейку D2 вводим 4, получаем 8 - 4 = 4. А желание было чтобы исходное значение Е2 (3) - 4 = -1. Так? Это не выходит? Нельзя ли конкретнее про
    Цитата:
    а он опять начинает считать както по косячному


    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 15:04 08-04-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kiVAR

    Цитата:
    iRow = Target.Row  

    И что будет, если Target Is Nothing? (удаление диапазона)
     

    Цитата:
    If Target.Column = 4& Then  
    ElseIf Target.Column = 3& Then  
    End If  

    ТАК проверки не делаются! В переводе на русский твои условия значат: если номер самого левого столбца диапазона равен 3 или 4, то. Т.е. если взять диапазон из 2,3 и 4 столбца, то условие не выполняется.
    Вот так правильно:

    Код:
    If Not Intersect (Target, Columns(4)) then
    ElseIf Not Intersect (Target, Columns(3)) then
    End if

    Т.е. если диапазон пересекает третий или четвертый столбец, то...

    Цитата:
        If IsNumeric(Cells(iRow, 5&).Value) And IsNumeric(Cells(iRow, 4&).Value) Then  
            Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "-" & Cells(iRow, 4&).Address  
        End If  

    Аналогично - берется только строка самой верхней ячейки диапазона.
    На самом деле, все это делается без VBA - с помощью формул.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:47 09-04-2007 | Исправлено: The okk, 09:48 09-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk

    Цитата:
    И что будет, если Target Is Nothing?
    - ничего не будет. В данной задаче событие Worksheet_Change не произодёт.

    Цитата:
    If Not Intersect (Target, Columns(4)) then
    ElseIf Not Intersect (Target, Columns(3)) then
    End if

    И это собственно ни к чему. По условию задачи - отслеживается изменение ячейки в столбце C или D. Если быть строгим, то накладываем общее условие на единичную ячейку

    Код:
     
    If (Target.Rows.Count And Target.Columns.Count) = 1& Then
        'Здесь остальной код
    End If
     


    Цитата:
    На самом деле, все это делается без VBA - с помощью формул

    А вот тут не спорю. Хотя. Смысла задачи понять не могу. Если ввод в Cx - то одна формула в Ex, а если ввод в Dx, то другая формула Ex (в обоих случаях со ЗНАЧЕНИЕМ Ex). А если есть уже значения в Dx перед вводом в Cx или, наоборот, Сx перед вводом в Dx? Автор не желает рассказать

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 13:05 09-04-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    С прошедшим тебя!

    Цитата:

    Цитата:
    If Not Intersect (Target, Columns(4)) then
    ElseIf Not Intersect (Target, Columns(3)) then
    End if

    И это собственно ни к чему. По условию задачи - отслеживается изменение ячейки в столбце C или D.

    Объясню на примере:
    Копируем две (или более) ячейки, расположенные в ряд. Вставляем в любую ячейку в столбце В. В результате изменятся ячейки и в столбце В и в столбце С.
    В его варианте: условие не выполнится, поскольку номер крайнего левого столбца = 2, а не 3 и не 4.
    В моем варианте: условие выполнится, поскольку изменения затронули столбец 3.
    Так яснее? Анализировать таргетовый столбец имеет смысл только в случае, если нужно отследить изменения в столбце А (поскольку левее быть просто не может).

    Код:
     
    If (Target.Rows.Count And Target.Columns.Count) = 1& Then
        'Здесь остальной код
    End If

    Сие условие скорее всего выполняется всегда, поскольку у таргета есть как минимум один столбец и одна строка.  
    Если я правильно понял, ты хотел сказать:

    Код:
    If Target.Cells.Count =1& Then

    Тут косяки опять же будут с Copy/Paste многоклеточных диапазонов.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:21 09-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    И тебя с прошедшим Воскресением За Target.Cells.Count =1& спасибо, торможу.
    Для чего у тебя проводится проверка на пересечение диапазонов я понял. Спорить можно здесь до хрипоты, как будут меняться ячейки (изменения в которых мы отслеживаем) и как это проверять. Автор же ставил задачу как: вводим в ячейку Cx значение, тогда в ячейке Ex пишем формулу
    = Ex + Cx
    Если вводим в Dx, то пишем формулу в Ex
    = Ex - Dx
    Так что, будет только интересно, какую формулу нужно ввести в Ex при одновременной вставке значений в Cx и Dx
    Да, кстати, как это реализовать в виде формулы без VBA? Учитывая, что здесь ссылка ячейки Ex на саму себя? Да простят меня за вопрос не в том топике.

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 13:35 09-04-2007 | Исправлено: AndVGri, 13:43 09-04-2007
    kiVAR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    а вот и я. извеняюсь если чтото непонятно объясняю, я в vba начинающий, как нетрудно догадаться, информацию в основном черпаю из разных источников в инете, поэтому может и пишу всякую ерунду

    Цитата:
    для примера:  
    в ячейке Е2 было число 3. Вводим в ячейку С2 значение 5, получаем в Е2 (как расчёт по формуле) 8, затем в ячейку D2 вводим 4, получаем 8 - 4 = 4

    всё правильно так и надо

    Цитата:
    убери, неявной рекурсии нет

    если убераю:
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Dim iRow As Long
     iRow = Target.Row
    If Target.Column = 4& Then
        If IsNumeric(Cells(iRow, 5&).Value) And IsNumeric(Cells(iRow, 4&).Value) Then
            Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "-" & Cells(iRow, 4&).Address
        End If
    ElseIf Target.Column = 3& Then
        If IsNumeric(Cells(iRow, 3&).Value) And IsNumeric(Cells(iRow, 5&).Value) Then
            Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "+" & Cells(iRow, 3&).Address
        End If
    End If
    End Sub
    то когда ввожу к примеру в то же С2 значение 5(в Е2 стоит значение 3) получаю в Е2 значение 10.  
    Так как мне сделать чобы считало правильно и при это не отключать калькуляцию

    Всего записей: 10 | Зарегистр. 26-03-2007 | Отправлено: 13:54 09-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kiVAR
    Ну ещё один шажок сделай. Какая формула в E2? У меня =3+$C$2 и получается собственно 8, что у тебя?
    У меня всё нормально работает, если не считать, что при удалении в C2 в E2 записывается =3+$C$2, что не есть хорошо. Нужно добавлять проверку ячеек на IsEmpty

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 14:10 09-04-2007
    kiVAR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    AndVGri
    у меня после того как ввел 3 в С2 потом 5  в Е2 такая формула: "=5+$C$2"
    [

    Всего записей: 10 | Зарегистр. 26-03-2007 | Отправлено: 14:24 09-04-2007
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kiVAR
    Почему происходит? Это понятно первый раз ты вводишь в С2 3, в Е2 формула =+$C$2, затем ты вводишь 5 в С2 и, следовательно, значение в Е2, по выше приведённой формуле, 5. Как результат получаем =5+$C$2
    Блокировками это врядли изменишь.
    А какой сакраментальный смысл помещать в Ех формулу?
    Если обойтись без этого то достаточно заменить в процедуре код
    Cells(iRow, 5&).Formula = "=" & Cells(iRow, 5&).Value & "+" & Cells(iRow, 3&).Address
    на соответствующее вычисление
    Cells(iRow, 5&).Value = Cells(iRow, 5&).Value + Cells(iRow, 3&).Value
    тогда таких накладок не будет. Ну и для Cells(iRow, 4&) соответственно

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 14:54 09-04-2007
    kiVAR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    Огромное спасибо.  
     
    Всё работает как надо

    Всего записей: 10 | Зарегистр. 26-03-2007 | Отправлено: 21:04 09-04-2007
       

    Страницы: 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA
    ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru