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

» Excel VBA (часть 2)

Автор: denisdenmm
Дата сообщения: 20.10.2007 09:15
то есть если я создаю различные userform под разными именами то мне обязательно нужно для каждой формы писать свой вызов, а так чтобы поназывать их например userform1, userform2, userform3, ....... и после этого организовать список с номерами, а потом присваивая значение для переменной например ааа=userform & (номер списка) я не смогу вызвать ту , которая мне нужна, вот это меня интересует, хотел просто замутить кое-что на основе этой фишки и что называется приплыл
Автор: Oyger
Дата сообщения: 20.10.2007 09:45
denisdenmm
Это делаешь примерно так:

Dim q As String
q = InputBox(prompt:="What userform activatet?") 'Получил "ответ" от Inputbox
If q = "UserForm1" Then 'Условие: если "ответ" равен имени формы, то
Load UserForm1 'Инитиализирует твою форму
UserForm1.Show 'показываем форму. Везде вместо "UserForm" - имя твоей формы
Unload UserForm1 'Стерает из памяти Твою форму
End If

Тут несколько нюансов:
1) Почему мы пишем условие, а не просто "q.Show"? Да потому что "ответ" от Inputbox всегда будет иметь текстовый формат, а для Show переменная должна быть объектом. То что хотел Ты

Цитата:
ааа=userform & (номер списка)

Сделать не получится. Так как это у Тебя все равно будет текстовая переменная
2) После команды "UserForm1.Show" макрос передает управление на форму: обрабатывает события формы. Для возврата и продолжения работы модуля, в нужном месте форму поставь "UserForm1.Hide". Если не пропишешь - макрос не продолжит работу, пока пользователь вручную не закроет форму (не закроет форму "крестиком"). Для формы "UserForm1.Hide" равносильно закрытию "крестиком"
Автор: denisdenmm
Дата сообщения: 20.10.2007 10:01
спасибо конечно, так-то я до этого и сам дошёл, могу иногда с одной проблемой и дольше просидеть, просто операторов естественно не всех знаю и поэтому думал что просто есть какая-то причина , что я просто не полно ввожу и мне выдаёт ошибку, там просто список имён большой, и думал организовать подпрограмму но уже вижу что не получится, а жаль, блин, так всё прекрасно начиналось, придётся целой кучей писанины ещё заниматься, недостаток тогда в VBA, было бы всё намного проще, как лист рабочий например worksheets(aaa), и вызывается именно лист с именем ааа, которая равна тому-то тому-то, в любом случае спасибо, а то бы я и дальше искал, а время жалко
Автор: Oyger
Дата сообщения: 20.10.2007 14:36
denisdenmm
Тебе же уже dneprcomp сказал, что сделать надо - создай массив объектов. Вгони тута все вормы. А потом обращайся к ним используя индекс. Все получится.
Автор: pasha123321
Дата сообщения: 20.10.2007 16:09
Такая проблема. Написал проргаммульку - на форме combobox`ы и edit`ы - штук 40 -45 -
для засписи в ячеки и считывания. При работе выдает сообщение: "Недостаточно сисетмных ресурсов для полного вывода на экран". Файл весит 1,3 кг. WinXp (на Win98 - То же), память - 512. В чем тут дело ? Я тупой
Автор: dneprcomp
Дата сообщения: 20.10.2007 23:26
denisdenmm
Dim abc(5) As Object
Set abc(0) = UserForm0
abc(0).Enabled = True(пример обращения к свойствам формы)
Автор: Gavrik
Дата сообщения: 21.10.2007 16:05
Вопрос по сводной таблице.

Есть сводная таблица построенная на базе набора данных который динамически генерируется из других источников (собирается из нескольких листов на один).

В наборе данных данных есть поле "Дата" и соответвующее ему PivotTables("СводПоСырью").PivotFields("Дата")
, при первом построении таблицы в PivotTables("СводПоСырью").PivotFields("Дата").PivotItems Excel накидал все возможные значения которые нашел, например с 1.10.2007 до 16.10.2007.
Потом набор данных изменился, там оказались даты только с 5.10.2007 по 17.10.2007, Excel в этом случае добавил в PivotTables("СводПоСырью").PivotFields("Дата").PivotItems - 17.10.2007 которого раньше не было, но там также остались и значения с 1.10.2007 по 4.10.2007, которых в текущем наборе данных нет.
Вопрос состоит в том как заставить его пересчитать PivotTables("СводПоСырью").PivotFields("Дата").PivotItems из текущего набора данных?

ActiveSheet.PivotTables("СводПоСырью").RefreshTable
ActiveSheet.PivotTables("СводПоСырью").PivotCache.Refresh

Не помогают.
Автор: Ddashevskiy
Дата сообщения: 22.10.2007 05:14
Слава Oyger'у !!!
Автор: kuzmaxp
Дата сообщения: 22.10.2007 08:50
Так кто-нить может ответить на вопрос !!09:37 19-10-2007!!

Или же подскажите как в макросе сделать активную пустую нижнюю строку после определенного действия (она может находить и на 2-3 ячейки ниже)
Автор: tec4
Дата сообщения: 22.10.2007 11:52
Подскажите, пожалуйста, как в ComboBox удалить последний символ программно, если это возможно.
Автор: denisdenmm
Дата сообщения: 22.10.2007 12:03

Цитата:
Так кто-нить может ответить на вопрос !!09:37 19-10-2007!!

Или же подскажите как в макросе сделать активную пустую нижнюю строку после определенного действия (она может находить и на 2-3 ячейки ниже)



не используй автофильтр, просто поставь условие
например цикл от 1 до последнего члена списка (номер последнего можно задавать в процессе)
а результат выводи в ячейки рядом
а над ними установи номер столбца, допустим первый раз делаешь, первый столбец, второй раз, соответственно второй столбец, вот у тебя и будет каждый раз своеобразный фильтр в следующем столбце,
можно улучшить если введёшь в прогу выбор столбца, где хочешь чтобы высвечивались результаты, можешь дополнить всё это второй кнопкой которая будет прятать ненужные столбцы


Добавлено:
спасибо за помощь с диалоговыми окнами, получилось всё в наилучшем виде, долго прыгал от радости, получилось следующее:


Private Sub CommandButton1_Click()

If ComboBox3.Value = "перейти к расчёту по выбранному пункту" Then

Dim abc(26) As Object
Set abc(1) = сухие_смеси_и_т_п
Set abc(2) = кирпич
Set abc(3) = листовой_материал
Set abc(4) = металлокаркас
Set abc(5) = армирующие_сетки
Set abc(6) = утеплители
Set abc(7) = рулонные_покрытия
Set abc(8) = пиломатериалы
Set abc(9) = мебельн_щит_фасад_столеш_фурн
Set abc(10) = панели_ламинат_паркет
Set abc(11) = плинтус_пороги_профили
Set abc(12) = двери_карнизы_жалюзи_фурнитура
Set abc(13) = потолки_акусто_реечные
Set abc(14) = пенополистерол_плитка_плинтус
Set abc(15) = принадлежности_ванных_туалета
Set abc(16) = плитка
Set abc(17) = шурупы_дюбеля_заклёпки_болты
Set abc(18) = крепёж_фасованный_гвозди
Set abc(19) = тросы_цепи
Set abc(20) = пр_гоф_кабкан_оборудование
Set abc(21) = подогр_обогр_щит_счёт_клем_авт
Set abc(22) = трубы_фитинги_припои_флюсы
Set abc(23) = радиат_терморег_водонагр_сауны
Set abc(24) = всё_для_вентиляции_лючки
Set abc(25) = крас_анти_раств_герм_грунт_кл
Set abc(26) = материалы_от_себя
n = 1
While ComboBox2.Value <> cells(n, 34)
n = n + 1
Wend
For i = 1 To 26
If cells(n, 35) = abc(i).Caption Then
abc(i).Show
Exit Sub
End If
Next
End If
Автор: denisdenmm
Дата сообщения: 22.10.2007 19:23
у меня вопрос, а можно ли сделать так, чтобы ListBox не показывал нулевые значения, то есть если например число в третьем столбце ListBox заводится из ячейки рабочего листа, а его величина равна 0, или "" то на экране 0,
можно как-то убрать такие нули?
моя благодарность будет безгранична в пределах разумного!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Автор: dneprcomp
Дата сообщения: 22.10.2007 19:44
denisdenmm
Это хорошо, что получилось. Но честно говоря, не понятно зачем надо такое количество диалоговых окон. Если все они(как я подозреваю) однотипны, то можно было бы вообще обойтись одним. Просто модифицировать его на load. Ну еще может добавить переменную, определяющую тип. Программа сразу станет меньше и нагляднее.
Автор: Vitus_Bering
Дата сообщения: 22.10.2007 19:46
denisdenmm

Цитата:
число в третьем столбце ListBox заводится из ячейки рабочего листа

Так может быть их в листе убрать?
Автор: denisdenmm
Дата сообщения: 22.10.2007 21:48
не. в листе нельзя, там связь с другими ячейками, я не хотел усложнять програмно, а просто загнал формулы, а когда выпадает основное окно, то пересчёт ячеек становится ручным, для скорости, у меня ListBox постоянно меняется, в зависимости от того где нахожусь, а с окнами конечно можно и уменьшить, но тогда в каждом вкладки добавятся, да нет, такое количество наверно лучше, быстрее потом ориентироваться будет, смысл в том, что по каждому пункту работ выскакивают определённые подсказки, со своими списками, и чем их меньше тем потом быстрее считать
Автор: dneprcomp
Дата сообщения: 23.10.2007 01:53
denisdenmm
Вкладки не нужны. Просто после load окна все его лейбл, листы, подсказки меняются согласно надобности для данного вызова. Затем, после когфигурации, можно и show сделать. При таком подходе не придется добавлять новые окна. Просто добавляется новая конфигурация.
PS. При ответе не плохо бы указывать кому отвечаешь, а не валить все в кучу. Для этого надо кликнуть на имя.
Автор: aks_sv
Дата сообщения: 23.10.2007 05:39

Цитата:
На сайте "Планета Exel" есть интересный макрос "Курс доллара для любой заданной даты":

http://forum.ru-board.com/topic.cgi?forum=33&topic=8273&start=960
Никаких предложений?
Автор: a22ntaque
Дата сообщения: 23.10.2007 10:28
добрый день.
подскажите, пожалуйста, как из access в excel передать параметры свойства excel файла (автор, учреждение...)
Автор: Ddashevskiy
Дата сообщения: 23.10.2007 11:33
Господа, есть текстбокс в виде одной строки, в него передается строка длиной в 1000 символов, надо сфокусировать вид на определенном символе (чтоб определенный символ, например 400-сотый, был посредине этой строки). Помогите плз.
Автор: Vitus_Bering
Дата сообщения: 23.10.2007 13:32
Ddashevskiy
А то, что Oyger предлагал, не подходит?
Автор: Ddashevskiy
Дата сообщения: 23.10.2007 14:18
так то курсор, а мне надо еще сфокусировать вид, проблему решил.

Автор: aks_sv
Дата сообщения: 23.10.2007 20:34

Цитата:
Цитата:На сайте "Планета Exel" есть интересный макрос "Курс доллара для любой заданной даты":

http://forum.ru-board.com/topic.cgi?forum=33&topic=8273&start=960
Никаких предложений?


Вопрос снимаю. Надо заменить строку на:

Код: outstr = Mid(htmlcode, InStr(1, htmlcode, "EUR") + 82, 7)
Автор: CEMEH
Дата сообщения: 23.10.2007 22:04
Простейший вопрос
Есть форма, на ней календарик. Как сделать календарь=сегодня при открытии формы?
Cflendar = Now() ' Куда ставить эту формулу?
Автор: dneprcomp
Дата сообщения: 23.10.2007 23:36
CEMEH
UserForm_Initialize
Автор: CEMEH
Дата сообщения: 24.10.2007 00:00
dneprcomp
Спасибо!
Автор: aks_sv
Дата сообщения: 24.10.2007 08:59
Подскажите, как присвоить иконки данным из списка TextBox?
Автор: vasiliy74
Дата сообщения: 24.10.2007 12:41
Кто нить видел примеры на VBA, для создания интерфейса ввода даных в базу SQL?

Добавлено:
Ещё есть проблема виснет EXCEL 2003

Код:
With Sheets("TOTAL").Cells
.Validation.Delete
.ClearContents
.ClearComments
.FormatConditions.Delete
.Font.Size = 10
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
.Borders(xlEdgeLeft).LineStyle = xlNone
.Borders(xlEdgeTop).LineStyle = xlNone
.Borders(xlEdgeBottom).LineStyle = xlNone
.Borders(xlEdgeRight).LineStyle = xlNone
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
.Interior.ColorIndex = xlNone
.Font.ColorIndex = 0
.Font.Bold = True
.Font.Bold = False
.NumberFormat = "General"
End With

Автор: a22ntaque
Дата сообщения: 24.10.2007 14:39
если кому интересно:

Workbooks.Open("Книга.xls").BuiltinDocumentProperties(3) = "Юзер"
ActiveWorkbook.BuiltinDocumentProperties("Company") = "Компания"
ActiveWorkbook.Save
Workbooks.Close
OpenExcel ("Книга1.xls")
Автор: ol7ca
Дата сообщения: 24.10.2007 16:46
Помогите, плз, решить задачку:
хочу найти значение, находящееся в файле [Budget.xls]
лист Statement на пересечени строки где есть слово Commissions
со столбцом 102 и найденное значение
вставить в файл В.xls лист S&M ячейка M9.
применяю следующий код:

Sheets("S&M").Select
Range("M9").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP("Commissions",'[Budget.xls]Statement'!R1C1:R32C104,102,FALSE)"
Selection.Copy
Range("M9").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

но ошибка в ковычках "Commissions".
как это правильно записать?
Может есть другой способ поиска-вставки значения?
Спасибо.
Автор: Olive77
Дата сообщения: 24.10.2007 17:29

Цитата:
ActiveCell.FormulaR1C1 = _
"=VLOOKUP("Commissions",'[Budget.xls]Statement'!R1C1:R32C104,102,FALSE)"

ActiveCell.FormulaR1C1 = _
"=VLOOKUP(" & chr(34) & "Commissions" & chr(34) & ",'[Budget.xls]Statement'!R1C1:R32C104,102,FALSE)"

а еще посмотри
Application.WorksheetFunction.VLookup

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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