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

» Excel VBA (часть 2)

Автор: David_Kats
Дата сообщения: 26.09.2008 15:42
Какой-то парадокс!!
Пытаюсь присвоить свойству Combobox.Text текствое значение.

Public Sub ComboBoxInitialize(sheet As String)
With Worksheets(sheet)
'День
.ComboBox1.ListFillRange = "Служебный!K3:K33"
.ComboBox1.Text = Str(Day(Now()))

'Месяц
.ComboBox2.ListFillRange = "Служебный!L3:L14"
.ComboBox2.Text = MonthToString(Month(Now()))

'Год
.ComboBox3.ListFillRange = "Служебный!M3:M5"
.ComboBox3.Text = Str(Year(Now()))
End With
End Sub

После открытия книги в первую попытку выполнить эту процедуру выскакиевает сообщение об ошибке 438 мол "объект не поддерживает это свойство или метод"
Но если после этого снова запустить процедуру, то все нормально. Присваивается значение и никаких гвоздей. И далее тоже все нормально, хоть сотню раз вызывай метод - все работает. А вот В ПЕРВЫЙ РАЗ почему не получается???

Добавлено:
Причем, ошибается ИМЕННО в Combobox3! . День и месяц добавляет отлично.а вот с годом (гадом) проблемы..
Автор: Pravoved90
Дата сообщения: 26.09.2008 15:59

Цитата:
писать модуль для отката макроса

Да вобщем не столь принципиально, просто было бы удобно при проверки вновь создаваемых макросов. Думал, Ексель-гуру давно чтото простое придумали...а так не стоит свеч.

Подскажите, как(или можно ли в целом) сделать следующее:

Есть условие, записанное в VBA:

1. Если ([D4] > 0) And ([D4] < 50) -, выполнить "ряд заданий1".

2. Далее условие ([D4] > 50) And ([D4] < 90),- выполнить "ряд заданий2" и "ряд заданий1"
и тд. по возрастающей

П.2 я делаю так: пишу "ряд заданий2", и переписываю "ряд заданий1".

Вопрос: Можно ли упростить запись, чтобы не переписывать ряд заданий1 или не создавать лишние макросы?
Может есть какая-нибудь функция типа, "выполнить то же что и при ([D4] > 0) And ([D4] < 50)"
Может другие варианты?
Заранее благодарен за помощь
Автор: mistx
Дата сообщения: 26.09.2008 22:41
Друзья помогите решить задачу плиз.
Есть расписание, делается оно каждый месяц.
необходим макрос при выполнении которого все субботы и воскресенья отмечаются буквой О.



Автор: SERGE_BLIZNUK
Дата сообщения: 27.09.2008 07:58
Stupido
присоединяюсь к предложению MaximuS G - сделайте тестовые XLS файлики, запакуйте, выложите на любой бесплатный хостинг и сюда, в форум, ссылку на скачивание. (разумеется, любую коммерческую информацию заменяйте на что угодно!) было бы неплохо, если бы Вы прямо в файлике надписями (лучше со стрелочками) разъяснили - что надо сделать и как это делать...




mistx
1) обязательно макросом? имхо, тут можно обойтись простой формулой...
2) а поясните - почему в столбце G (6-09-2008 - суббота) у двух человек отметка "О" стоит, а у двух - нет? их как раз всех и нужно обработать? т.е. после макроса у всех в столбце G должна стоять отметка "О"?
Автор: mistx
Дата сообщения: 27.09.2008 10:01
SERGE_BLIZNUK
в принципе макрос необязателен, если можно то - формулой. (просто хотелось создать кнопку, чтобы при удалении старого графика, можно было бы вставить новый и нажатием кнопки все подсчиталось) Если - это сложно, то пусть будет формула.

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

Это было бы вообще Супер. Но хотя бы решить первую часть задачи.

Заранее благодарен.
Автор: Pravoved90
Дата сообщения: 27.09.2008 14:54
Ну вот...При выполнении условии выпадает ошибка Procedure too large. Что можно сделать в данной ситуации? Не знал, что есть какие-то ограничения на размер... Может, можно их снять? Или все прятать в макросы? Подскажите, кто занет, как лучше сделать..Спасибо

Добавлено:
Уже разобрался)) Разсовал куски по Subам, а в основное действо записал их имена))
Автор: ecolesnicov
Дата сообщения: 27.09.2008 19:58
Stupido

Все предельно ясно с ошибкой! У тебя в тексте где ты определяешь массив C - само С" написано по русски. Соответственно потом, когда ты пытаешься делать цикл по массиву он его не находит ...
Автор: Jamicon
Дата сообщения: 28.09.2008 09:04
Записи = результат отчета, требуется подправить и добавить разделитель и сделать импорт в другую базу.
В книге записи идут вот так ;

Mockino, Zoro 32881 0 Active Employee 9.17.2007 9.16.2012

Как сделать вот так ?

Mockino|Zoro|32881|0|Active|Employee|9.17.2007|9.16.2012

Чтобы во всех строках автоматически добавился такой разделитель, обьединились ячейки и вышел вот такой вот строчный вариант.
Автор: SERGE_BLIZNUK
Дата сообщения: 28.09.2008 19:49
Jamicon
приведите пример файлика.. может тогда легче будет Вам что-то подсказать...

evilone666
вопрос отсюда

Цитата:

ма'крос
моря'к
можно ли как-то чтобы вместо " ' " ставилась буква которая перед ним была большая
мАкрос
морЯк

Выделите нужные слова и попробуйте такой макрос:

Код:
Sub ChangeLetters()
Dim iCell As Range, s As String, p As Integer
For Each iCell In Selection
If InStr(1, CStr(iCell.Value), Chr(39)) > 1 Then
s = CStr(iCell.Value)
p = InStr(1, s, Chr(39))
While p > 1
s = Mid(s, 1, p - 2) & UCase(Mid(s, p - 1, 1)) & Mid(s, p + 1)
p = InStr(1, s, Chr(39))
Wend
iCell.Value = s
End If
Next
MsgBox "Done!"
End Sub
Автор: mistx
Дата сообщения: 28.09.2008 20:36
Ребята помогите с макросом пожалуйста (см. выше)
Автор: Jamicon
Дата сообщения: 28.09.2008 20:44
SERGE_BLIZNUK

Вот примерчик

Мне посоветовали через =A1&"|"&B1&"|"&C1 или функция сцепить, но это на каждую строку , а их 2500....
Автор: evilone666
Дата сообщения: 28.09.2008 20:55
SERGE_BLIZNUK
с таким макросом не получилось
вот сам файлик http://depositfiles.com/files/8304442 Книга1.7z 5.2 Mb
пасиб

Автор: Stupido
Дата сообщения: 29.09.2008 12:27
SERGE_BLIZNUK
MaximuS G

пример с подробным описанием в файле data.xls http://ifolder.ru/8338945

ecolesnicov

я так и подумал, что с "С" что то не так, но проверил только в циклах
зато теперь упёрся в другую ошибку при закрытии файла

Workbooks("E:\!RABOTA\Excel\forum\data.xls").Close (False)
error '9'
Subscript out of range

пробовал ещё такой вариант Workbooks("E:\!RABOTA\Excel\data.xls").Close SaveChanges:=False

ошибка та же
Автор: David_Kats
Дата сообщения: 29.09.2008 13:52
Какой-то парадокс!!
Пытаюсь присвоить свойству Combobox.Text текствое значение.

Public Sub ComboBoxInitialize(sheet As String)
With Worksheets(sheet)
'День
.ComboBox1.ListFillRange = "Служебный!K3:K33"
.ComboBox1.Text = Str(Day(Now()))

'Месяц
.ComboBox2.ListFillRange = "Служебный!L3:L14"
.ComboBox2.Text = MonthToString(Month(Now()))

'Год
.ComboBox3.ListFillRange = "Служебный!M3:M5"
.ComboBox3.Text = Str(Year(Now()))
End With
End Sub

После открытия книги в первую попытку выполнить эту процедуру выскакиевает сообщение об ошибке 438 мол "объект не поддерживает это свойство или метод"
Но если после этого снова запустить процедуру, то все нормально. Присваивается значение и никаких гвоздей. И далее тоже все нормально, хоть сотню раз вызывай метод - все работает. А вот В ПЕРВЫЙ РАЗ почему не получается???
Автор: Pravoved90
Дата сообщения: 29.09.2008 14:33
Добрый день, Господа. Подскажите, как сюда записать выполнение некоторых функций.
Пользуюсь макросом
Sub Copy()
Dim i As Integer
Dim CheckColumn As Integer


Sheets("Лист1").Range("I6:I8").Cut
Sheets("Лист2").Activate

For i = 1 To 1000
If IsEmpty(Cells(2, i)) And IsEmpty(Cells(2, i + 1)) Then
CheckColumn = i + 1
Exit For
End If
Next i

Cells(2, CheckColumn).Select
ActiveSheet.Paste

End Sub


В Листе2 Есть три ряда в одной строке, разделенные пробелами, в которые копируются значения. Как сделать так, чтобы значения копировались не после первого пробела(то есть после первого ряда), а, к примеру, после второго?

Еще если не сложно: 1. Как сделать, чтобы копирование производилось не просто в первую пустую ячейку, а первую ту пустую ячейку, после которой стоит еще 2 пустых ячейки
2. Как сделать так, чтобы проверялась не ячейка, а к примеру диапозон(напр: Если хоть одна ячейка A1:C1 - заполнена -искать дальше, если нет - Вставить в А1 и тд. )
Заранее благодарен за любой ответ.

Автор: Solenaja
Дата сообщения: 29.09.2008 14:36
такая вот задача

из данных столбца A нужно вычленить
"Управленческий учет..." и следующую за ней строку "Не списано..."
можно конечено делать фильтром, но тогда "Не списано..." попадает от "Бухгалтерского учета..."
Автор: David_Kats
Дата сообщения: 29.09.2008 15:09
Solenaja
Вот условие, которое выбирает именно те строки какие вам нужно. Подставляйте в этот блок необходимые действия.
For i = Start to Finish
If Left(Cells(i,1), 3) = "Упр" Then 'Находим строку, начинающуюся с "Упр"
If Left(Cells(i+1,2) = "Не" Then 'Находим строку, начинающуюся с "Не"

....Какие-то действия...

End If
End If
Next i
Автор: Solenaja
Дата сообщения: 29.09.2008 15:18
David_Kats
"....Какие-то действия..."
мне нужно на другом листе чтобы вычленные данные скопировались
Автор: David_Kats
Дата сообщения: 29.09.2008 16:29
Solenaja
Тогда так:
r=1 'Номер строки, с которой начнется запись вычленных строк в другом листе.
For i = Start to Finish
If Left(Cells(i,1), 3) = "Упр" Then 'Находим строку, начинающуюся с "Упр"
If Left(Cells(i+1,2) = "Не" Then 'Находим строку, начинающуюся с "Не"

'Добавляем вычлененные строки на лист "ИмяЛиста"
Sheets(ИмяЛиста).Cells(r,c) = Cells(i,1) ' с - № колонки в которую делается запись
Sheets(ИмяЛиста).Cells(r+1,c) = Cells(i+1,1)
r=r+2

End If
End If
Next i
Автор: Solenaja
Дата сообщения: 29.09.2008 17:03
David_Kats
спасибо
вот только 2007 Excel ругается на
If Left(Cells(i+1, 2) = "Не" Then 'Находим строку, начинающуюся с "Не"


Код: Compile error:
Expected: list separator or
Автор: WowGun
Дата сообщения: 29.09.2008 17:06
Solenaja
скобочки СЧИТАЕМ ....
Автор: Pravoved90
Дата сообщения: 29.09.2008 20:59
Добрый день, Господа. Подскажите, как сюда записать выполнение некоторых функций.
Пользуюсь макросом
Sub Copy()
Dim i As Integer
Dim CheckColumn As Integer


Sheets("Лист1").Range("I6:I8").Cut
Sheets("Лист2").Activate

For i = 1 To 1000
If IsEmpty(Cells(2, i)) And IsEmpty(Cells(2, i + 1)) Then
CheckColumn = i + 1
Exit For
End If
Next i

Cells(2, CheckColumn).Select
ActiveSheet.Paste

End Sub


В Листе2 Есть три ряда в одной строке, разделенные пробелами, в которые копируются значения. Как сделать так, чтобы значения копировались не после первого пробела(то есть после первого ряда), а, к примеру, после второго?

Еще если не сложно: 1. Как сделать, чтобы копирование производилось не просто в первую пустую ячейку, а первую ту пустую ячейку, после которой стоит еще 2 пустых ячейки
2. Как сделать так, чтобы проверялась не ячейка, а к примеру диапозон(напр: Если хоть одна ячейка A1:C1 - заполнена -искать дальше, если нет - Вставить в А1 и тд. )
Заранее благодарен за любой ответ.
Автор: David_Kats
Дата сообщения: 30.09.2008 09:23
Ой, ну конечно, я просто скобку одну не допечатал. Можно ж было догадаться! ))
Вот так надо:

If Left(Cells(i+1, 2)) = "Не" Then 'Находим строку, начинающуюся с "Не"
Автор: ecolesnicov
Дата сообщения: 30.09.2008 09:32
Stupido

Попробуй использовать объектные переменные. Т.е. когда делаешь Open - даешь Set File1=Workbooks.open(..., соответственно потом будешь работать не с полным путем, а с этим объектом. Т.е. при закрытии будешь писать File1.Close SaveChanges:=True
Автор: Roka
Дата сообщения: 30.09.2008 10:28
Подскажите как правильнее и быстрее всего будет сравнить данные по столбцам в двух excel-файлах.
Имеем два файла:
в первом 2 столбца (инв. номер и наименование), во втором (инв. номер и сумма)
нужно в первый файл добавить колонку с суммой из второго в соответствии с инвентарным номером, а ячейку с инв. номером из первой таблицы, который не найден во второй залить красным цветом.
Пробег по стокам как-то уж очень долго отрабатывает.

Заранее спасибо
Автор: Solenaja
Дата сообщения: 30.09.2008 10:46
David_Kats

Код: Sub searching()
r = 1 'Номер строки, с которой начнется запись вычленных строк в другом листе.
For i = Start To Finish
If Left(Cells(i + 1), 3) = "Упр" Then 'Находим строку, начинающуюся с "Упр"
If Left(Cells(i + 1), 2) = "Не" Then 'Находим строку, начинающуюся с "Не"
'Добавляем вычлененные строки на лист "ИмяЛиста"
Sheets(Лист2).Cells(r, 1) = Cells(i, 1)
' с - № колонки в которую делается запись
Sheets(Лист2).Cells(r + 1, 1) = Cells(i + 1, 1)
r = r + 2
End If
End If
Next i
End Sub
Автор: David_Kats
Дата сообщения: 30.09.2008 11:00
Solenaja
Ну так имя листа нужно в кавычки взять! "Лист2"
Start и Finish - надеюсь понятно, что нужно вместо них подставить номера строк начала и конца списка?
Автор: Solenaja
Дата сообщения: 30.09.2008 11:02
David_Kats
ты же не пояснил это - я в VBA не сильно соображаю
со Start понятно = 1
а Finish нельзя ли сделать универсальнее, т.е. по последнюю ячейку


Код: Sub searching()
r = 1 'Номер строки, с которой начнется запись вычленных строк в другом листе.
For i = 1 To 75000
If Left(Cells(i, 1), 3) = "Упр" Then 'Находим строку, начинающуюся с "Упр"
If Left(Cells(i + 1), 2) = "Не" Then 'Находим строку, начинающуюся с "Не"
'Добавляем вычлененные строки на лист "ИмяЛиста"
Sheets("Лист2").Cells(r, 1) = Cells(i, 1)
' с - № колонки в которую делается запись
Sheets("Лист2").Cells(r + 1, 1) = Cells(i + 1, 1)
r = r + 2
End If
End If
Next i
End Sub
Автор: David_Kats
Дата сообщения: 30.09.2008 11:21
Public Function LastRow(Optional wrb As String, Optional sheet As String, Optional coloumn As Variant) As Integer
'Функция считает количество значащих строк на АКТИВНОМ листе.
Dim adress As String
If wrb = "" Then wrb = ThisWorkbook.Name
If sheet = "" Then sheet = ActiveSheet.Name
With Workbooks(wrb).Sheets(sheet)
If IsMissing(coloumn) Then
adress = "A65536"
LastRow = .Range(adress).End(xlUp).row
ElseIf Not IsNumeric(coloumn) Then
adress = "" & coloumn & 65536 & ""
LastRow = .Range(adress).End(xlUp).row
Else
LastRow = .Cells(65536, coloumn).End(xlUp).row
End If
End With
End Function

Затем, в основном коде для определения последней строки просто вызывай эту функцию. Например: Finish = LastRow("ИмяКниги", "ИмяЛиста", НомерКолонки)
НомерКолонки может быть как цифрой, так и текстовым значением, например "А"

Добавлено:
Функцию LastRow засунь в модуль.
Автор: Solenaja
Дата сообщения: 30.09.2008 11:27
макрос в последнем моем сообщении - не работает ни в 2003, ни в 2007
вот кусок таблицы для проверки
[more]Бухгалтерский учет. Документ Реализация товаров и услуг Хл000000011 от 14.07.2008 11:01:26, табличная часть "Товары"
Не списано по партиям 2 шт. товара Переходник пластик/чугун 110/124 (ПХВ), счета учета 281, 0241
Бухгалтерский учет. Документ Реализация товаров и услуг Хл000000011 от 14.07.2008 11:01:26, табличная часть "Товары"
Не списано по партиям 2 шт. товара Перех.резин. 110, счета учета 281, 0241
Бухгалтерский учет. Документ Реализация товаров и услуг Хл000000011 от 14.07.2008 11:01:26, табличная часть "Товары"
Не списано по партиям 1 шт. товара Муфта 110 (ПХВ), счета учета 281, 0241
Бухгалтерский учет. Документ Реализация товаров и услуг Хл000000011 от 14.07.2008 11:01:26, табличная часть "Товары"
Не списано по партиям 1 шт. товара Тройник 110 50 90 (ПХВ), счета учета 281, 0241
Реализация товаров и услуг Хл000000011 от 14.07.2008 11:01:26
Реализация товаров и услуг Ф0000006793 от 14.07.2008 11:01:35
Расходный ордер на товары Ф0000008561 от 14.07.2008 11:01:50
Приходный кассовый ордер Ф0000005158 от 14.07.2008 11:02:01
Приходный кассовый ордер Ф0000005159 от 14.07.2008 11:02:14
Приходный кассовый ордер Ф0000005160 от 14.07.2008 11:03:06
Реализация товаров и услуг Ф0000006794 от 14.07.2008 11:03:21
Расходный ордер на товары Ф0000008562 от 14.07.2008 11:03:50
Реализация товаров и услуг Ф0000006795 от 14.07.2008 11:06:23
Приходный кассовый ордер Ф0000005161 от 14.07.2008 11:08:21
Реализация товаров и услуг Ф0000006796 от 14.07.2008 11:08:34
Приходный ордер на товары Ф0000001698 от 14.07.2008 11:09:31
Возврат товаров от покупателя Ф0000000306 от 14.07.2008 11:09:49
Приходный кассовый ордер Ф0000005162 от 14.07.2008 11:09:50
Реализация товаров и услуг Ф0000006797 от 14.07.2008 11:09:59
Расходный ордер на товары Ф0000008565 от 14.07.2008 11:10:09
Приходный кассовый ордер Ф0000005163 от 14.07.2008 11:11:30
Управленческий учет. Документ Реализация товаров и услуг Ф0000006798 от 14.07.2008 11:11:39, табличная часть "Товары"
Не списано по партиям 2 шт. товара Пробка длинная 20*1/2 (ZAGDXXXXXX), со склада: О Склад товаров
Реализация товаров и услуг Ф0000006798 от 14.07.2008 11:11:39
Реализация товаров и услуг Ф0000006799 от 14.07.2008 11:11:42
Управленческий учет. Документ Расходный ордер на товары Ф0000008566 от 14.07.2008 11:11:47, табличная часть "Товары"
Не списано по партиям 2 шт. товара Пробка длинная 20*1/2 (ZAGDXXXXXX), со склада: О Склад товаров
Расходный ордер на товары Ф0000008566 от 14.07.2008 11:11:47
Расходный ордер на товары Ф0000008567 от 14.07.2008 11:11:54
Расходный ордер на товары Ф0000008558 от 14.07.2008 11:12:40
Приходный кассовый ордер Ф0000005164 от 14.07.2008 11:14:07
Приходный кассовый ордер Ф0000005165 от 14.07.2008 11:14:19
Реализация товаров и услуг Ф0000006800 от 14.07.2008 11:15:00[/more]

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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