Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA

Автор: Yuk
Дата сообщения: 25.04.2006 18:25
ScorpionS

Цитата:
вместо "$A$1" сделать ссылку на ячейку на другом листе, допустим Лист2, ячейка D12?


Код: Case Sheets("Лист2").Range("$D$12").Value
Автор: ScorpionS
Дата сообщения: 25.04.2006 19:42
Yuk


Цитата:
код будет выполняться при изменении ячейки C89

У меня тут один нюанс, значение в ячейке С89 (на листе "Формулы") я не меняю, эта ячейка привязана под Флажок (Элемент управления Формы).
У меня когда я устанавливаю (снимаю) флажок, автоматически не скрываются (не отображаются) строки. Нужно зайти в любую ячейку (F2), нажать Enter только после этого выполняется функция скрытия (отображения) строк. Как можно решить эту проблему, чтобы это происходило сразу после установки (снятия) флажка. Причем срабатывает только с таким кодом

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'If Target.Address = Sheets("Формулы").Cells(89, 3) Then
'Select Case Target.Address
'Case Sheets("Формулы").Cells(89, 3).Value

If Sheets("Формулы").Cells(89, 3).Value = 0 Then
Rows("4:7").Select
Selection.EntireRow.Hidden = True
Range("F3").Select
End If
If Sheets("Формулы").Cells(89, 3).Value = 2 Then
Rows("4:4").Select
Selection.EntireRow.Hidden = False
Rows("5:7").Select
Selection.EntireRow.Hidden = True
Range("F3").Select
End If
If Sheets("Формулы").Cells(89, 3).Value = 3 Then
Rows("4:5").Select
Selection.EntireRow.Hidden = False
Rows("6:7").Select
Selection.EntireRow.Hidden = True
Range("F3").Select
End If
If Sheets("Формулы").Cells(89, 3).Value = 4 Then
Rows("4:6").Select
Selection.EntireRow.Hidden = False
Rows("7:7").Select
Selection.EntireRow.Hidden = True
Range("F3").Select
End If
If Sheets("Формулы").Cells(89, 3).Value = 5 Then
Rows("4:7").Select
Selection.EntireRow.Hidden = False
Range("F3").Select
End If
'End Select
'End If

Application.EnableEvents = True
End Sub
Автор: Yuk
Дата сообщения: 25.04.2006 22:49
ScorpionS

Цитата:
чтобы это происходило сразу после установки (снятия) флажка

Дык надо сразу продумывать на какие события должна реагировать функция.
В твоем случае. зайди в код своей формы и выбери функцию CheckBox1_Change() (или как там называется твой флажок). Вот туда и вставляй код.
Обрати внимание на выпадающие списки вверху панели с кодом (объект и событие). Там можно выбрать на какое событие будет реагировать твоя функция.

Цитата:
Если я использую Case или Target (выделено курсивом), то не срабатывает.

Сработает, если изменишь значение в С89 в листе "Формулы".
Цитата:
P.S. Кстати, когда я сменил SelectionChange на Change, то у меня и без Application.EnableEvents в цикл не попадает.

Естественно, так как у тебя нет в функции Change изменения значения ячейки, вот и не зацикливается. Пойми, что функции Change и SelectionChange отрабатывают разные события. Соответственно изменение значения ячейки и изменение позиции курсора.

Добавлено:
ScorpionS
Очень советую понять, что делает каждая строчка кода. Используй брейкпоинты (F9) и watch (Shift-F9), чтобы отслеживать значения переменных. Поможет понять, почему не срабатывает функция.
Удачи.
Автор: pavelac
Дата сообщения: 28.04.2006 12:08
Помогите понять, что к чему
Модуль написаный на VBA в книге MS EXEL 2000 отказвается работать под
MS EXEL 2003
выдает ошибку:
Run-time error '91':
Object varible or With block varible not set
под 2000-м офисом все нормально ...
кусок кода, ошибочная строка красным:
Sub zapol()

Const ForReading = 1, ForWriting = 2, ForAppending = 3
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Dim fs, f, ts, s
fileToOpen = Application _
.GetOpenFilename("INI Files (*.INI), *.ini")
If fileToOpen <> False Then
MsgBox "Open " & fileToOpen
End If
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(fileToOpen)
Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault)
Set ts = fs.OpenTextFile(fileToOpen, ForReading, TristateUseDefault)

Do While ts.AtEndOfStream <> True
s = ts.ReadLine
...
Автор: Yuk
Дата сообщения: 28.04.2006 17:45
pavelac

Все работает.
MS Excel 2003 (11.6355.6360) SP1

А что за файл пытаешься открыть и где?
Какое значение у fileToOpen?
Автор: pavelac
Дата сообщения: 02.05.2006 09:05
Yuk
Теперь все нормально, разбрался ...
5-й касперский втихомолку запретил использование команды
CreateObject("Scripting.FileSystemObject")
в результате получилось, что fs=Nothing и т.д.
Автор: ScorpionS
Дата сообщения: 02.05.2006 18:03
Yuk
Подскажи, пожалуйста, как правильно записать код. Что вместо ?НЕ УСТАНОВЛЕН?

Код:

Private Sub CheckBox1_Change()
If CheckBox1 = ?НЕ УСТАНОВЛЕН? Then
Rows("5:8").Select
Selection.EntireRow.Hidden = True
Range("F3").Select
Else
Rows("5:8").Select
Selection.EntireRow.Hidden = False
Range("F3").Select
End Sub
Автор: DONRU1
Дата сообщения: 02.05.2006 18:11
If CheckBox1 = false Then
Автор: ScorpionS
Дата сообщения: 02.05.2006 18:25
DONRU1
СПАСИБО! У меня так не получалось, оказывается я забыл End If, а я думал, что Flse неправильно.
А если я добавляю ComboBox1 (поле со списком) где указать данные этого списка, нужно чтобы в списке отображалось 1, 2 и 3
Автор: DONRU1
Дата сообщения: 02.05.2006 18:30
где угодно
ComboBox1.AddItem 1
ComboBox1.AddItem 2
ComboBox1.AddItem 3
Автор: ScorpionS
Дата сообщения: 02.05.2006 18:35
Я вставляю такой код. Не получается. Что не так?

Код:
Private Sub ComboBox1_Change()
ComboBox1.AddItem 1
ComboBox1.AddItem 2
ComboBox1.AddItem 3
End Sub
Автор: DONRU1
Дата сообщения: 02.05.2006 18:43
нет не так.
Если ComboBox1 находится на UserForm то

Private Sub UserForm_Initialize()
ComboBox1.AddItem 1
ComboBox1.AddItem 2
ComboBox1.AddItem 3
End Sub

Т.е. запонять ComboBox1 надо до его выполнения
Автор: ScorpionS
Дата сообщения: 02.05.2006 18:47
И так не получается. Объясни подробней, plz. У меня ComboBox1 (поле со списком) находится на листе Лист1 (там же, где и CheckBox1). Что такое UserForm?
Автор: DONRU1
Дата сообщения: 02.05.2006 19:01
Хм. Ну если на листе, то можно заполнять ComboBox1 либо при открытии книги либо при нажатии на CheckBox1.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
В данном случае условием заполнения является выбор(активация) листа - "Лист1"

Private Sub Workbook_Open() при открытии книги
Worksheets("Лист1").ComboBox1.AddItem 1
Worksheets("Лист1").ComboBox1.AddItem 2
Worksheets("Лист1").ComboBox1.AddItem 3
end sub
Автор: Yuk
Дата сообщения: 02.05.2006 21:47
ScorpionS
Используй либо событие активации листа Worksheet_Activate(), либо как DONRU1 указал, событие открытия книги Workbook_Open(). Selection_Change очень не рекомендую, будет реагировать на каждую смену положения курсора, что может жутко замедлить работу.
Автор: ScorpionS
Дата сообщения: 03.05.2006 12:15
Workbook_Open почему-то не срабатывает при открытии книги, а Worksheet_Activate() срабатывает только если перейти на другой лист, а потом на Лист1, а если изначально книга открывается на этом листе (а так оно и есть), то не срабатывает.
Я сделал вот так

Код:
Private Sub CheckBox1_Click()
If CheckBox1 = True Then
Worksheets("Досье").ComboBox1.AddItem 1
Worksheets("Досье").ComboBox1.AddItem 2
Worksheets("Досье").ComboBox1.AddItem 3
Else
что сюда надо вставить
End If
End Sub
Автор: Yuk
Дата сообщения: 03.05.2006 20:10
ScorpionS

Цитата:
Workbook_Open почему-то не срабатывает при открытии книги

Ты уверен? Поставь туда что-то типа MsgBox "Книга открыта".

Цитата:
что сюда надо вставить

Что-то типа:

Код: While ComboBox1.ListCount
ComboBox1.RemoveItem 0
Wend
ComboBox1.Value = ""
Автор: Super_Puper
Дата сообщения: 04.05.2006 10:37
Подскажите, пожалуйста, как применять Worksheet_Calculate или Workbook_SheetCalculate.
Мне необходимо, что бы макрос выполнялся при каждом перерасчёте формул на листе.
Автор: Yuk
Дата сообщения: 04.05.2006 17:35
Я уже писал раньше:

Цитата:
Нажимаешь Alt-F11 (VBA редактор). Находишь слева свой файл, под ним ThisWorkbook (надеюсь, в русском как и в английском Excele). Двойным кликом по нему открываешь справа код ThisWoorbook (Код).


Цитата:
Обрати внимание на выпадающие списки вверху панели с кодом (объект и событие). Там можно выбрать на какое событие (SheetCalculate) будет реагировать твоя функция.
Вот туда и вставляй код.

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

Автор: ScorpionS
Дата сообщения: 04.05.2006 19:27
Что не так записываю, пытаясь указать ячейку на (другом) листе Формулы

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
If "Формулы!$A$103" = 0 Then
Range("107:107").Select
Selection.EntireRow.Hidden = False
Range("108:331").Select
Selection.EntireRow.Hidden = True
Range("A3").Select
End If
End Sub
Автор: DONRU1
Дата сообщения: 04.05.2006 22:22
ScorpionS
If worksheets("формулы").cells(103,1) = 0 then
Автор: Super_Puper
Дата сообщения: 05.05.2006 08:55
Yuk
Спасибо! Просто гениально придумано!
Теперь я смотрю на ВБА другими глазами..
Автор: ScorpionS
Дата сообщения: 05.05.2006 09:45
DONRU1
Спасибо! Подскажите, нужно чтобы тобразилась строка 107 и скрылись строки с 108 по 331. Вроде код такой

Код:
Range("107:107").Select
Selection.EntireRow.Hidden = False
Range("108:121").Select
Selection.EntireRow.Hidden = True
Автор: Yuk
Дата сообщения: 05.05.2006 18:19
Super_Puper

Цитата:
Просто гениально придумано!



ScorpionS
А вот так?

Код: Range("F108:F121").Select
Selection.EntireRow.Hidden = True
Автор: ScorpionS
Дата сообщения: 06.05.2006 13:28
Yuk
Спасибо! Все заработало как надо.
Автор: MOCT
Дата сообщения: 07.05.2006 00:05
возник вопрос - почему при работе с некоторыми файлами, у которых в соответствующих свойствах ничего не содержится, появляется ошибка (Automation Error) при использовании конструкций вида:

Dim sUserFileEx As Excel.WorkBook
...
sUserFileEx.BuiltInDocumentProperties(wdPropertyTimeLastSaved)

аналогичная ошибка появляется для свойств wdPropertyRevision и wdPropertyVBATotalEdit
Автор: maidenmarion
Дата сообщения: 07.05.2006 10:55
Люди добрые подскажите, кто знает.. Задача: есть база в xls файле.. Через запросы SQL нормально проходит и INSER INTO и SELECT FROM.. Однако требуется комбинированный запрос.. ТОесть результат запроса SELECT вставить как исходные данные оператора INSERT.. В книге по SQL есть вид запроса.. Однако в EXCEL с этим проблема.. Для SELECT FROM нужно результат копировать в Recordset.. Если кто сталкивался, помогите пожалуйста.. Просьба не предлагать перевести EXCEL в "нормальную базу данных".. Т.к этот способ не приемлем для текущей работы.. Заранее спасибо
Автор: Yuk
Дата сообщения: 07.05.2006 18:52
MOCT
По-моему, wdProperty..., только для Ворда.
Автор: MOCT
Дата сообщения: 07.05.2006 20:33

Цитата:
По-моему, wdProperty..., только для Ворда.

нет, все правильно - wdProperty* одни на все семейство Офиса.

кстати, если кому будет интересно, судя по всему ответ на мой вопрос - это листинг 4 на странице http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/VBA/Word/382.mspx
но помогает, почему-то, только для wdPropertyRevision, а для wdPropertyTimeLastSaved, wdPropertyTimeLastPrinted, wdPropertyVBATotalEdit проблема остается
Автор: Yuk
Дата сообщения: 08.05.2006 00:36
MOCT

Цитата:
wdProperty* одни на все семейство Офиса

Ну, не знаю. У меня с wdProperty* ничего не заработало в экселе. Но зато работает вот такой скрипт:

Код: Sub AllProperties()
Dim myIndex As Integer
Dim MyString As String
With ActiveWorkbook
For myIndex = 1 To .BuiltinDocumentProperties.Count
MyString = ("'" & myIndex & ". " & _
.BuiltinDocumentProperties(myIndex).Name)
Worksheets(1).Cells(myIndex, 1).Value = MyString
Worksheets(1).Cells(myIndex, 2).Value = _
.BuiltinDocumentProperties(myIndex).Value
On Error Resume Next
Next myIndex
End With
End Sub

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.