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

» Excel VBA (часть 2)

Автор: Slatsik
Дата сообщения: 13.10.2008 22:15

Цитата:
Перехват события "окно вывода сообщения об ошибке" и ...
1) отображение на этой форме своего сообщения, либо
2) запуск по этому событию своего макроса


Странно, я был уверен, что здесь всяко-разно что-то присоветуют %)
Автор: SERGE_BLIZNUK
Дата сообщения: 14.10.2008 19:29
Slatsik, во-первых, учтите, не только Вы можете сообразить кинуть Ваш вопрос на другие форумы, но и мы вполне даже в состоянии увидеть на других форумах не только Ваш вопрос, но и даже ответы на него (я имею в виду planetaexсel.ru :-)
во-вторых, поймите, на VBA можно сделать что угодно - но СДЕЛАТЬ, а вот изменять системные функции, "залазить" в ядро Excel, перехватить системные сообщения — Вам никто не даст ;-( поэтому, либо всё делайте на VBA, либо забудьте о
"перехвате события "окно вывода сообщения об ошибке" "... как это ни печально.. ;(
Автор: nick7inc
Дата сообщения: 14.10.2008 21:50
Slatsik
Цитата:
Перехват события "окно вывода сообщения об ошибке" и ...
[...]
дано: лист заблокирован, при попытке изменить значение в защищенной ячейка высвечивается ошибка, что "лист заблокирован и т.п."

Цитата:
Странно, я был уверен, что здесь всяко-разно что-то присоветуют %)

Проще сделайте. Вместо блокировки листа и перехвата сообщения об ошибке просто отслеживайте редактирование данных на листе и изменение выделения.

Код: Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
...
End Sub
Автор: SantOtche
Дата сообщения: 15.10.2008 15:22
Всем доброго времени суток!

У меня довольно-таки глупый вопрос, но я ответа так и не нашел.
Суть такова:
На форме есть 20 TextBox'ов - TextBoxCena1, TextBoxCena2, ... , TextBoxCena20
На каждый TextBox установлен код:

Private Sub TextBoxCena1_Change()
CenaChange (Form1.TextBoxCena1)
End Sub

Общий код для обработки изменений:

Private Sub CenaChange (TextBoxControl as Control)
Dim MyString As String
Dim DecimalSymbol As String
DecimalSymbol = Application.International(xlDecimalSeparator)
MyString = TextBoxControl.Value
MyStringLenght = Len(MyString)
If Right(MyString, 1) Like "[0-9]" = True Or Right(MyString, 1) Like DecimalSymbol = True Then
If MyString Like "*" & DecimalSymbol & "*" & DecimalSymbol & "*" = True Then
MyString = Left(MyString , MyStringLenght - 1)
End If
Else
If MyString > "" Then
MyString = Left(MyString, MyStringLenght - 1)
End If
End If
MyString = Replace(MyString, ".", ",")
TextBoxControl.Value = CDbl(MyString)
End Sub

Проблема в том что "CenaChange (Form1.TextBoxCena1)" передает не "Control", а значение поля.
Подскажите пожалуйсто как реализовать эту байду?

С уважением,
Александр
Автор: sandm566
Дата сообщения: 15.10.2008 15:28
подскажите, каким способом возможно удалить из листа все объекты shapes в виде линий?
т.е.
на листе есть разные объекты типа shapes
в т.ч. которые бодавлены через Shapes.Addline

код вроде этого - удаляет все объекты типа Shapes

Dim img As Object

For Each img In ActiveSheet.Shapes
'if img - ???????
img.Delete

Next

=====
заранее благодарю, если кто подскажет )
Автор: MaximuS G
Дата сообщения: 15.10.2008 16:20
Ребята подскажите как записать такое:
Sheets(Array(1, 2, 3, 4, 5)).Select скажем если листов штук 100 а вставить все цифры в массив это ... может есть вариант ? СПС
Автор: dneprcomp
Дата сообщения: 15.10.2008 21:33
SantOtche
Каждый контрол возвращает дефолтное значение. Для TextBox это text. Вот оно и передается в функцию. Попробуй
Код: Private Sub CenaChange (TextBoxControl msforms.TextBox)
Автор: Slatsik
Дата сообщения: 15.10.2008 22:28
nick7inc - спасибо!

я пробовал такой вариант - частично он позволяет решить поставленную задачу. если бы все делалось для себя, то никаких проблем - можно было бы и не заморачиваться. а так... неизвестно, кто будет работать с приложением
при проверке изменений на листе остаются след. прорехи (как минимум):
1) при множественном выделении ячеек и нажатии клавиш ctrl-enter выдается ошибка, так как событие change отслеживается для текущей ячейки, запрет на выделение более одной ячейки не проходит, потому как мне это самому (приложению) нужно. блокировка нажатий ctrl-enter - без проблем - только, боюсь, что это не одна такая комбинация: вдруг есть подобные.
2) что делать с маркером автозаполнения? тоже отключать?
3) возможно, что-то есть еще - все перекрыть сложно и путано, тем более самому нужно заполнять множество ячеек (программно), а потому будет постоянное переключение настроек, когда можно, когда нельзя

Блокировка/разблокировка листа в этом смысле безопасней

Еще раз спасибо!
Автор: nick7inc
Дата сообщения: 15.10.2008 22:29
sandm566

Цитата:
подскажите, каким способом возможно удалить из листа все объекты shapes в виде линий?

Так вы почти всё сделали. Надо было лишь поставить после строки 'if img оператор STOP и под отладчиком посмотреть параметры объекта img. Там есть поле Type.

Код: Private Sub CommandButton1_Click()
Dim img As Object

For Each img In ActiveSheet.Shapes
If img.Type = msoLine Then img.Delete
Next
End Sub
Автор: Slatsik
Дата сообщения: 15.10.2008 22:57
SantOtche
по-моему, при объявлении

Код: Private Sub CenaChange (ByRef TextBoxControl as Control)
Автор: nick7inc
Дата сообщения: 15.10.2008 23:06
Slatsik
Я дополнил свой предыдущий ответ. Могу дать пример с выделением и изменением.
Автор: SantOtche
Дата сообщения: 16.10.2008 08:56

Цитата:
Каждый контрол возвращает дефолтное значение. Для TextBox это text. Вот оно и передается в функцию. Попробуй
Код:Private Sub CenaChange (TextBoxControl msforms.TextBox)


Это не работает

Может еще что то попробовать можно?
Люди добрые, поможите советом пожалуйсто.

С уважением,
Александр
Автор: Cheerful_a_bear
Дата сообщения: 16.10.2008 08:59
Доброго времени суток...

Нужна помощь.
Написал макрос, он прекрасно работает...
Он привязан к событию Workbook_Open

Этот макрос должен обрабатывать лист полученный из 1Cv8? для этого программер 1С в своей обработке открывает книгу, и соответственно мой макрос начинает действовать, и выгрузка данных из 1С не проходит.

Подскажите или тыкните носом, что предпринять, чтобы макрос не запускался про обращении из 1С.
За ранее спасибо.
Автор: q1wed
Дата сообщения: 16.10.2008 09:33
первое что пришло в голову: договориться с программером, что по окончании выгрузки из 1С его обработка втыкает в какую нибудь ячейку какое-нить контрольное значение, а твой макрос отслеживает не открытие книги, а изменения в этой ячейке и как только оно становится равно контрольному начинает действовать.
Автор: Cheerful_a_bear
Дата сообщения: 16.10.2008 10:36
Хорошее решение....

Спасибо...
А нет ли более красивых решений....?

Эта книга - заказ клиенту, то есть он там забивает циферки, и присылает обратно, и весь его заказ автоматом импортируется в 1С....

Автор: q1wed
Дата сообщения: 16.10.2008 11:10
то есть ты говоришь о том что бы когда клиент открыл файл макрос еще раз сработал или че?? в какую сторону красоту придумывать?
может быть с программером переговорить - я вот совсем не знаю что может и что не может 1С в ексель передавать, былоб клево еслиб 1с просто макрос запускал да и все, очень красиво бы было.
Автор: nick7inc
Дата сообщения: 16.10.2008 12:37
SantOtche

Цитата:
Проблема в том что "CenaChange (Form1.TextBoxCena1)" передает не "Control", а значение поля.
Подскажите пожалуйсто как реализовать эту байду?

У меня передаёт Control. [more=далее]
Сделал простую форму с двумя полями для текста и кнопкой "Закрыть".

Код:
Sub start()
UserForm1.Show
End Sub

Private Sub CommandButton1_Click()
Hide
End
End Sub

Private Sub TextBox1_Change()
mysub TextBox1
End Sub

Sub mysub(v As Control)

Debug.Print TypeName(v)

End Sub


Private Sub TextBox2_Change()
mysub TextBox2
End Sub
Автор: MaximuS G
Дата сообщения: 16.10.2008 13:18
dneprcomp

Цитата:
Dim X as Ineger

For x=1 to 100
Sheets(X).Select
Next X


СПС, но так он сделает не то что надо... он просто по порядку выделит каждый лист, а я хотел выделить все сразу ... может если не так Sheets(Array(1, 2, 3, 4, 5)).Select , то что-то другое посоветуете ?
Автор: SantOtche
Дата сообщения: 16.10.2008 13:35
nick7inc
Огромное спасибо, все работает.

Проблема была в том что я передавал Control:

Код: CenaChange (Form1.TextBoxCena1)
Автор: nick7inc
Дата сообщения: 16.10.2008 14:25
MaximuS G

Код:
Dim i As Integer, s1(1 To 3) As Integer

For i = 1 To 3
s1(i) = i
Next i

Sheets(s1).Select
Автор: MaximuS G
Дата сообщения: 16.10.2008 15:00
nick7inc
М-да Спасибо большое... как я не додумался вообще не указывать елементы массива...

ВСЕМ
Подскажите кто знает, почему не работает код под Outlook, скорее всего ошибка синтаксиса, хотя на сайте написано что все должно работать... вот ссылка на сайт
http://www.realcoding.net/teach/outlook/4/Index30.htm
Заранее спасибо!


Код:
Sub Init_Series()
Dim inifile As Integer
Dim srv As String
inifile = FreeFile
iniPath = "C:\bookseries.ini"
Open iniPath For Input As tinifile
Do
Input tinifile(ошибка сдесь пишет expected #),tmp series.Addltem tmp
Loop Until EOF(inifile)
Series.Listlndex = 0
End Sub
Автор: dneprcomp
Дата сообщения: 16.10.2008 19:12
MaximuS G
srv = Input(1, #1) ' Get one character.

Syntax:
Input(number, [#]filenumber)

The Input function syntax has these parts:

Part Description
number Required. Any valid numeric expression specifying the number of characters to return.
filenumber Required. Any valid file number.



Автор: MaximuS G
Дата сообщения: 17.10.2008 09:39
dneprcomp
СПС, но все равно у меня ничего не получается... Если не тяжело, приведите пожалуйста полный код...Сделал так:

Open iniPath For Input As #1
srv = Input(1, #1) ,(теперь ошибка здесь - expected end of statement) tmp Series.AddItem tmp

И если не тяжело объясните что делает вот эта строка tmp Series.AddItem tmp
СПС

Добавлено:
dneprcomp
Все, разобрался! , не знаю как у них он работал...
Спасибо за помощь!
Автор: Cheerful_a_bear
Дата сообщения: 17.10.2008 16:29
Доброго времени суток.

Народ подскажите есть ли метод создания формы программно из тела макроса?
А также удаление этой формы?
Автор: CEMEH
Дата сообщения: 19.10.2008 00:24
Вопрос
dim a as string
a= ' полный путь к папке, где лежит эта книга.

Собственно нужно получить а. В коде придется писать ссылки на другие файлы в том числе и не .xls. Подскажите, есть ли решение проблемы? Все эти файлы вместе с рабочей книгой лежат в одной папке, а вот папка может быть где попало. Вообще-то она на флешке но на разных компах диск "флешка" будет под разными буквами
Автор: dneprcomp
Дата сообщения: 19.10.2008 01:09
CEMEH
Application.Path
Автор: CEMEH
Дата сообщения: 19.10.2008 10:16
dneprcomp
Не совсем то, что хотелось бы получить
а="C:\Program Files\Microsoft Office\Office12"
Хотя файл на флешке
Автор: q1wed
Дата сообщения: 19.10.2008 12:57
CEMEH
ThisWorkbook.FullName - Путь до файла
ThisWorkbook.Path - до папки
Автор: CEMEH
Дата сообщения: 19.10.2008 22:17
q1wed
Спасибо огромное! Работает.

Еще вопросик:
Есть две кнопки. Надо сделать, что бы по их нажатию выполнялась подпрограмма

Код:
Private Sub CommandButton3_Click() ' вверх
X=X+1
go ПОДПРОГРАММА
End Sub

Private Sub CommandButton4_Click() ' вверх
X=X+1
go ПОДПРОГРАММА
End Sub

ПОДПРОГРАММА
' бла-бла-бла
return
Автор: q1wed
Дата сообщения: 20.10.2008 05:26
CEMEH

Код: Private Sub CommandButton3_Click() ' вверх
X=X+1
ПОДПРОГРАММА
End Sub

Private Sub CommandButton4_Click() ' вверх
X=X+1
ПОДПРОГРАММА
End Sub

sub ПОДПРОГРАММА
' бла-бла-бла
End Sub

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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