Доброго времени суток, вопрос новичка, только взялся за VBA, до этого изучал JS, PHP, Ruby нигде не было такого затупа. Наверняка проблема тупейшая.
Мне нужно просто инкрементировать число в одной ячейке при печати файла. Узнал что это делается с помощью: [vba]
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean) Worksheets(1).Range("A1").Value = Worksheets(1).Range("A1").Value + 1 End Sub
[/vba] Не пашет. Подумал, может это событие не работает, написал вот так: [vba]
Код
Function increm() MsgBox Worksheets(1).Range("A1").Value End Function
[/vba] Вставил в ячейку =increm(), нажале ентер - не работает. Подумал, ну может это строка "Worksheets(1).Range("A1").Value = Worksheets(1).Range("A1").Value + 1" не работает. Поставил на неё мышку, нажал F5 - число инкрементируется, строка отрабатывает. Ну значит вызов самой функции не работает! Попробовал вот так просто получить значение: [vba]
Код
Function increm() MsgBox Worksheets(1).Range("A1").Value End Function
[/vba] Работает!
Я короче не понимаю, то ли я дурак, то ли у VBA какая-то своя "особая" логика. Помогите понять, что я делают не так. На всякий случай файл прилагаю. Спасибо заранее.
Доброго времени суток, вопрос новичка, только взялся за VBA, до этого изучал JS, PHP, Ruby нигде не было такого затупа. Наверняка проблема тупейшая.
Мне нужно просто инкрементировать число в одной ячейке при печати файла. Узнал что это делается с помощью: [vba]
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean) Worksheets(1).Range("A1").Value = Worksheets(1).Range("A1").Value + 1 End Sub
[/vba] Не пашет. Подумал, может это событие не работает, написал вот так: [vba]
Код
Function increm() MsgBox Worksheets(1).Range("A1").Value End Function
[/vba] Вставил в ячейку =increm(), нажале ентер - не работает. Подумал, ну может это строка "Worksheets(1).Range("A1").Value = Worksheets(1).Range("A1").Value + 1" не работает. Поставил на неё мышку, нажал F5 - число инкрементируется, строка отрабатывает. Ну значит вызов самой функции не работает! Попробовал вот так просто получить значение: [vba]
Код
Function increm() MsgBox Worksheets(1).Range("A1").Value End Function
[/vba] Работает!
Я короче не понимаю, то ли я дурак, то ли у VBA какая-то своя "особая" логика. Помогите понять, что я делают не так. На всякий случай файл прилагаю. Спасибо заранее.blanco
Private Sub Workbook_BeforePrint(Cancel As Boolean) Worksheets(1).Range("A1").Value = Worksheets(1).Range("A1").Value + 1 End Sub
[/vba] будет работать по событию, только если он размещен в коде книги, а не в модуле. В проекте VBA правой клавишей по книге (левый верхний угол окна) и "View code".
Что касается функции. Если ее вызывать из макроса - сработает. А вот при вызовах из ячеек, видимо, изменение других ячеек блокируется.
Специальный макрос [vba]
Код
Private Sub Workbook_BeforePrint(Cancel As Boolean) Worksheets(1).Range("A1").Value = Worksheets(1).Range("A1").Value + 1 End Sub
[/vba] будет работать по событию, только если он размещен в коде книги, а не в модуле. В проекте VBA правой клавишей по книге (левый верхний угол окна) и "View code".
Что касается функции. Если ее вызывать из макроса - сработает. А вот при вызовах из ячеек, видимо, изменение других ячеек блокируется.Perfect2You
На счёт события я кажется понял, значит объект события находится в книге а не в модуле и его видимость ограничивается только книгой. Был бы признателен если бы ещё и почитать что нибудь дали на эту тему =) и вообще, посоветуйте хорошую литературу, для новичков в VBA но знакомых с программированием.
А на счёт блокировки изменений других ячеек не пойму, это как-то можно обойти, и от чего зависит?
На счёт события я кажется понял, значит объект события находится в книге а не в модуле и его видимость ограничивается только книгой. Был бы признателен если бы ещё и почитать что нибудь дали на эту тему =) и вообще, посоветуйте хорошую литературу, для новичков в VBA но знакомых с программированием.
А на счёт блокировки изменений других ячеек не пойму, это как-то можно обойти, и от чего зависит?blanco
А смысл обходить? Если в ячейку вводится функция (UDF), то ее задача получить значение, которое будет выведено в этой ячейке. Другие ячейки могут использоваться как поставщики данных, но менять-то их зачем? Там свое, функции опять же быть могут. Так что вполне логичная блокировка, на мой взгляд.
А обойти - запускайте из программы VBA. Проверил, при запуске из программы VBA этой функции требуемый инкремент произошел.
А смысл обходить? Если в ячейку вводится функция (UDF), то ее задача получить значение, которое будет выведено в этой ячейке. Другие ячейки могут использоваться как поставщики данных, но менять-то их зачем? Там свое, функции опять же быть могут. Так что вполне логичная блокировка, на мой взгляд.
А обойти - запускайте из программы VBA. Проверил, при запуске из программы VBA этой функции требуемый инкремент произошел.Perfect2You