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

» Excel VBA (часть 2)

Автор: vasiliy74
Дата сообщения: 28.01.2008 12:27
Excel.xlClosed ошибся Application.Quit в в середине макроса, получается он сам себя закроет и прервёт выполнение? ну это корректно так писать просто примеров не нашёл... работает вроде нормально.
Как прописать строку в шедуллере? для того чтобы задать расписание, по которому автоматически бы открывался файл.


Автор: Mamontoza
Дата сообщения: 28.01.2008 17:49
Есть такой макрос, что к нему дописать чтоб он удалял строчки у которых начало пустая клетка и ----.



Sub Макрос4()
'
' Макрос4 Макрос
' Макрос записан 28.01.2008 (mamont)
'

'
Range("H23").Select
Columns("G:G").ColumnWidth = 18.14
Columns("A:G").Select
Range("G1").Activate
Selection.Sort Key1:=Range("E1"), Order1:=xlAscending, Key2:=Range("F1") _
, Order2:=xlAscending, Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:= _
xlSortNormal
Range("H:H,I:I,J:J").Select
Range("J1").Activate
Selection.Delete Shift:=xlToLeft
Range("D6").Select
ActiveWindow.SmallScroll Down:=117
With Application.ReplaceFormat.Font
.Subscript = False
.ColorIndex = 11
End With
With Application.ReplaceFormat.Font
.FontStyle = "полужирный"
.Subscript = False
.ColorIndex = 11
End With
Cells.Replace What:="O", Replacement:="Исходящий ", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True
Range("F174").Select
ActiveWindow.SmallScroll Down:=-42
Windows("temp").Activate
Cells.Replace What:="T", Replacement:="Исходящий ", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True
With Application.ReplaceFormat.Font
.FontStyle = "полужирный"
.Subscript = False
.ColorIndex = 9
End With
Cells.Replace What:="I", Replacement:="Входящий ", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True
Cells.Replace What:="t", Replacement:="Входящий ", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True
ActiveCell.Replace What:="t", Replacement:="Входящий ", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True
Range("H149").Select
ActiveWindow.SmallScroll Down:=279
Columns("G:G").ColumnWidth = 27.71
ActiveWindow.SmallScroll Down:=12
End Sub

Заранее спасибо
Автор: Sunnych
Дата сообщения: 29.01.2008 09:50
Mamontoza вот видел такое может поможет:
Удаление всех пустых строк в таблице

Цитата:
Sub DeleteEmptyRows()
LastRow = ActiveSheet.UsedRange.Row - 1 + _
ActiveSheet.UsedRange.Rows.Count
Application.ScreenUpdating = False
For r = LastRow To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
Next r
End Sub
Автор: Mamontoza
Дата сообщения: 29.01.2008 10:26
Спасибо за ответ.
А если в стоблце А пустая клетка а в В нет. то мне нужно чтоб удалял строчки по столбцу А игнорируя все остальные и удалял по определнному условию (например в стоблце А в клетке будет написан ----)
Автор: SAS888
Дата сообщения: 29.01.2008 11:49
Mamontoza
Измени условие в коде выше. Например:
If IsEmpty(Cells(r, "A")) Or Cells(r, "A") = "----" Then Rows(r).Delete
Автор: vasiliy74
Дата сообщения: 29.01.2008 13:17
как правильно обратиться к макросу если входных данных несколько?
TransPivot("um",true) Ругается типа: "Compile error Expected:="

Sub TransPivot(Le As String, reload As Boolean)

Добавлено:
Вопрос об использование своих модулей для универсальности кода, модули есть смысл писать их как функции может?
Автор: AndVGri
Дата сообщения: 29.01.2008 16:36
vasiliy74

Цитата:
TransPivot("um",true)

процедура вызывается

Код:
TransPivot "um", True
'или
Call TransPivot("um",true)
Автор: vasiliy74
Дата сообщения: 29.01.2008 17:06

Цитата:
переведи

не sub а function например...

есть такая проблема когда выполняю подряд несколько макросов последний виснет, типа ошибка Out of memory на операции Sheets.Add.Name = "TEMP" , лист создаётся но имя у него по умолчанию, помогает только перезагрузка и продолжение с того макроса на котором Excel выдавал ошибку, и всё нормально, если опять запускаю подряд, то опять выдаёт ошибку... как чистить память и что там остаётся???

Добавлено:
Ещё вопрос, может кто сталкивался?:
Если я в цикле добавляю строку то будет ли он работать?


Код: For Each c2 In out_r
out_r(index, 1) = Format(c1, "dd.mm.yyyy")
out_r(index, index1) = c1.Offset(0, index_col)
if c2=YTR then
c2.Insert Shift:=xlDown
end if
index = index + 1
Next
Автор: nick7inc
Дата сообщения: 29.01.2008 21:32
vasiliy74

Цитата:
есть такая проблема когда выполняю подряд несколько макросов последний виснет, типа ошибка Out of memory на операции Sheets.Add.Name = "TEMP"

Думаю, что надо выделить проблемный код в отдельный Excel'ский файл (чтобы проблема в этом файле легко воспроизводилась) и выложить куда-нибудь. Приведённого фрагмента явно не хватает, поскольку неизвестны типы данных. Возможно что-то не так с добавлением ячеек...

Добавлено:
vasiliy74

Цитата:
TransPivot("um",true) Ругается типа: "Compile error Expected:="

Правильно ругается, скобки ставлятся, если используются функции. В процедурах скобки не используются.

Цитата:
Если я в цикле добавляю строку то будет ли он работать?

Смотря как добавить. От ошибок никто не застрахоыван и самый простой вариант написать и проверить.
Автор: AndVGri
Дата сообщения: 30.01.2008 04:05
vasiliy74
Модули всего лишь группирующая конструкция языка в которых размещаются и процедуры и функции, вызываемые без создания экземпляра модуля, в отличии от классов. Разные модули могут содержать функции (процедуры) с одинаковым именем, тогда в вызывающем блоке необходимо будет указать, например, Module1.MyFunction/Module2.MyFunction

Цитата:
Sheets.Add.Name = "TEMP"

А каким образом это работает? Или лист с именем "TEMP" создаётся в различных книгах? Иначе Excel выдаст сообщение - нельзя создать в книге листы с одинаковыми именами
Автор: DavidKATS
Дата сообщения: 30.01.2008 15:23
Всем привет! Кто подскажет, кто расскажет, из-за чего и почему многие методы и свойства не работают в книгах, если в них включен общий доступ. Как только галочку снимешь, все работает отлично.. что за глюк, а???
Автор: PETKINA75
Дата сообщения: 30.01.2008 15:53
Очень прошу мне помочь, так как не получается задать условия отбора для расширенного фильтра. Имеются два столбца, правый столбец содержит телеф.номера, а левый - их счета.
9 384622
9 384629
9 384807
9 385400
9 385407
9 385700
9 385711
34 201400
136 262179
136 265003
189 286236
189 286237
189 895120
189 895121
189 895122
189 895123
189 895124
189 895125
и т.д. (несколько тысяч).
Формат ячеек текстовый у обоих столбцов. Мне надо, чтобы по первым двум и иногда трем цифрам второго столбца отобрать нужные мне номера вместе со счетами.
Задаю условия расширенного фильтра в других ячейках, например:
=38****
=26****
=895***
=48**** и т.д.
Таких условий больше 10.
Но фильтр отбирает только первый по списку и если условие с нуля начинается, а на остальные не реагирует, как будто не понимает формат содержимого ячеек . Записываю действия в макросе, так делаю это часто. С автофильтром получилось, но там больше двух условий не ставится. Вот ломаю голову, но ничего в интернете с отбором не нашла. Прошу помощи у форума.
Автор: Smog
Дата сообщения: 30.01.2008 17:08
PETKINA75
Ну во-первых не =38****, а =38????
А во вторых формат нельзя к числу привести?
Автор: DavidKATS
Дата сообщения: 30.01.2008 17:24
Smog
Друг, насчет моего вопроса (выше) ничего сказать не можешь?
Автор: Nikarton
Дата сообщения: 30.01.2008 23:34
Есть задача.. Екселивский документ Лист1 в ячейку А1 вносим данные - цифры, которые автоматически должны перенестись или в новый документ или в следующий лист2, - в ячейку В1....
ячеек будет приблизительно 150-200, то есть все данные должны переноситься из одного листа во второй, и если данные меняются они должны автоматически меняться во втором листе...
Хелп......
Автор: AndVGri
Дата сообщения: 31.01.2008 02:15
Nikarton
А кто Вам мешает на Лист2 в ячейке B1 ввести формулу =Лист1!A1 и для прочих ячеек Лист2 соответственно?
Автор: PETKINA75
Дата сообщения: 31.01.2008 08:23
Smog, мы получаем уже такие файлы с расширением .txt и когда ехсеlом их открываем то, чтобы данные не поменялись их нужно открывать именно с текстовым форматом.
Автор: AndVGri
Дата сообщения: 31.01.2008 09:21
PETKINA75
Вообще то вопрос больше для Excel FAQ
А так
Пусть столбцы данных А и В. Названия Счёт, Телефон в ячейках А1, В1
Диапазон условий:
1) в D1 — Телефон
2)В ячейке E2 пишем формулу =НАЙТИ("38",B2,1)=1
3) E3 — =НАЙТИ("26",B2,1)=1
4) F4 — =НАЙТИ("895",B2,1)=1
и т. д.
Автор: ZORRO2005
Дата сообщения: 31.01.2008 09:57
Друзья,
VBA только учусь.
Решил сделать свой фильтр похожий на Расшир.фильтр
Пытаюсь смоделировать Фильтр-(Условие..)для 2-ух и более критериев.
Вопросы следующие:
1.Пытаюсь вместо Operator:=xlAnd подставить
=ActiveSheet.Range("J2").Value
не получается
'В коде видно где я застрял.

2.Хочу когда выбираю фильтр(Все)в ячейке С2 очищать содержимое "D2"
3.Было бы здорово если в D2:D12 автоматически обновлялись списки уникальных значений

Если не сложно подскажите где можно улучшить(оптимизировать) код
и как лучше реализовать идею выбора >2 критериев для одного столбца

Пример: http://slil.ru/25421462
Автор: PETKINA75
Дата сообщения: 31.01.2008 10:34
Smog, вот я так делаю:

Sub mac1()
Columns("A:B").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"E1:E4"), CopyToRange:=Columns("G:H"), Unique:=False
End Sub
А "E1:E4" содержит такие пробные условия:
=32???? Формат текстовый, так как если переделываю на числовой, то эти условия не
=40???? хотят ставиться ни с *, ни со ?, говорят, что формат не правильный.
=74????
=22????
Но, все равно не получается. Вернее отбирает только один номер, первый, который начинается на 32. Номера разбросаны и идут не попорядку, их не надо сортировать, так как счета идут по порядку.
Автор: vasiliy74
Дата сообщения: 31.01.2008 12:51
nick7inc

Цитата:
Правильно ругается, скобки ставлятся, если используются функции. В процедурах скобки не используются.

Мне AndVGri помог нужно ставить
Цитата:
Call

AndVGri

Цитата:
А каким образом это работает?
-была проблема с PivotCashes

Автор: nick7inc
Дата сообщения: 31.01.2008 13:10
vasiliy74

Цитата:
Мне AndVGri помог нужно ставить Call

А зачем, если не скрет, его использовать? Call оставлен для совместимости со страрыми версиями программ. Если вызывать процедуру без Call, скобки убери и все дела.
Автор: DavidKATS
Дата сообщения: 31.01.2008 13:20
КТО-НИБУДЬ знает ПОЧЕМУ код выполняется с ошибками, некоторые методы не работают, когда в книге включен многопользовательский режим???

Добавлено:
Еще вопрос. Как вызвать из кода одной книги процедуру, написанную в коде другой книги?
Автор: AndVGri
Дата сообщения: 31.01.2008 14:53
DavidKATS

Цитата:
Как вызвать из кода одной книги процедуру, написанную в коде другой книги

Переименуй VBAProject в книге, которую будешь вызывать во что-нибудь вразумительное (MyVBAExternalSubFuncs)
Далее в VBE новой книги через Tools/References подключаешь эту книгу
и вызваешь, для примера,
MyVBAExternalSubFuncs.MyModule.TestSub
Автор: DavidKATS
Дата сообщения: 31.01.2008 15:26
AndVGri
УРА! Спасибо!
Автор: PETKINA75
Дата сообщения: 31.01.2008 16:03
AndVGri, я попробовала поставить условия, как вы подсказали, но в итоге тот же результат. Фильтр отбирает и показывает только первый правильный результат по первому заданному условию.


Добавлено:
Не понимаю, что я делаю неправильно?
Автор: nick7inc
Дата сообщения: 31.01.2008 21:46
DavidKATS

Цитата:
Как вызвать из кода одной книги процедуру, написанную в коде другой книги?

А так:

Код: Result = Application.Run(...)
Автор: AndVGri
Дата сообщения: 01.02.2008 08:46
PETKINA75
Уж не знаю. На приведённых Вами данных у меня работало, возможно, условие фильтра не вписали правильно, прочтите справку, а макросом можно решить, например, (предполагается что A1, B1 заголовки, как в предыдущем моём примере)
[more=такой процедурой]

Код:
Public Sub CopyFilter()
Dim LastRow As Long, i As Long, id As Long
Dim Result As Variant, isLike As Boolean
Dim sValue As String

LastRow = ActiveSheet.UsedRange.Rows.Count
ReDim Result(1& To LastRow, 1& To 2&)
'копируем заголовок
Result(1&, 1&) = Cells(1&, 1&).Value
Result(1&, 2&) = Cells(1&, 2&).Value

id = 1&
For i = 2& To LastRow
sValue = Trim$(CStr(Cells(i, 2&).Value))
If sValue Like "38*" Then
isLike = True
ElseIf sValue Like "26*" Then
isLike = True
ElseIf sValue Like "895*" Then
isLike = True
'и так далее
Else
isLike = False
End If
If isLike Then
id = id + 1&
Result(id, 1&) = Cells(i, 1&).Value
Result(id, 2&) = Cells(i, 2&).Value
End If
Next i
Worksheets.Add
Range(Cells(1&, 1&), Cells(LastRow, 2&)).Value = Result
End Sub
Автор: HarryG
Дата сообщения: 01.02.2008 13:52
Возникает ошибка при попытке использовать CodeName ранее созданного листа. CodeName оказывается пустым. Нет ни малейшей догоадки в каких случаях выполняется приведенное условие

Dim BottleRashod As Worksheet

Set BottleRashod = Workbooks(NameBookOstatki).Worksheets("БутылкаРасход")

If Worksheets("БутылкаРасход").CodeName = "" Then
MsgBox (Trim(BottleRashod.Index) + " : " + BottleRashod.CodeName)
End If

Кто может, помогите
Автор: visual73
Дата сообщения: 01.02.2008 14:01
HarryG
а че не работает то?
У меня не возникает ошибки.

Цитата:
NameBookOstatki
-это че переменная такая? чего передает?


Добавлено:
A RefEdit работает с не модальной формой .Show 0?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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