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

» Excel VBA (часть 2)

Автор: nick7inc
Дата сообщения: 18.01.2008 16:16
Gruzok

Цитата:
Rows (i, i+5).Name = d

А что здесь хотите передать? Если надо выделить несколько строк, то можно так:

Код: range(Rows(5),rows(10)).Name=d
Автор: Gruzok
Дата сообщения: 18.01.2008 17:14

Цитата:
range(Rows(5),rows(10)).Name=d


Это то, что было нужно, спасибо.
Автор: HarryG
Дата сообщения: 18.01.2008 17:55

Цитата:
Добавлено:
HarryG

Цитата:MsgBox (BottleRashod.CodeName)
выдает пусто.

Ошибка в коде. Надо вместо MsgBox (BottleRashod.CodeName) написать msgbox(BottleOst.CodeName), а вообще есть такая штука, как sheets("БутылкаОстатки").codename
Добавлено:

Цитата:для программного добавления методов

А можно с этого места по-подробнее, если не секрет, конечно


Есть процедура с таким кодом


Str2 = "Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" & vbCrLf
Str2 = Str2 & " 'Exit Sub" & vbCrLf
Str2 = Str2 & " Dim c1, r1, c2, r2" & vbCrLf
Str2 = Str2 & " c1 = ActiveWindow.ScrollColumn" & vbCrLf
Str2 = Str2 & " r1 = ActiveWindow.ScrollRow" & vbCrLf
Str2 = Str2 & " c2 = ActiveCell.Column" & vbCrLf
Str2 = Str2 & " r2 = ActiveCell.Row" & vbCrLf
Str2 = Str2 & " Worksheets(""" + NameNextSheet + """).Activate" & vbCrLf
Str2 = Str2 & " Worksheets(""" + NameNextSheet + """).Cells(r2, c2).Select" & vbCrLf
Str2 = Str2 & " ActiveWindow.ScrollColumn = c1" & vbCrLf
Str2 = Str2 & " ActiveWindow.ScrollRow = r1" & vbCrLf
Str2 = Str2 & " Cancel=True" & vbCrLf
Str2 = Str2 & "End Sub"

With Workbooks(NameBook).VBProject.VBComponents(NameCurSheet).CodeModule
ll = .CountOfLines + 1
.InsertLines ll, Str2
End With



NameCurSheet - параметр для этой проедуры. Это CodeName листа, на который будет добавляться метод.

Переменная действительно приведена не верная, но суть от этого не меняетя. До первого попадания в VBA свойство CodeName пустое. После первого попадания - все нормально.
Автор: nick7inc
Дата сообщения: 18.01.2008 19:03
HarryG

Цитата:
До первого попадания в VBA свойство CodeName пустое. После первого попадания - все нормально.

Хоть убей, не понял.
Я сделал проще: сделал кнопку на листе, добавил макрос, который выполняется по щелчку:
Код: Private Sub CommandButton1_Click()

Set BottleOst = Worksheets.Add
BottleOst.Name = "БутылкаОстатки"
Debug.Print (BottleOst.CodeName)

End Sub
Автор: gamers_hater
Дата сообщения: 18.01.2008 21:05
Пытаюсь выполнить следующее:

Range("A5").Value = "=ЕСЛИ((C9-D9+F9-P9)>0;(C9-D9+F9-P9);0)"

но получаю Application-defined or object-defined error =(

Причем методом тыка установил, что "=ЕСЛИ((C9-D9+F9-P9)>0)" работает нормально, а если ещё чего добавить, то *опа

Вопрос: Как лечть?

Сразу хочу извинится, может вопрос и ламерный, но я раньше кодил на C/С++, а с бейсиком пришлось столкнуться по работе, вообще впервые.

Зарание спасибо!
Автор: nick7inc
Дата сообщения: 18.01.2008 21:36
gamers_hater
Добро пожаловать в продукт компании Microsoft.
Range("A5").Formula = "=IF((C9-D9+F9-P9)>0,(C9-D9+F9-P9),0)"
В VBA отличаются:
1) имена функций, предназначенные для ячеек. Используются английские эквиваленты локальных названий, иначе программа, написанная в Африке, не будет работать в Малайзии.
2) запятая вместо точки с запятой.

На будущее: попробуйте написать интересующую вас функцию в ячейке, а чтобы узнать, как её писать в VBA вызовите msgbox Range("A5").Formula и всё станет ясно.
Автор: gamers_hater
Дата сообщения: 18.01.2008 21:58
nick7inc
Большое вам спасибо!

ЗЫ

Цитата:
Добро пожаловать в продукт компании Microsoft.

Да уж.. у них как всегда в все через одно место
Хотя пакет Visual Studio мне нравится, юзаю Visual C++, а вот этот VB мне чет не очень понравился Удивительно, но мну C++ поначалу давался легче, чем VB сейчас, хотя тут, как говорится, "на вкус и цвет"
Автор: nick7inc
Дата сообщения: 18.01.2008 22:23
gamers_hater
А я в C++ немного разбираюсь. Если что - пишите: любой новый язык поначалу сложен, пока "руку не набьёшь".
Автор: gamers_hater
Дата сообщения: 18.01.2008 22:38
Вот ище вопросег.

Как мне пройтись (с помощь цикла) по всем страницам, чтоб изменить значение в ячейке A3 (на всех страницах)?

Если можно, стучите в асю: 400366707
Автор: nick7inc
Дата сообщения: 19.01.2008 00:21
gamers_hater

Код: Dim ws As Worksheet, wb As Workbook
Set wb = Workbooks("Книга1.xls") 'Присваивание для объектов

For Each ws In wb.Worksheets
If ws.Type = xlWorksheet Then _
ws.Cells(3, "A").Value = "Packman"
Next ws
Set wb = Nothing ' Правило хорошего тона для всех объектов после использования
Автор: AndVGri
Дата сообщения: 19.01.2008 02:35
nick7inc
А зачем

Цитата:
If ws.Type = xlWorksheet Then

Если цикл у вас и так по Worksheets?

Цитата:
For Each ws In wb.Worksheets

Автор: vasiliy74
Дата сообщения: 19.01.2008 10:05
Как открыть (получить доступ к файлу) файл под определённым пользователем?

Добавлено:
и ещё может ли VBA один модуль редактировать, или создавать другой?
Автор: gamers_hater
Дата сообщения: 19.01.2008 12:20
Такой вопрос.

Мой макрос перед закрытием документа должен занести некоторые данные в таблицу. Для этого я написал такой ламокод (сильно ногами не пинать ) :

**************

Private Sub Workbook_BeforeClose(Cancel As Boolean)
CleanOnClose
Cancel = False

End Sub

Private Sub CleanOnClose()
For i = 1 To Sheets.Count
Sheets.Item(i).Select
Range("A1").Value = "Моя строка"
Range("Q40").Formula = "" ' Эту формулу надо отчистить
Range("R40").Formula = "" ' и эту тоже
Next i
End Sub

**************

Но, после изменений, Excel сразу спрашивает, ни хочу-ли я их сохранить =/. Как мне сюда добавить автоматическое (без запроса) сохранение?

Зарание спасибо!

Добавлено:
В догонку

Можно-ли как-нить отобразить свою форму (с надписью "подождите") во время какого-нить процесса, а по окончании последнего, эту форму закрыть?
Автор: nick7inc
Дата сообщения: 19.01.2008 14:45
AndVGri

Цитата:
А зачем

Цитата:If ws.Type = xlWorksheet Then

Не работает у меня правильно на Excel 2000. Вылетает по ошибке, если есть хотя бы одна диаграмма. Microsoft...
Автор: gamers_hater
Дата сообщения: 19.01.2008 15:13
1-ю траблу решил так:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
CleanOnClose
Cancel = False
Save ' - всё настолько просто
End Sub

По формам решил:

MyForm.Show
MyForm.Repaint
... - тут что-то делаем
MyForm.Hide

ЗЫ
Прям как в Delphi, интересно, кто у кого слизал, Borland или MS?
Автор: nick7inc
Дата сообщения: 19.01.2008 16:31
gamers_hater

Цитата:
For i = 1 To Sheets.Count
Sheets.Item(i).Select
Range("A1").Value = "Моя строка"

А если будет диаграма или ещё чего-нибудь? Вылетит по ошибке. Потом, почему вам не нравится For Each?

Добавлено:
Ещё один момент - ваш код потенциально медленный, т.к. вы испльзуете метод Select. Можно и без него обойтись: вместо
Код: Sheets.Item(i).Select
Range("A1").Value = "Моя строка"
Автор: vasiliy74
Дата сообщения: 19.01.2008 17:04

Код: Workbooks(file).Close savechanges:=False
Автор: nick7inc
Дата сообщения: 19.01.2008 17:05
gamers_hater

Цитата:
По формам решил:
MyForm.Show
MyForm.Repaint
... - тут что-то делаем
MyForm.Hide

Что-то у меня с Repaint глючит...
Автор: vasiliy74
Дата сообщения: 19.01.2008 17:12
нет сории проблема не в этом а в том что в имени файла используются квадратные скобки и VBA их не понимает
Автор: nick7inc
Дата сообщения: 19.01.2008 17:12
vasiliy74
У меня что-то подобное было с ActiveChart.SeriesCollection(1).Formula. Если формула очень длинная (ссылка на данные в другом файле, запрятанном в дебрях диска с длинным именем пути), то может быть переполнение буфера, если не стоит заплатка; а если стоит, то Excel просто не показывает все параметры формулы, ставит запятые с пустыми параметрами, халтурщик.

Добавлено:
Решение в вашем случае - разделить команду на 2 части: путь и имя файла. Выбрать текущую директорию командой chdir и chdrive, а при сохранении файла указывать только имя файла.

Добавлено:
vasiliy74

Цитата:
нет сории проблема не в этом а в том что в имени файла используются квадратные скобки и VBA их не понимает

Наверное не стоит своё сообщение в форуме полностью переписывать... Можно сохранять под другим именем, а потом переименовывать.
Автор: vasiliy74
Дата сообщения: 19.01.2008 17:25
в общем пока что просто обманул его через пере-присвоение переменной
Код: file = ActiveWorkbook.Name
Автор: nick7inc
Дата сообщения: 19.01.2008 17:31
vasiliy74
Цитата:
Как можно обойти эту проблему... ответа не нашёл

Код: Name OldName As NewName ' Rename file.
Автор: vasiliy74
Дата сообщения: 19.01.2008 18:16
nick7inc

Цитата:
Rename file
- мне не нужно изменять имя файла, но спасибо
Автор: gamers_hater
Дата сообщения: 19.01.2008 18:26
nick7inc
Посиб Вам за подсказки! Без перехода по страницам ( Sheets.Item(i).Select ) код стал работать раз в 5 быстрее =)

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

Добавлено:

Цитата:
Потом, почему вам не нравится For Each

Яж говорил, что с VB впервые столкнулся вчера вечером %), а посему не знаю всех его конструкций, и тем более ф-ий, не подскажите-ли мне какой-нить учебник (желательно on-line и для тех, кто VB вообще в глаза не видел), где будет всё на примерах и минимум воды?
Автор: vasiliy74
Дата сообщения: 19.01.2008 20:29
Не знаю как реализовать проверку если у меня открыт файл с таким же именем что я пытаюсь открыть из VBA?
Например я в в VBA открываю файл а файл с таким же именем уже открыт, возникает ошибка
Цитата:
Run-time error '1004'
и выполнение кода останавливается.
я думаю что стоит при возникновении подобной ошибке сделать
Код: exit sub
Автор: nick7inc
Дата сообщения: 19.01.2008 21:42
gamers_hater

Цитата:
не подскажите-ли мне какой-нить учебник

Учился без конкретной книги, изучал штатную справку VBA, в интернете смотрел, отладчиком изучал дерево объектов, поэтому с книгой помочь не могу.

Добавлено:
vasiliy74

Цитата:
Не знаю как реализовать проверку если у меня открыт файл с таким же именем что я пытаюсь открыть из VBA?

Смотря откуда макрос запущен. Если надо проверить, что имя открываемой книги не совпадает с той, откуда макрос запущен, то можно сравнить thisworkbook.Name с именем открываемого файла. Если макрос запущен из Addin'а, то надо проверить всю коллекцию открытых книг:
Код: Dim wb As Workbook, NewWorkBookName as string
NewWorkBookName="NewBook.xls"
For Each wb In Application.Workbooks
If wb.Name=NewWorkBookName then msgbox "Книга уже открыта":exit sub
Next wb
Автор: gamers_hater
Дата сообщения: 20.01.2008 12:17
Такой вопрос.

Допустим.
У меня есть список фамилий работников, можно-ли создать раскрывающийся список (типа ComboBox) в одной из ячеек, для выбора нужной фамилии и, в зависимости от фалмилии, подставлять в другую ячейку соответствующее значение.

Зарание спасибо!
Автор: vasiliy74
Дата сообщения: 20.01.2008 13:11
nick7inc
отличное решение!
gamers_hater
список можно через проверку сделать стандартными средствами Excel (тип список) , а подстановку тоже стандартными через vlookup...
Автор: gamers_hater
Дата сообщения: 20.01.2008 14:58
vasiliy74
спасибо!

Еще вопросик.
Можно-ли как-нить с помощью макроса запретить пользователю редактировать ячейку, но чтобы формула в этой ячейке работала нормально.
Автор: nick7inc
Дата сообщения: 20.01.2008 18:50
gamers_hater

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

Можно.
Способ первый. Выбираем ячейки, которые мы хотим оставить открытыми для редактирования пользователем, правая клавиша мыши->Формат->Защита->снимаем галку "защищаемая ячейка", далее - меню->Сервис->Защитить лист.
Единственное, макросы не будут иметь доступ на запись к защищённым ячейкам, а формулы в них будут высчитываться без проблем. [more=Код]
Код: Dim SomeSheet As Worksheet 'указатель на объект
' присваиваем объект указателю
' если работаем в пределах одной книги, то
' "Workbooks("Книга1")." можно опустить
Set SomeSheet = Workbooks("Книга1").Worksheets("Sample")
' защищаем все ячейки с "галками"
SomeSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= False
' отмена защиты
SomeSheet.Unprotect

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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