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

» Excel VBA

Автор: Sk1f
Дата сообщения: 20.10.2006 13:05
Посоветуйте книги по VBA EXCEL - в продаже.

Автор: Pantera3587
Дата сообщения: 20.10.2006 19:36
помогите написать код!!! я только учусь писать макросы.
допустим, есть на одном листе таблица, занимающая диапазон A:F. в этом диапазоне записываются какие-то данные, но в первом столбце могут записыватся одинаковые числа. нужно, чтобы на другой лист копировались все данные, у которых числа в первом столбце одинаковы. Этот код должен выполняться после внесения числа из первого столбца в окно сообщения InputBox
Автор: Yuk
Дата сообщения: 21.10.2006 19:26
Pantera3587
Типа такого?

Код: Sub test()
res = InputBox("Enter number:")
nr = Sheets(1).UsedRange.Rows.Count
Sheets(2).UsedRange.Clear
j = 1
For i = 1 To nr
If Cells(i, 1) = CInt(res) Then
For c = 1 To 6
Sheets(2).Cells(j, c).Value = _
Sheets(1).Cells(i, c).Value
Next c
j = j + 1
End If
Next i
End Sub
Автор: PavelO
Дата сообщения: 22.10.2006 17:08
Вот такие есть вопросы (может кто знает):
1. Как программно сохранить книгу(т.е. чтобы она не спрашивала:"Сохранить документ? Да?Нет?"). Возможно не сохранить, но обойти этот вопрос так, чтобы изменения в книге сохранились???
2. Как ускорить быстродействие программы (а то она слишком тормозит сильно, т.к. в ней постоянно сравниваются каждая ячейка одного столбца с каждой ячейкой другого столбца в основном через for-next, бывает for each-next и встречается do-while с различными условиями: if instr...then, if eto = to then)???. вообщем долго машина думает.
Автор: AndVGri
Дата сообщения: 22.10.2006 20:16
PavelO
Чтобы сохранить
Activeworkbook.Save
Чтобы не спрашивал
Activeworkbook.Saved = True
после чего закрыть без вопросов
Activeworkbook.Close
Автор: Yuk
Дата сообщения: 22.10.2006 20:26
PavelO
1. Ты имеешь ввиду при закрытии книги сохранять ее, не спрашивая пользователя? Для конкретной книги или для всех (последнее я лично не стал бы делать)? Если так, используй событие Workbook_BeforeClose и метод ActiveWorkbook.SaveAs

2. Программа в модуле или это обработчик событий?
Можно попробовать ограничить область, где сравниваются ячейки. Попробовать оптимизировать сравнение. Не видя кода сложно сказать.
Также попробуй вставить в начало кода:
Код: Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Автор: PavelO
Дата сообщения: 23.10.2006 00:36
Все. Сделал (Делал на ексель 2003, ВинХР). Всю прогу. У меня она работала. Принес к подруге показать (У нее ексель 2000, Вин98се). И ошибки поперли. Пишет что-то типа: "Compile error in hiden module Лист1". Нет ну понятно, что там все начиналось с кнопки, которая распологалась на Листе1, и от нее то ошибки и пошли. Полез разбираться. Ну некоторые переменные не обазвал - исправил, далее вба мне стал выделять такие операторы, как mid,left,ltrim, ссылаясь на ошибку. Видимо что-то со стрингами, обазваk переменную стрингом, она же используется в:For each c in worksheets("List1").range("A1:A200"), далее if mid(c.value, 3,5)>0 then .....
Почему у меня все работало, а у нее перестало??? Понятно, что разница версий, но всеже почему???
Автор: DeadVillage
Дата сообщения: 23.10.2006 01:10
Доброго времени суток!
Надо было сравнить пару текстовый файлов с данными (В каждом файле 4 колонки через запятую. В конце строки пусто. Но сравнить надобно только первую колонку). Думал быстренько открыть в Экселе да и сравнить колонки из разных файлов. Да нарвался на проблему - файлы длинноваты, а в Экселе максимум 65536 строк всасывает. А в файле данные раза в 4 этот максимум перекрывают. Разорвать текстовый файл на куски и втянуть покусочно в отдельную колонку. Но ведь не разовая задача и геморойно.
А вопрос такой - может ли Эксель, открывая слишком длинный столбец данных, размещать это дело самостоятельно в нескольких последовательных колонках? Или это токма макросами делать надо?


проблему решил своеобразно - с помощью программульки WinMerge.
Автор: SERGE_BLIZNUK
Дата сообщения: 23.10.2006 04:45
DeadVillage

Цитата:
сравнить пару текстовых файлов с данными

1) что значит - сравнить?.. выбрать строчки, которые отличаются? Или которые одинаковы? Или просто посмотреть глазками, что там разное ;-))
2) вы уверены, что написать подобную задачку на любом языке программирования будет не проще?
3)
Цитата:
А вопрос такой - может ли Эксель, открывая слишком длинный столбец данных, размещать это дело самостоятельно в нескольких последовательных колонках

насколько я знаю - нет, не может... Нужно писать свою обработку текстового файла, хоть на VBA, хоть на любом языке программирования.

Добавлено:
оп-па. Пока я тут прыгал, проблема уже и решена.

Цитата:
проблему решил своеобразно - с помощью программульки WinMerge.

;-)) я же говорил - Excel в данном случае не очень подходит.
закрываем дискуссию... ;-)
Автор: zporuchik
Дата сообщения: 23.10.2006 07:45
Добрый день!
Уважаемые подскажите, пожалуйста: как можно из экселя работать с MDB (базами акцеса)?
Задача: В экселе создается техническое задание на монтаж, а вся инфа хранится на сервере в виде баз Акцеса. Причем необходимо выдергивать данные из двух разных баз.
Пробовал это делать ч/з микрософтКуэри и ч/з ИмпортВнешнихДанных, но как-то неудобно и некрасиво. И к томуже экселевские файлы стали на порядок тяжелее.
Спасибо. Я понимаю, что можно в Акцесе создавать техзадание и не ....пудрить мозги, но так уж повелось в этой организации до меня (тяжело ломать устои, да и в Акцесе я как жук в апельсине )
Автор: jONES1979
Дата сообщения: 23.10.2006 14:19
zporuchik

Думаю без VBA не обойтись...

А какого рода инфа в акцессе? Справочники? И надо чтобы в екселе они были доступны? В каком виде? Формы с выпадающими списками и т.п.?
Автор: Yuk
Дата сообщения: 23.10.2006 17:34
zporuchik
Есть книжка O'Reilly Integrating Excel and Access. Где брал не помню, но могу закачать куда-нибудь. Надо?

Добавлено:
Нашел, откуда брал. Ru-board, конечно же!
http://forum.ru-board.com/topic.cgi?forum=93&topic=0461&start=120#5
Автор: zporuchik
Дата сообщения: 24.10.2006 07:22
jONES1979
Так я и не просил без VBA.
В акцессе инфа по базовым станциям и радиорелейкам: их номера, адреса, азимуты, типы оборудования, азимуты и т.д.
В экселе нужны разные варианты доступа:
например: введя номер БС в соответствующие поля вносятся данные из акцесса, но не все данные есть в базе в явном виде и поэтому нужны выпадающие списки (которые отфильтровываются по номеру БС и вместо 500 значений в списке остается 5-6).

Yuk
За книгу большое спасибо - полистаю, но увы с инглишем неочень

Вопрос еще: в принцыпе возможен вариант работы из экселя с базами акцеса чтение/запись, т.е. в мою форму читаются данные из базы, а те которых в базе нет я ввожу в экселе и они добавляются в базу акцес?
Если вариант запись/чтение невозможен, то нестоит и заморачиваться с этим, а надо делать в акцесе мою форму техзадания

Всем кто откликнулся - спасибо! И сильно не ругайтесь - я ведь только учусь
Автор: jONES1979
Дата сообщения: 25.10.2006 11:15
zporuchik
вариант "чтение/запись" возможен, но имхо проще сделать в акцессе форму техзадания Хотя конечно же я не знаю про что говорю, так как не видел того что у Вас есть наработанного
Автор: sonix555
Дата сообщения: 25.10.2006 13:55
День добрый,
кто-нить поделитесь макросом "календарь". Хочу вводить дату не вручную, а при помощи такой "штуковины"... Событие или метод вызова значения не имеют..

заранее благодарен.
Автор: Pantera3587
Дата сообщения: 25.10.2006 16:58
Кто может решить такую задачу (нужен код)? Помогите!!!
на одном листе такая таблица
Фамилия    КодА    КодАВ    СО    Значение
иванов     Р142     Р1412    цо     350
петров     Р142     Р1412    цо     0
сидоров    Р142     Р1412    цо     0
хомяков    Р142     Р1412    цо     0
иванов     Р142     Р1413    цо     0
петров     Р142     Р1413    цо     0
сидоров    Р142     Р1413    цо     250
хомяков    Р142     Р1413    цо     0
иванов     Р145     Р1452    цо    
петров     Р145     Р1452    цо     217
сидоров    Р145     Р1452    цо    
хомяков    Р145     Р1452    цо    
иванов     Р189     Р189      цз    
петров     Р189     Р189     цз    
сидоров    Р189     Р189     цз    
хомяков    Р189     Р189     цз     137
на другом листе такая
Фамилия    КодА    КодАВ    СО    Значение
иванов     Р142    Р1412     цо     58
сидоров    Р142    Р1412     цо     2
сидоров    Р142    Р1413     цо     317
петров     Р145    Р1452     цо     309
хомяков    Р189    Р189     цз     450
петров     Р189    Р189     цз     402
Необходимо, чтобы на третий лист копировалась таблица с первого листа и добавлялись данные(столбец Значения) со второго листа, но так, чтобы эти значения соответствовали фамилии, кодуА и коду АВ , т.е. получилась бы вот такая таблица
Фамилия    КодА    КодАВ    СО    Значение план    значение факт
иванов     Р142    Р1412     цо 350     58
петров     Р142    Р1412     цо     0    
сидоров    Р142    Р1412     цо     0     2
хомяков    Р142    Р1412     цо     0    
иванов     Р142    Р1413     цо     0    
петров     Р142    Р1413     цо     0    
сидоров    Р142    Р1413     цо     250     317
хомяков    Р142    Р1413     цо     0    
иванов     Р145    Р1452     цо        
петров     Р145    Р1452     цо     217     309
сидоров    Р145    Р1452     цо        
хомяков    Р145    Р1452     цо        
иванов     Р189     Р189     цз        
петров     Р189    Р189     цз
хомяков    Р189    Р189     цз     137     450

Автор: sonix555
Дата сообщения: 25.10.2006 17:49
Проще простого батенька. Используй фунцкию запись макроса. Зайди в записанный макрос, посмотри, подумай, попробуй разобраться... Для "идеального" копирования сделай цикл который смотрит на последнюю "непустую" ячейку. А если колличество фамилий и их расположение в обоих таблицах идентично, то тут вообще неочем говорить
Вообще люди обращаются к форуму, когда у них что-то не получается, а не когда им лень с этим разбираться (ИМХО). Но если это вопрос жизни и смерти, последняя надежда на спасение (если не сейчас, то ВСЕ, ж..па) - бывают и исключения.
Автор: Yuk
Дата сообщения: 25.10.2006 19:37
sonix555
Если в Control Toolbox зайти в More Controls, можно найти Microsoft Date and Time Picker Control. По крайнер мере так у меня. Думаю, то, что тебе нужно.

Pantera3587
sonix555 хоть и груб, но в некотором роде прав. Я же Вам уже давал код на прошлой странице, очень похожий. Почему бы не разобраться и не модифицировать. Если есть конкретные вопросы или что-то не получается, спрашивайте - поможем.

Автор: DHelena
Дата сообщения: 26.10.2006 08:40
У меня есть старый файл с группой макросов, которые я писала для организации. Файл для Excell97. Совеременный Excell, открывая его, сообщает, что файл поврежден, и, в результате, выдает разрушенный файл. Приходится работать в старом Excell'е.

Как перенести макросы в новый?
Автор: mrdime
Дата сообщения: 26.10.2006 10:22
DHelena
В старом Excell сделай экспорт каждого макроса отдельно (в формате .bas). Запусти новый - импортируй все макросы (в формате .bas) в новый файл - все должно работать. Немного медлено, если макросов много, зато надежно.


Добавлено:
Привет всем,

Такой вопрос. В Excel есть таблички с названиями предприятий. Все они представлены в довольно "кривом" виде. Задача - надо преобразовать все названия к читабельному виду.
Например есть: ООО "ТД "РОГА И КОПЫТА"
надо чтобы получилось ООО "ТД "Рога и копыта"
В моем макросе ключевое место занимает ф-я InStr для поиска позиции кавычек, но она ищет слева-направо, а мне надо наоборот. Можно ли как-либо задать ей напрвление поиска или для этого есть какя-нибудь другая функция?
Автор: jONES1979
Дата сообщения: 26.10.2006 14:09
mrdime

Перед поиском сделать реверс исходной строки.
Автор: mrdime
Дата сообщения: 26.10.2006 14:25
jONES1979
Ок, какой-то стандартной функцией это можно сделать?
Автор: Troitsky
Дата сообщения: 26.10.2006 17:05
mrdime

Цитата:
Ок, какой-то стандартной функцией это можно сделать?

Есть стандартная функция StrReverse(), но честно говоря для решения твоей проблемы можно придумать лучшее решение. Ща подумаю.
Автор: jONES1979
Дата сообщения: 26.10.2006 17:39
mrdime

Использовать функцию InStrRev()
Автор: LeSlav
Дата сообщения: 26.10.2006 17:51
всем привет
кто подскажет как отключить макросом автоматическое вычисление на момент исполнения макроса ну и как потом его обратно включить?)))))
Автор: Troitsky
Дата сообщения: 26.10.2006 20:34
mrdime
В общем в сторону регулярных выражений нужно копать. Но так как эти RegExp'ы для меня темный лес, 100% рабочий код я тебе написать не могу - батва какая то получается типа
Код: Dim myReg As RegExp
Dim strStr As String, strNew As String

Set myReg = New RegExp
myReg.Pattern = "(^[^""]*[""].)(.+)([""]$)"

strStr = "ООО ТД ""РОГА И КОПЫТА"""
strNew = myReg.Replace(strStr, "$1") & LCase(myReg.Replace(strStr, "$2")) & myReg.Replace(strStr, "$3")
Автор: LeSlav
Дата сообщения: 27.10.2006 12:45

Цитата:
кто подскажет как отключить макросом автоматическое вычисление на момент исполнения макроса ну и как потом его обратно включить?)))))

отбой... заработался и протупил))))
Автор: Pantera3587
Дата сообщения: 30.10.2006 12:50
Есть такая таблица
Дата     Клиент    Сумма
01.12.2006    Иванов    234,00р.
03.05.2006    Сидоров    456,00р.
23.06.2006    Петров    345,00р.

Есть такой макрос
Sub МакросГПР()

' Макрос записан 30.10.2006 (DIREKTOR)

Dim str As String
Dim i As Integer
Dim j As Integer
Dim c As Variant
Dim nr As Variant

str = InputBox("Введите заголовок столбца: ") 'появляется диалоговое окно в поле
'которого либо вводится слово Дата, либо вводится слово Клиент, либо вводится слово Сумма

Range("E1").Select
Range("E1").Formula = str 'здесь должно отобразиться слово из диалогового окна

nr = InputBox("Введите номер строки: ") 'появляется диалоговое окно в поле
'которого вводится любой номер строки, т.е. любая цифра

Range("F1").Select
Range("F1").Formula = "=HLOOKUP(RC[-1],C[-5]:C[-3],nr,FALSE)"


End Sub

Помоготе отредактировать макрос так, чтобы после введения во втором окне номера строки(цифры), этот номер строки отображался в формуле. Так как я записала, он в ячейку F1 записывает следующую формулу:
=ГПР(E1;A:C;nr;ЛОЖЬ), а мне нужно чтобы в этой формуле отображалась бы цифра из диалогового окна, т.е, если я ввожу цифру 3, то формула должна буде выглядеть так
=ГПР(E1;A:C;3;ЛОЖЬ),
если ввожу 41, то так
=ГПР(E1;A:C;41;ЛОЖЬ),
Автор: AndVGri
Дата сообщения: 30.10.2006 18:52
Pantera3587
Range("F1").Formula = "=HLOOKUP(RC[-1],C[-5]:C[-3]," & nr & ",FALSE)"
Автор: Pantera3587
Дата сообщения: 31.10.2006 16:52
Хочу усовершенствовать свой предыдущий макрос ГПР. Выделяю любую активную ячейку, в которой появляется значение равное str, затем после нажатия ок выделяется следующая ячейка, которая располагается рядом с выделенной (ActiveCell.Offset(0, 1).Select), потом после введения номера строки выполняется функция ГПР. Вопрос: можно ли в этой функции сделать так, чтобы после скобки шла ссылка на первую выделенную активную ячейку, т.е. если я выделяю ячейку Е2, то функция имела бы вид после выполнения макроса
=ГПР(E2;$A:$C;2;ЛОЖЬ)
если я выделяю ячейку F4, то такой
=ГПР(F4;$A:$C;2;ЛОЖЬ)

Попыталась сделать, но мне выдается следующая формула
=ГПР(0;$A:$C;2;ЛОЖЬ)

Вот мой как бы усовершенствованный макрос

Sub МакросГПР2()

' Макрос записан 30.10.2006 (DIREKTOR)

Dim str As String
Dim i As Integer
Dim j As Integer
Dim c As Variant
Dim nr As Variant

str = InputBox("Введите заголовок столбца: ") 'появляется диалоговое окно в поле
'которого либо вводится слово Дата, либо вводится слово Клиент, либо вводится слово Сумма

ActiveCell.Select
ActiveCell.Formula = str

'выделение рядом стоящей ячейки
ActiveCell.Offset(0, 1).Select

i = ActiveCell ' здесь вроде как присваивается переменной выделенная первой активная ячейка, выделенная первой

'появляется диалоговое окно в поле
'которого вводится любой номер строки, т.е. любая цифра

nr = InputBox("Введите номер строки: ")

'здесь используется функция ГПР
ActiveCell.FormulaR1C1 = "=HLOOKUP(" & i & ",C1:C3," & nr & ",FALSE)"


End Sub

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


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