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

» Excel VBA (часть 2)

Автор: ostapINTO
Дата сообщения: 19.05.2007 11:38
AndVGri
ОГРОМНОЕ СПАСИБО!! все сделала!!

Добавлено:
есть код

Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Address = "$A$1") And IsNumeric(Target.Value) Then
Select Case Target.Value
Case 55: Range("B1 1").Value = Array(33, 51, 14)

End Select
End If

End Sub

только есть проблемка вводим значения в А1 все гуд.
а как сделать следущий пункт тоесть А2 А3 ......

напрмер ввели 55 в А1 ентер А2 43 ентер А3 10... ??
Автор: AndVGri
Дата сообщения: 19.05.2007 17:02
ostapINTO
Переделай (недо смотрел)

Код:
If (Target.Column = 1&) And IsNumeric(Target.Value) Then
Select Case Target.Row
Case 1: Range("B1:C1").Value = Array(33, 51, 14)
Case 2: Range("B1:C1").Value = Array(...)
End Select
End If
Автор: ostapINTO
Дата сообщения: 19.05.2007 19:42
ПАСИБО!!!!!!!!!!
Автор: AndVGri
Дата сообщения: 20.05.2007 04:02
ostapINTO
И опять не досмотрел , добавь

Код:
Case 1: If Target.Value = 55 Then Range("B1:C1").Value = Array(33, 51, 14)
Автор: aks_sv
Дата сообщения: 21.05.2007 12:27
Подскажите, как обратиться к неактивной рабочей книге не зная ее название?
Автор: AndVGri
Дата сообщения: 21.05.2007 12:38
aks_sv
Workbooks(i), где i от 1 до Workbooks.Count
Только, если не знать названия, как будешь определять, нужная ли это книга? По содержимому листов? Они, кстати, точно также индексируются.
Автор: aks_sv
Дата сообщения: 21.05.2007 13:00
AndVGri
Спасибо. Книгу то я знаю какую, только каждый месяц у нее другое название.
Автор: kotovav86
Дата сообщения: 21.05.2007 18:04
Пытаюсь написать формулу
ActiveCell.Formula = "=(D2-D"&Finalrow&")/(D"&Finalrow&")"
, где Finalrow это Finalrow = Cells(65536, 1).End(xlUp).Row.
Vba выдает syntax error
Что здесь неправильно?
Автор: AndVGri
Дата сообщения: 21.05.2007 18:21
kotovav86

Цитата:
Finalrow&

Вот это. В таком виде VBA рассматривает & как суффикс длинного целого, а не как знак сцепления строк. Поставь пробелы после Finalrow.
Автор: kotovav86
Дата сообщения: 21.05.2007 18:25
Большое спасибо!!!
Автор: AbbatRusso
Дата сообщения: 22.05.2007 04:24
В Excel есть проверка вводимых значений в ячейках листов книги.

Каким образом можно проверять вводимые значения в ячейки контрола Microsoft SpreadSheet 10.0 средствами VBA?

Основная задача: сделать защиту от неправильного ввода значений в столбец таблицы контрола.

Пример: допускать ввода значения только от 0 до 24 или же выбирать из списка предложенных

Автор: AndVGri
Дата сообщения: 22.05.2007 08:13
AbbatRusso
Воспользуйся событием
Private Sub SpreadSheet1_SheetChange(ByVal Sh As OWC10.Worksheet, ByVal Target As OWC10.Range)
Автор: GreenRay
Дата сообщения: 22.05.2007 10:07

Есть файл kadry.xls.
В нем следующий скрипт:


Код:
Workbooks.Open Filename:= _
"\\Server1\Kadry\KADRY.DBF"
Sheets("KADRY").Select
Sheets("KADRY").Name = "Сотрудники"
Автор: FreeDOmCV
Дата сообщения: 22.05.2007 10:21
помогите ктото написать код для решения уравнения F(x)=0, используя елемент scriptcontrol.
Автор: AndVGri
Дата сообщения: 22.05.2007 10:26
GreenRay

Цитата:
открывался пустой файл .xls ?

А ты в этом уверен? Может у тебя это как раз

Цитата:
Есть файл kadry.xls.
В нем следующий скрипт:

с пустым рабочим листом? У меня никакого третьего файла не открывается.
Автор: AbbatRusso
Дата сообщения: 22.05.2007 13:40
Воспользуйся событием
Private Sub SpreadSheet1_SheetChange(ByVal Sh As OWC10.Worksheet, ByVal Target As OWC10.Range)

AndVGri
А можно поподробнее )))

У меня уже написан код для одного из обработчиков SpreadSheet, следующего содержания:

Private Sub Spreadsheet1_SelectionChanging(ByVal Range As OWC10.Range)
Dim СтрокаN As String
Dim Счетчик As Integer
For Счетчик = НачалоОбласти To КонецОбласти
СтрокаN = Счетчик
With Spreadsheet1.Sheets(1)
'вычисление дня недели ДатаН и заполнение столбца A
If .Range("B" + СтрокаN).Value = "" _
Then .Range("A" + СтрокаN).Formula = "" _
Else: _
.Range("A" + СтрокаN).Formula = _
ДеньНеделиСтр(Weekday(.Range("B" + СтрокаN).Value, 2))

'вычисление ДатыОкончания смены и заполнение столбца K
If .Range("B" + СтрокаN).Value = "" _
Then .Range("K" + СтрокаN).Formula = "" _
Else: _
.Range("K" + СтрокаN).Formula = _
ДатаОкончания(.Range("B" + СтрокаN).Value, _
.Range("E" + СтрокаN).Value, _
.Range("F" + СтрокаN).Value, _
.Range("G" + СтрокаN).Value, _
.Range("H" + СтрокаN).Value)

'вычисление дня недели ДатаН и заполнение столбца L
If .Range("B" + СтрокаN).Value = "" _
Then .Range("L" + СтрокаN).Formula = "" _
Else: _
.Range("L" + СтрокаN).Formula = _
ДеньНеделиСтр(Weekday(.Range("B" + СтрокаN).Value, 2))

'вычисление дня недели ДатаО и заполнение столбца M
If .Range("K" + СтрокаN).Value = "" _
Then .Range("M" + СтрокаN).Formula = "" _
Else: _
.Range("M" + СтрокаN).Formula = _
ДеньНеделиСтр(Weekday(.Range("K" + СтрокаN).Value, 2))

'вычисление отработанных часов и заполнение столбца I
If .Range("B" + СтрокаN).Value = "" _
Then .Range("I" + СтрокаN).Formula = "" _
Else: _
.Range("I" + СтрокаN).Formula = _
Отработанных(.Range("D" + СтрокаN).Value, _
.Range("B" + СтрокаN).Value, _
.Range("K" + СтрокаN).Value, _
.Range("E" + СтрокаN).Value, _
.Range("F" + СтрокаN).Value, _
.Range("G" + СтрокаN).Value, _
.Range("H" + СтрокаN).Value)
End With
Next
End Sub


Мне необходимо контролировать ввод данных с столбцы E и G (значения от 0 до 24),
F и H (значения от 0 до 59) и стобец D (выбор из списка значений: "Час подачи", "Час обед", "Час подачи/Час обед", "")
Автор: silver007
Дата сообщения: 22.05.2007 14:55
Подскажите, плз, как в Excel копировать инфу между двумя несвязанными диапазонами. Если это вообще возможно. Спасибо.
Автор: AndVGri
Дата сообщения: 22.05.2007 15:36
AbbatRusso
Ну, я так много расписывать не буду, только как организовать проверку

Код:
Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC10.Worksheet, ByVal Target As OWC10.Range)
On Erro GoTo errHandle
Dim vValue As Long
If Sh Is Spreadsheet1.Sheets(1) Then
If (Target.Row >= НачалоОбласти) And (Target.Row <= КонецОбласти) Then
Select Case Target.Column
Case 5, 7:
vValue = CLng(Target.Value)
If (vValue < 0) Or (vValue > 59) Then
MsgBox "Неверное значение минут"
Target.Select
End If
Case 5, 7:
vValue = CLng(Target.Value)
If (vValue < 0) Or (vValue > 23) Then
MsgBox "Неверное значение часа"
Target.Select
End If
Case 2:
'проверка списка, лучше всего организовать через Dictionary
End Select
End If
End If
Exit Sub
errHandle:
If Err.Numberl = 13 Then
MsgBox "В данную ячейку можно вводить только числовое значение"
Target.Select
End If
End Sub
Автор: AbbatRusso
Дата сообщения: 22.05.2007 16:01
Большое спасибо AndVGri за ответ
В Excel - это у меня реализовано, только 67 столбцов неудобно заполнять, да и работу эту хочется поручить разным людям.

Подскажи пожалуйста: где можно прочитать как пользоватся проверкой списка, через Dictionary?
Автор: silver007
Дата сообщения: 22.05.2007 16:25
AndVGri - респект.
Вывел из тупика - пытался использовать COPY и PASTE, а EXCEL ругался-
для несвязанных диапазонов не предусмотрено.
Все заработало.
Еще раз - спасибо.
Автор: AndVGri
Дата сообщения: 22.05.2007 16:30
AbbatRusso
Скачать отсюда, правда, теперь там проверяют на "подлинность". Так что в твоём случае применение
[more]
'Объявляешь переменную на уровне формы
Private pStateTypes As Object

'В коде инициализации формы создаёшь и заполняешь элементами списка
Private Sub UserForm_Initialize()
Set pStateTypes = CreateObject("Scripting.Dictionary")

pStateTypes.Add "Час подачи", ""
pStateTypes.Add "Час обед", ""
pStateTypes.Add "Час подачи/Час обед", ""
pStateTypes.Add "", ""
'...
End Sub

'Проверка на принадлежность списку
Case 4:
If Not pStateTypes.Exists(Target.Value) Then
MsgBox "Вводить следует только определённый тип"
Target.Select
End If
[/more]
Блин, упустил. В стандартной справке в Excel, что в VBA по Visual Basic Language Reference/Objects - есть описание по Dictionary
Автор: AbbatRusso
Дата сообщения: 22.05.2007 17:30
<b>AndVGri</b> использовал твой обработчик:

Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC10.Worksheet, ByVal Target As OWC10.Range)
On Erro GoTo errHandle
Dim ЗначениеЯчейки As Long
Dim Ячейка As Range
If Sh Is Spreadsheet1.Sheets(1) Then
If (Target.Row >= НачалоОбласти) And (Target.Row <= КонецОбласти) Then
Select Case Target.Column
Case 6, 8:
ЗначениеЯчейки = CLng(Target.Value)
If (ЗначениеЯчейки < 0) Or (ЗначениеЯчейки > 59) Then
MsgBox "Неверное значение минут"
Target.Select
End If
Case 5, 7:
ЗначениеЯчейки = CLng(Target.Value)
If (ЗначениеЯчейки < 0) Or (ЗначениеЯчейки > 24) Then
MsgBox "Неверное значение часа"
Target.Select
End If
Case 3:
'проверка списка, лучше всего организовать через Dictionary
End Select
End If
End If
Exit Sub
errHandle:
If Err.Numberl = 13 Then
MsgBox "В данную ячейку можно вводить только числовое значение"
Target.Select
End If
End Sub

При вводе значений выдает сообщение и переходит на строку вниз, неверное значение к сожалению остается, а при вводе текста, выдает: "Run time error 13" и выкидывает на строку: ЗначениеЯчейки = CLng(Target.Value)

Как исправить?


Добавлено:
<b>AndVGri</b> воспользовался твоим обработчиком:


Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC10.Worksheet, ByVal Target As OWC10.Range)
On Erro GoTo errHandle
Dim ЗначениеЯчейки As Long
Dim Ячейка As Range
If Sh Is Spreadsheet1.Sheets(1) Then
If (Target.Row >= НачалоОбласти) And (Target.Row <= КонецОбласти) Then
Select Case Target.Column
Case 6, 8:
ЗначениеЯчейки = CLng(Target.Value)
If (ЗначениеЯчейки < 0) Or (ЗначениеЯчейки > 59) Then
MsgBox "Неверное значение минут"
Target.Select
End If
Case 5, 7:
ЗначениеЯчейки = CLng(Target.Value)
If (ЗначениеЯчейки < 0) Or (ЗначениеЯчейки > 24) Then
MsgBox "Неверное значение часа"
Target.Select
End If
Case 3:
'проверка списка, лучше всего организовать через Dictionary
End Select
End If
End If
Exit Sub
errHandle:
If Err.Numberl = 13 Then
MsgBox "В данную ячейку можно вводить только числовое значение"
Target.Select
End If
End Sub

При вводе чисел вне диапазона:
переходит на ячейку вниз, оставляю неверное значение.
При вводе текста выдает ошибку VBA:
"Run time error 13" и ссылается на строку:
ЗначениеЯчейки = CLng(Target.Value)

Как исправить )
Автор: AndVGri
Дата сообщения: 22.05.2007 18:16
AbbatRusso

Цитата:
"Run time error 13"
посмотри в Tools/Options вкладка General не стоит ли переключатель на Break on all errors
По остальному
[more]
Исправь ошибки

Цитата:
On Erro GoTo errHandle

On Error GoTo errHandle

Цитата:
If Err.Numberl = 13 Then

If Err.Number = 13 Then

Вообще, для отлова описок добавляй Option Explicit (или включи в настройках Ruquire variable declaration). Перед запуском выполни Debug/Compile - получишь сообщения об ошибке в коде для исправления.


Цитата:
переходит на строку вниз

С этим бороться сложнее. Объяви переменную на уровне кода формы
Private ReturnCell As OWC10.Range

В Spreadsheet1_SheetChange
Добавь строку перед первым If
Set ReturnCell = Nothing.

Замени Target.Select на Set ReturnCell = Target

Добавь обработчик
Private Sub Spreadsheet1_SelectionChanging(ByVal Range As OWC10.Range)
Dim vRow As Long, vCol As Long
If Not (ReturnCell Is Nothing) Then
vRow = ReturnCell.Row: vCol = ReturnCell.Column
Spreadsheet1.Cells(vRow, vCol).Value = ""
Spreadsheet1.Cells(vRow, vCol).Select
Set ReturnCell = Nothing
End If
End Sub
[/more]
Автор: AbbatRusso
Дата сообщения: 22.05.2007 18:44
Огромнущее спасибо AndVGri
работает как часы )))

Можно ли список выпадающий сделать на ячейке SpreedSheet как на ячейке Excel?

Пробовал:

Spreadsheet1.ActiveSheet.Range("F7").Validation.Delete
Spreadsheet1.ActiveSheet.Range("F7").Validation.Add xlValidateList, xlValidAlertStop, , "1,2,3,4,5"

не работает

Автор: AndVGri
Дата сообщения: 22.05.2007 19:00
AbbatRusso

Цитата:
Можно ли список выпадающий сделать на ячейке SpreedSheet как на ячейке Excel?

Нет, не нашёл ничего похожего. Validation - это только к Excel Range, а не OWC10 Range.
Вообще то, для анализа правильности ввода предназначены StartEdit EndEdit, только вот не работают, как описано. Более детально с Spreadsheet работает The okk, правда, его давно не видно. Напиши ему в Личный ящик, вдруг ещё чем поможет.
Может, всё-таки, концепцию переделать для рабочих листов самого Excel? В чём такая проблема, так и не понял?
Например, выдавать пользователю, коль их несколько, запрос на имя пользователя и пароль, и по ним показывать лист только для заполнения этим пользователем, используя все "вкусности", предоставляемые Excel
Автор: AbbatRusso
Дата сообщения: 22.05.2007 20:08
AndVGri cпасибо сильно расширяшь мой кругозор.

У SpreadSheet есть возможность данные с URL грузить, и запустить его можно в виде одельной программы как COM объект. У меня есть работающая схема по аренде строительной и спец техники (Заказчик-ГенПодрядчик-Подрядчик-Сподрядчик) с моделью движения денежных средств в условия ограничения нашего законодательства и оптимизации налогообложения. По модели работает программа в Excel. Только пока с единственным пользователем - мной ). Планируется описать интерфейсы для всех участников:
Заказчик (Директор, Бухгалтер, Мастера, Прорабы);
ГенПодрядчик(Владельцы, ГенДиректор, Бухгалтер, Менеджеры);
Подрядчик(ГенДиректор, Бухгалтер, Диспетчеры);
СПодрядчик(ГенДиректор, Бухгалтер, Машинисты)
Десятки тысяч одновременных подключений к базе данных.
Естественно - это задача не для Excel.

На SpreadSheet отрабатывается вид интерфейса )

Пока лишь это приложение 2 уровня по терминологии OMG,
модель слегка ) описана в диаграммах UML

можешь мыло The Okk скинуть

Автор: GreenRay
Дата сообщения: 23.05.2007 11:01
AndVGri
Подскажите, как сделать чтобы было 1 окно.

p.s. Все нашел, спасибо.
Автор: The okk
Дата сообщения: 23.05.2007 13:51
AndVGri
Привет! Сейчас просто занят.

AbbatRusso

Цитата:
Можно ли список выпадающий сделать на ячейке SpreedSheet как на ячейке Excel?

Нет у этого объекта похожих вещей... к сожалению. Только если самому написать с WinAPI.


Цитата:
На SpreadSheet отрабатывается вид интерфейса )

Что значит "отрабатывается вид интерфейса"?
Автор: GFSGF
Дата сообщения: 24.05.2007 12:15
Добрый день. У меня вот такой вопрос .Можно ли отключить у помощника в Эксел его встроенную справку, т.е., чтобы когда я щёлкаю по нему не выходил баллон типа «введите свой вопрос». Я хочу ему присвоить только свои баллоны.
Автор: AndVGri
Дата сообщения: 24.05.2007 12:51
GFSGF
Похоже, что нет. это стандартный встроенный баллон. Да и как ты собираешься использовать щелчёк на помошнике, если у него нет никаких обработчиков событий? Можно ведь только отображать собственные баллоны, да привязать к баллону процедуру обработчик, если не устраивает ответ по Ballon.Show

Добавлено:
GFSGF
Разве что:
В обработчике событий: Workbook_Open, Workbook_SheetChange, Workbook_SheetSelectionChange, может и других отключать

Код:
Assistant.Visible = False
Assistant.AssistWithAlerts = False
Assistant.AssistWithHelp = False
Assistant.AssistWithWizards = False
'... и другие, смотри в Object Browser по свойствам с Boolean

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


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