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

» Excel VBA (часть 2)

Автор: nick7inc
Дата сообщения: 01.01.2008 00:23
toNk

Цитата:
В книге есть объект (кнопка), на которую завязан макрос из этой книги. При копировании в другую книгу (где есть такой же макрос), на кнопке остается ссылка на макрос в первой книге....


Попробовал сделать так: [more=Далее]Создаю книгу1, сохраняю, создаю книгу2, сохраняю. В книге1 на листе1 создаю кнопку. Щёлкаю по ней (в режиме конструктора), создаётся макрос в листе1 книги1. Пишу код в нем. Далее копирую мышкой весь лист1 из книги1 в книгу2. Лист скопировался с кнопкой и макросом, привязанным к листу. При просмотре свойств кнопка связана с кодом в книге2 на листе "Лист1 (2)" (копия листа1 книги1).[/more]

Возможно вы привязываете макрос, созданный вне листа, в котором у вас кнопка, например, в каком-либо модуле или в "ЭтаКнига". Тогда при копировании вполне резонно предположить, что копия кнопки будет ссылаться на старый макрос. В моём примере макрос привязан к листу, и при копировании листа целиком он переходит вместе с кнопкой.


Добавлено:
Если у вас будет много документов, то чтобы не править основной код во всех документах (во время отладки и/или модификации программы) советую вам в макросе, вставленный в лист (тот, что непосредственно вызывается при нажатии кнопки) вставить переадресацию на макрос, находящийся в вашем Addin'е, в котором и будет располагаться основной код программы. В этом случае вам необходимо будет править код в одном файле, а не во всех, что его используют.
Автор: kalinakrasnay
Дата сообщения: 01.01.2008 19:50
Снова вопросец. опять же по работе со строками. имеется список фамилий /иванов/ли/ (переменная rab в программе) и т.д.
их нужно засунуть в комбобокс (то что между слешами - строка комбобокса).
делаю так:

Цитата:
Private Sub reg_Click()
nachalo = 2
Do While nachalo < Len(rab)
'добавление строки с фамилией в комбобокс
rabotniki.AddItem (Mid(rab, nachalo, вот здесь должна быть длина фамилии)))
nachalo = nachalo + Len(rabotniki.List(n))
Loop
End Sub

вся проблема в длине фамилии, она ведь разная и как ее можно узнать?

Добавлено:
сама поняла что нужно сделать :
sl = InStr(nachalo, rab, "/")
rabotniki.AddItem (Mid(rab, nachalo, sl - nachalo))
дальше уж я разберусь/))))))))
Автор: dneprcomp
Дата сообщения: 01.01.2008 20:28
kalinakrasnay

Код: Dim astrWords() As String
Dim strText As String
Dim X As Integer
Dim I As Integer

strText = ("иванов/петров")
astrWords = Split(strText, "/")
I = UBound(astrWords)

For X = 0 To I
rabotniki.AddItem (astrWords(X))
Next
Автор: AndVGri
Дата сообщения: 02.01.2008 02:55
kalinakrasnay
dneprcomp
А так не проще?

Код:
rabotniki.List = VBA.Split("com/ru/su/org", "/")
Автор: dneprcomp
Дата сообщения: 02.01.2008 03:10
AndVGri
Может быть и проще. У меня несколько "канонический" пример, который будет работать без вопросов. В твоем же случае вопрос у тебя уже возник...
Кроме того, kalinakrasnay в коде подсчитывала количество строк. Т.ч. я учел это, введя переменную I
Автор: kalinakrasnay
Дата сообщения: 02.01.2008 11:48
dneprcomp
AndVGri
спасибо!! воспользуюсь я своим вариантом, а из Ваших кодов изучу новые для функции работы со строками, это мне пригодится!
Автор: surly
Дата сообщения: 03.01.2008 14:30
ребят, подскажите хоть как написать функцию на ВБА типа ОКРУГЛТ(число, Число_разрядов).......В вба ваще не шарю, цель сдать зачет и фсе(
Синтаксис
Число — округляемое число.
Число_разрядов — количество десятичных разрядов, до которого нужно округлить число.

Заметки
Если число_разрядов больше 0, то число округляется до указанного количества десятичных разрядов справа от десятичной запятой.
Если число_разрядов равно 0, то число округляется до ближайшего целого.
Если число_разрядов меньше 0, то число округляется слева от десятичной запятой.
Автор: nick7inc
Дата сообщения: 03.01.2008 15:36
surly
Что-то вроде этого (тестить надо, за правильность голову на отсечение не даю):
Код: Function OOO(ByVal Val As Double, ByVal orders As Long) As Double
Dim whole As Double


Select Case orders
Case Is = 0
OOO = Sgn(Val) * Fix(Abs(Val) + 0.5)
Exit Function
Case Is < 0
whole = Round(Val)
orders = Abs(orders)
OOO = Round(whole / (10 ^ orders)) * (10 ^ orders)
Exit Function
Case Is > 0
OOO = Round(Val, orders)
End Select

End Function
Автор: SERGE_BLIZNUK
Дата сообщения: 03.01.2008 17:06
nick7inc
Цитата:
Function OOO(ByVal Val As Double, ByVal orders As Long) As Double

Это новогодняя шутка?! ;-))))
а чем =ОКРУГЛ() (он же ROUND() не угодил?... ;-))


surly
в VBA есть Round
Returns a number rounded to a specified number of decimal places.
Syntax: Round(expression [,numdecimalplaces])

она делает то, что Вам нужно
т.е. Вам нужно типа того:
Код:
Function ОКРУГЛТ(ByVal MyNumber As Double, ByVal NumDigits As Long) As Double
ОКРУГЛТ = Round(MyNumber, NumDigits)
End Function
Автор: andrejka k
Дата сообщения: 03.01.2008 20:09
Здравствуйте. В интернете нашел надстройку для Excel (KaotiXLdemo.xla), предназначенную для проведения R/S-анализа. При запуске надстройки выскакивает окошко с сообщением «Run-time error '1004': Application-defined or object-defined error» и активной остается лишь кнопка «End», завершающая работу с программой. Это я проделал в Excel 2000. Я попробовал запустить надстройку под Excel 97 – вообще ничего не запускается. Однако человек, посоветовавший мне эту надстройку, протестировал ее на своей машине, и сказал, что все работает замечательно.
Подскажите, в чем может быть причина ошибки и как эту ошибку можно исправить??? Есть предположение, что причиной может быть сам Excel, поскольку надстройка работала в немецкоязычной версии приложения. Но как оно есть на самом деле, я к сожалению не знаю.
Заранее спасибо.
P.S.: Речь идет о надстройке KaotiXLdemo (80 kb), которую можно скачать по ссылке
http://www.xlpert.com/download_demo_version.htm
Автор: nick7inc
Дата сообщения: 03.01.2008 23:36
SERGE_BLIZNUK

Цитата:
Это новогодняя шутка?! )))
а чем =ОКРУГЛ() (он же ROUND() не угодил?... )


А вы попробуйте для отрицательных значений Число_разрядов его вызвать. У меня - не пашет (Excel 2000, VBA).
surly

Цитата:
Если число_разрядов равно 0, то число округляется до ближайшего целого.
Если число_разрядов меньше 0, то число округляется слева от десятичной запятой.


С нулём, честно, не проверял. Может и зря условие CASE сделал.

Потом, код surly нужен надо для зачёта. Не пустой же лист ему нести?
Добавлено:
andrejka k

Цитата:
В интернете нашел надстройку для Excel


Цитата:
Однако человек, посоветовавший мне эту надстройку, протестировал ее на своей машине, и сказал, что все работает замечательно.
Подскажите, в чем может быть причина ошибки и как эту ошибку можно исправить???

Какой версией Excel тот человек тестировал? Может она для 97/2000 не годится без "доработки напильником".
Добавлено:
После вскрытия обнаружено, что KaotiXLdemo.xla падает при старте на команде:

Код: MenuBars(xlWorksheet).Menus.Add "&KaotiXL", "Help"
Автор: SERGE_BLIZNUK
Дата сообщения: 04.01.2008 10:37
nick7inc

Цитата:
А вы попробуйте для отрицательных значений Число_разрядов его вызвать. У меня - не пашет (Excel 2000, VBA).

да.. Вы правы... MS в своём репертуаре ;-(( две одинаковые функции, а работают по разному!!
в VBA Round не берёт отрицательные значения числа разрядов,
а ОКРУГЛ (он же WorksheetFunction.Round) прекрасно берёт ;-))

Код:
Function ОКРУГЛТ(ByVal MyNumber As Double, ByVal NumDigits As Long) As Double
' ОКРУГЛТ = Round(MyNumber, NumDigits)
ОКРУГЛТ = WorksheetFunction.Round(MyNumber, NumDigits)
End Function
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 09:46
Привет! можно ли в экселе, например по нажатию на кнопку установить событие показ диалога обзора папок, ну там потом пользователь выбирает какую-то конкретную папку и я могу получить доступ ко всему что там лежит (запомнить имена файлов с расширением). как сделать? мож есть какой другой диалог или способ?
(если можно покажите, натолкните на вариант по-проще)!
все что находила в инете на этот счет (диалог обзора папок) очень трудно было написано и замудрено....один гемор, ниче не понятно, программы на 2 экрана....конечно если по-проще не бывает...откажусь от этой затеи...
Автор: nick7inc
Дата сообщения: 05.01.2008 11:54
kalinakrasnay

Цитата:
Привет! можно ли в экселе, например по нажатию на кнопку установить событие показ диалога обзора папок,

Не уверен, что я вас правильно понял.... Если вас интересует, как выбрать папку и получить список файлов, то это две разные операции. Насколько я знаю, штатного диалога выбора папок в VBA нет. Есть 2 варианта:
1) Использовать диалог SaveAsFilename:

Код: Dim fileSaveName as Variant
fileSaveName = Application.GetSaveAsFilename( fileFilter:="Data Files (*.dat), *.dat, DTA (*.dta), *.dta")
If fileSaveName <> False Then MsgBox "Save as " & fileSaveName
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 12:10
nick7inc
спасибо!!!!!!!!!!!11

Цитата:
1) Использовать диалог SaveAsFilename:

с ним я наверно и поковыряюсь-поразбираюсь-поэкспериментирую

Цитата:
2) Использовать WinApi:

как я посмотрела код((((, это не для меня, первый вариант мне больше по душе, хотя бы все понятно.

Цитата:
Смотрите в бейсике описание оператора DIR$

про это я знаю, пользую когда надо ...

Добавлено:

Цитата:
Dim fileSaveName as Variant
fileSaveName = Application.GetSaveAsFilename( fileFilter:="Data Files (*.dat), *.dat, DTA (*.dta), *.dta")
If fileSaveName <> False Then MsgBox "Save as " & fileSaveName

а как сделать, чтоб показывались только картинки, ну файлы граф. форматов(jpg,gif и т.д.)? что надо написать вместо Data Files?

Автор: nick7inc
Дата сообщения: 05.01.2008 12:15
kalinakrasnay

Цитата:
как я посмотрела код((((, это не для меня,

А не надо туда смотреть, его надо вставить в проек отдельным модулем и забыть о нём.
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 12:16

Цитата:
Можно и не вчитываться в WinAPI.

дык мне надо это понять...препод то спросит, про вин апи у меня и в книге написано, типо такого же кода....

Добавлено:
nick7inc
а этот код он как это сказать, стандартизирован чтоли?
Автор: nick7inc
Дата сообщения: 05.01.2008 12:19

Цитата:
а как сделать, чтоб показывались только картинки, ну файлы граф. форматов(jpg,gif и т.д.)?

Что-то я не понял. Вам надо открыть файл? Если да, то используйте вместо Application.GetSaveAsFilename() Application.GetOpenFilename()
Тогда и список файлов вам читать не надо, имя выбранного вами файла в диалоге вернётся в качестве результата функции:

Код: Dim fileToOpen as variant
fileToOpen = Application.GetOpenFilename("User Files (*.usr), *.usr")
If fileToOpen <> False Then MsgBox "Open " & fileToOpen
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 12:22
nick7inc
нееттт....я всех запутала...!!! короче пользователь должен выбрать только папку! а все что в ней есть, но только картинки (имена файлов) помещаются в комбобокс.
только я не могу выбрать папку, остальное умею

Добавлено:
походу я уже гоню...начинаю запутываться
Автор: nick7inc
Дата сообщения: 05.01.2008 12:25

Цитата:
а этот код он как это сказать, стандартизирован чтоли

Который? Если WinAPI, то это стандартные диалоги Windows. Если у вас не системное программирование, то препод, по-хорошему, не может требовать от вас знания, что код в WinAPI делает. Ну, если вкрации - вызывает функции динамической библиотеки Shell32.DLL. Функции SHGetSpecialFolderLocation, SHBrowseForFolder и SHGetPathFromIDList - стандартные для Windows, их описание, скорее всего, можно найти поиском в сети по этим именам.

Добавлено:
kalinakrasnay
Ясно. Тогда только Application.GetSaveAsFilename() или WinAPI.
Первый вариант не очень красивый, ведь появится диалог сохранения файла, а не выбора папок.

Добавлено:
Тот код (WinAPI), что я привёл, это код взаимоействия бейсика со стандартными библиотеками системы. Его надо воспринимать как неизменный интерфейс, облегчащий жизнь пользователю.
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 12:30
nick7inc

Цитата:
Application.GetSaveAsFilename()

вроде въехала... с помощью этого я получу путь, который выбрал пользователь...и смогу воспользоваться фунцией Dir.? правильно поняла?
Автор: nick7inc
Дата сообщения: 05.01.2008 12:35
kalinakrasnay
Да, хотя, повторюсь, способ менее красивый, но результат тот же. Чтобы получить имена файлов с интересующими вас расширениями почитайте помощь по оператору DIR$. Там можно задать маску файлов: *.JPG
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 12:39
nick7inc
ага...хорошо спасибо!
Автор: AndVGri
Дата сообщения: 05.01.2008 14:27
nick7inc
kalinakrasnay
А так не проще?

Код:
Private Sub CommandButton1_Click()
Dim dlg As Office.FileDialog
Dim fso As Object
Dim pFolder As Object
Dim pFile As Object
Dim i As Long
'диалог выбора папки
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
If dlg.Show Then
'получаем папку
Set fso = CreateObject("Scripting.FileSystemObject")
Set pFolder = fso.GetFolder(dlg.SelectedItems(1&))
'заполняем выпадающий список именами файлов папки
For Each pFile In pFolder.Files
ComboBox1.AddItem pFile.Name
Next pFile
End If
End Sub
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 14:55
AndVGri
ух ты спасибо!!!! оч. классный способ!!!!

Добавлено:
AndVGri
только если можно объясни вот эти строчки (че делают):

Цитата:
Set pFolder = fso.GetFolder(dlg.SelectedItems(1&))

особенно что значит dlg.SelectedItems(1&) и 1&????
Автор: AndVGri
Дата сообщения: 05.01.2008 15:18
kalinakrasnay
FileDialog - как видно из названия диалог выбора файлов (с msoFileDialogFolderPicker) выбор папок. При установленном свойстве dlg.AllowMultiSelect в True - позволяет делать множественный выбор пользователю. Коллекция SelectedItems список выбранного. 1& индекс первого выбранного члена коллекции (в нашем случае первый элемент - путь к выбранной папке)
fso.GetFolder по заданному пути к папке возвращает объект папку файловой системы, затем цикл по файлам папки. Все это можно прочитать по FileDialog в разделе Microsoft Office Visual Basic Reference/Objects, по FileSystemObject, Folder, File в разделе Microsoft Visual Basic Documentation/Visual Basic Reference/Objects
Автор: nick7inc
Дата сообщения: 05.01.2008 15:29
AndVGri

Цитата:
Dim dlg As Office.FileDialog

Compile error:
User-defined type not defined


Excel 2000

Добавлено:
Неплохо бы писать версию Офиса или что надо к нему "подключить".
Добавлено:
Про скриптовую систему слышал, но стараюсь ею не пользоваться, поскольку это "вещь в себе", антивирус её не любит, и перенести на C++ сложно.
Автор: AndVGri
Дата сообщения: 05.01.2008 15:52
nick7inc

Цитата:
Compile error:
User-defined type not defined

Да, вы правы. Работает FileDialog начиная c Office XP

Цитата:
Про скриптовую систему слышал

Можно подлкючить и как ActiveX в Excel Tools/References пункт Microsoft Scripting Runtime. Да и С++ есть, напрочь не знаю, свои варианты работы с файловой системой.
Автор: kalinakrasnay
Дата сообщения: 05.01.2008 16:01
Спасибочки большое за разъяснения! а windows scripting host я и сама поняла что надо подключить,нам в институте говорили что и когда надо подключать.
Автор: PascalM
Дата сообщения: 07.01.2008 15:54
Ребят очень нужна помощь по массивам и матрицам в вба - надо сдать работу, п не понять мне эти темки((

оставлю тут аську можно? 659741

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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