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

» Excel VBA (часть 3)

Автор: KolyaP
Дата сообщения: 17.02.2011 17:41
AndVGri
Спасибо!
Ваш совет помог.

Что касается маски отображения. Я решил использовать выбор файла. В таком случае маска может быть задана:

With Excel.Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False
.InitialFileName = "*.rar"
End With

Добавлено:
mrdime
Прошу прощения. Я вопрос не повторял. Перезагружал в Explorer страницу. Вопрос почему-то возник повторно.
Автор: KF121
Дата сообщения: 17.02.2011 17:49
KolyaP
еще один вариант

With Application.FileDialog(msoFileDialogOpen)
.Filters.Add "Text Files", "*.txt"
.FilterIndex = .Filters.Count
.Show
End With
Автор: KolyaP
Дата сообщения: 17.02.2011 18:21
KF121
Интересный пример. Но почему-то он у меня не работает
На строчке .Filters.Add "Text Files", "*.txt" ошибка:
Object doesn't support this property or method.
Автор: KF121
Дата сообщения: 17.02.2011 19:27
может из-за того что у меня 2010 оффис.
Автор: KolyaP
Дата сообщения: 17.02.2011 20:18
KF121
Перезагрузил Excel, всё заработало.

Офис 2003.
Microsoft Visual Basic 6.3.

Бывает же такое.

Добавлено:
Такой код:

On Error GoTo errorhandler

call aaa
Exit Sub

errorhandler:
Select Case Err.Number

В макросе aaa нет своего обработчика ошибок.
В aaa возникла ошибка.

Как сделать, чтобы интерпретатор останавливался и выдавал номер ошибки внутри aaa, а не пытался обработать ошибку в вызывающем макросе?
Автор: AndVGri
Дата сообщения: 18.02.2011 02:47
KolyaP

Цитата:
Как сделать, чтобы интерпретатор останавливался и выдавал номер ошибки внутри aaa, а не пытался обработать ошибку в вызывающем макросе?

В VBA редакторе – Tools, Option, вкладка General, группа Error Trapping поставь переключатель в Brreak on Unhandled Errors
Автор: KolyaP
Дата сообщения: 18.02.2011 12:46
AndVGri
Спасибо!

Только у меня корректно работает, когда переключатель в положении Break on All Errors.
Автор: JekG
Дата сообщения: 26.02.2011 10:50
Для душевного комфорта сотруднице не хватает вместо трех последовательно выполняемых макросов одного, из под которого последовательно запускаются эти три
Предполагаемый алгоритм
1. "Привет, Светка! Сейчас будем посчитать" (Запускается Макрос 1)
2. Макрос отработал. Выдал сообщение "Светка хочешь перейти на второй этап? (ОК / Отмена)" Светка визуально убедилась что все прошло без ошибок нажала Ок (Запускается Макрос 2)
3. Аналогично с Макрос 3. В нем в конце уже прописано сообщение об успешности его выполнения. На этом этапе процедуру можно остановить.

Все три макроса сохранены в Личной книге макросов. Туда же хочу поместить и этот с выводом кнопки его вызова на панель инструментов Excel Обработка производится с текущим открытым документом Excel

PS Чего не сделаешь ради Светки
PPS Лепить из трех макросов один не хочу, по той причине, что их иногда нужно выполнять независимо от других.
Автор: AndVGri
Дата сообщения: 26.02.2011 15:43
JekG
Что то вроде этого?

Код:
Public Sub for3Subs()
Call firstSub
If MsgBox("Выполнять ли 2 макрос?", vbYesNo, "Вопрос") = vbYes Then
Call secondSub
If MsgBox("Выполнять ли 3 макрос?", vbYesNo, "Вопрос") = vbYes Then
Call thirdSub
MsgBox "Вот и всё", vbOKOnly + vbInformation, "Завершение"
End If
End If
End Sub
Автор: JekG
Дата сообщения: 26.02.2011 22:42
AndVGri
Спотыкается на первом же вызове Call firstSub ... Я где-то читал что макрос из макроса вызывается командой RunMacro? но не могу чего-то найти тольковых примеров.

Макрос из макроса запускается просто

Sub test()
Run "Personal.xls!Имя макроса"
End Sub

Осталось прикрутить меседжбоксы с вопросами
Автор: JekG
Дата сообщения: 27.02.2011 11:55
В конечном итоге отлично пашет вот в таком виде


Код:
Sub Megamacros()

Select Case MsgBox("Запустить на выполннение Макрос1?", 33, "Мегамакрос")
Case 1 ' Ок
Case 2 ' Отмена
End Select
Run "Personal.xls!Macros1"

Select Case MsgBox("Запустить на выполннение Макрос2?", 33, "Мегамакрос")
Case 1 ' Ок
Case 2 ' Отмена
End Select
Run "Personal.xls!Macros2l"

MsgBox "Всем спасибо Все свободны", 32, "Мегамакрос"
End Sub
Автор: KF121
Дата сообщения: 28.02.2011 07:47
JekG
только есть одно НО, при любом ответе в мессажд боксах, у вас будут макросы полняться всегда
Автор: JekG
Дата сообщения: 28.02.2011 09:29
KF121
И правда... Значит вопрос остается открытым.
Автор: KF121
Дата сообщения: 28.02.2011 09:36
не понятно зачем указывать книгу при запуске макроса, если они все находятся в одной книге и темболее одном модуле.
Почему не паботает тот код что привел товарищ AndVGri, какая ошибка? Соответвтвенно надо поставить всемто firstSub, senondSub and thirdSub актуальные имена ваших макросов. как называются макросы, где они располагаются и это сабы или функции?
Автор: JekG
Дата сообщения: 28.02.2011 10:29
KF121
На первом вызове Call firstSub выдает ошибку sub or function not defined
Автор: Zloy_Gelud
Дата сообщения: 28.02.2011 10:38
JekG

Код: Sub Megamacros()
Select Case MsgBox("Запустить на выполннение Макрос1?", 33, "Мегамакрос")
Case 1 ' Ок
Run "Personal.xls!Macros1"
Case 2 ' Отмена
End Select

Select Case MsgBox("Запустить на выполннение Макрос2?", 33, "Мегамакрос")
Case 1 ' Ок
Run "Personal.xls!Macros2l"
Case 2 ' Отмена
End Select

MsgBox "Всем спасибо Все свободны", 32, "Мегамакрос"
End Sub
Автор: KF121
Дата сообщения: 28.02.2011 11:54

Цитата:
На первом вызове Call firstSub выдает ошибку sub or function not defined

ну так надо свои имена подставить
Автор: JekG
Дата сообщения: 28.02.2011 12:28
KF121
Естественно подставил, но скорее всего неверно.
Автор: TarValon
Дата сообщения: 02.03.2011 18:19
Добрый вечер.
Подскажите салаге:
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean)
Dim AName As Name
Dim Sheet As Worksheet
Dim ASheetName As String
For Each icbc In Application.CommandBars("cell").Controls
If icbc.Tag = "astag" Then
icbc.Delete
End If
Next


Почему то при клике правой кнопкой мыши, никак не хочет в контекстное меню добавлять вкусности... ругается на For Each icbc In Application.CommandBars("cell").Controls
и выделяет icbc...
Самое забавное что на соседней опыт прошел успешно, на моей машине ну никак.
Какой lib or object не хватает?
П.С. надстройка as имеется.
Автор: SAS888
Дата сообщения: 03.03.2011 05:41
TarValon
А зачем перебирать в цикле все контролы контекстного меню ячейки?
Для того, чтобы по клику правой кнопкой мыши создать свой пункт ("вкусность") со ссылкой на макрос, можно в модуле нужного листа использовать код:

Код: Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim bt As CommandBarControl
On Error Resume Next: Set bt = Application.CommandBars("Cell").Controls("MyControl")
If Err = 0 Then Exit Sub
Set bt = Application.CommandBars("Cell").Controls.Add(before:=1)
With bt
.Caption = "MyControl": .OnAction = "MyControl": .FaceId = 1992
End With
End Sub
Автор: chel78
Дата сообщения: 03.03.2011 19:28
Привет, возможно ли как то реализовать следующее:
при наведении на ячейку с данными, что бы во всплывающей подсказке высвечивалось описание данных в ячейке ?
например в ячейке код материала 1234, и при наведении на ячейку, либо выборе ячейки - показывало описание (на другом листе есть соответствующие данные, код-описание)
Автор: AndVGri
Дата сообщения: 04.03.2011 02:07
chel78
Можно встроить всплывающую подсказку таким кодом для ячейки активного листа, например так:

Код:
If ActiveCell.Comment Is Nothing Then ActiveCell.AddComment "1"
With ActiveCell.Comment
.Text CStr(ActiveWorkbook.Worksheets("commentWorkSheetName").Cells(2, 3).Value), 1
.Shape.Width = 100
.Shape.Height = 50
End With
Автор: Avolon
Дата сообщения: 04.03.2011 07:06
Привет Народ помогите есть файл в нем много листов нада на др лист выводить
последнее записаное занчение из чейки столбцов B и I
тоесть
B I
1 2
3 4
То он должен вывести на страницу значение 3 4 так как она последняя
и так совсех листов на отдельный лист (((
В VBA профан полный (((

Нашел вот что
определяю последнюю заполненную ячейку
... range().end(xlDown).row

Но как воспользоватся??
Может у кого есть готовый пример????
Автор: ferias
Дата сообщения: 04.03.2011 16:03
[more=Попробуй.]Sub test()
Dim i As Long, c() As String
ReDim c(1 To 2, 1 To ActiveWorkbook.Sheets.Count)
For i = 1 To ActiveWorkbook.Sheets.Count
ActiveWorkbook.Sheets(i).Activate
Debug.Print ActiveWorkbook.Sheets(i).Name
c(i, 1) = Range("B" & (Range("B65536").End(xlUp).Row)).Value
c(i, 2) = Range("I" & (Range("I65536").End(xlUp).Row)).Value
Next i
For i = 1 To UBound(c, 2)
Debug.Print c(i, 1)
Debug.Print c(i, 2)
Next i

End Sub[/more]
Автор: chel78
Дата сообщения: 05.03.2011 11:31

Цитата:
chel78
Можно встроить всплывающую подсказку таким кодом для ячейки активного листа, например так:

Код:

If ActiveCell.Comment Is Nothing Then ActiveCell.AddComment "1"
With ActiveCell.Comment
.Text CStr(ActiveWorkbook.Worksheets("commentWorkSheetName").Cells(2, 3).Value), 1
.Shape.Width = 100
.Shape.Height = 50
End With


Не совсем понял...
Автор: Kalifaks
Дата сообщения: 05.03.2011 16:34
Здравствуйте!
Имеется лист "результат" и неограниченное количество "расчетных" листов в книге. В каждом "расчетном" листе будет значение в ячейке A1.
Подскажите, пожалуйста, как с помощью VBA найти сумму ячеек A1 во всех "расчетных" листах и вывести ее на лист "результат" (ячейка A1).
Автор: urodliv
Дата сообщения: 05.03.2011 18:17
Уважаемые программеры. Сами мы админы, потому просим помочь.
Задача простая. Есть куча однотипных файлов. Из определённых ячеек тягаю данные и составляю из них список. Кусок моего кода:

Код: With Application.Workbooks
.Item(1).Worksheets(1).Activate
cnt = 2
For Each qz In spisokfiles
Cells(cnt, 1) = qz.Path
.Open (qz.Path)
.Item(1).Worksheets(1).Cells(cnt, 2) = .Item(qz.Name).Worksheets(1).Cells(1, 1)
.Item(1).Worksheets(1).Cells(cnt, 3) = .Item(qz.Name).Worksheets(1).Cells(1, 2)
.Item(qz.Name).Close
cnt = cnt + 1
Next
End With
Автор: JekG
Дата сообщения: 06.03.2011 01:00
urodliv
По первому вопросу

Код: With Application
'отлючаем обновление экрана - это убыстрит работу макроса
.ScreenUpdating = False
'включаем ручной пересчёт формул - это убыстрит работу макроса
.Calculation = xlManual
'отключаем отображения окон на панели задач на время выполнения макроса
.ShowWindowsInTaskbar = False
.DisplayAlerts = False
End With

код макроса

With Application
'включаем автоматический пересчёт формул, который отключили в начале макроса
.Calculation = xlAutomatic
'включаем отображения окон на панели задач, которое отключали в начали макроса
.ShowWindowsInTaskbar = True
.DisplayAlerts = True
'включаем обновление экрана, который отключили в начале макроса
.ScreenUpdating = True
End With
Автор: SAS888
Дата сообщения: 06.03.2011 06:44
urodliv

Цитата:
Есть куча однотипных файлов. Из определённых ячеек тягаю данные и составляю из них список

Если кроме пути и имени книг (я так понял, что они находятся в Вашем списке), известны имена листов, из которых нужно получить данные (именно имена, а не номера листов), а также адреса требуемых ячеек, то Вашу задачу можно решить и вовсе не открывая файлы-источники.
Автор: urodliv
Дата сообщения: 06.03.2011 18:31

Цитата:
то Вашу задачу можно решить и вовсе не открывая файлы-источники.

Во-во! Это было бы самым лучшим вариантом. Ибо на одну из граблей я уже наступил.

Цитата:
Если кроме пути и имени книг (я так понял, что они находятся в Вашем списке)

Не, списка как такового нет. Есть файловое дерево каталогов. Вот обходя его и составляется список.
Цитата:
известны имена листов, из которых нужно получить данные

Известны абсолютно достоверно: во всех файлах из 37000 штук они называются "Лист 1". Как это не оригинально...

Цитата:
а также адреса требуемых ячеек

Тут загвоздка. В файлах до 2006 года они в одних ячейках, а после - смещены на две строки вниз. Но если файлы обрабатывать не скопом, а частями, то можно считать, то адреса ячеек тоже известны.


Добавлено:
JekG
Джек, Вам за подсказку большое спасибо.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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