Если лист активен, то все ок. Если нет, то начинаются проблемы. Использую with, чтоб отделаться от select. Когда работал со строками, то все было ок, т.к. числовой параметр в Range("A1:C1") можно было "вклеить" (Range("A" & i & ":C" & i) )/
Сейчас встала необходимость работать с разными столбцами. Подскажите как? Первый макрос выдает ошибку при неактивном листе. Второй не выдает, но он не числовой.
Код
With Sheets("a2")
With .Range("A1:B5")
.Interior.ThemeColor = xlThemeColorDark1
.Interior.TintAndShade = -0.149998474074526
End With
End With
With Sheets("a2")
With .Range(Cells(1, 1), Cells(5, 5))
.Interior.ThemeColor = xlThemeColorDark1
.Interior.TintAndShade = -0.149998474074526
End With
End With
П.С. да, я нихрена не знаю, да, мне надо учить матчасть , да искал, но не нашел, да ... уже иду...
Работает ЧЕРЕЗ раз. То работает, то нет. Может это просто способ с кнопками "глючный"? Дык вроде нет. Уже поставил задержку (думал, машина слишком быстро вбивает клавишы). Не помогло. Расшифровка команд и долгая задержка не помогают понять причину, т.к. окно exe активировано, но НЕ РАЗВЕРНУТО и что там происходит я не вижу. Может кто подскажет аналог команды AppActivate для разворачивания окна, я хоть пойму в чем дело.
П.С. путь к файлу вбивает всегда. До кнопки "завершить" доходит через раз
Прошу помощи. Не подскажите, как называется имя вложения в аутлуке?
Запускаю код, но он мне все сообщения выдает при проверке ифом имени вложения (не работает, сволочь, по имени вложения). При чем по теме (имени) письма работает (в коде заковычено).
Код
Sub Ïåðâîå_MailSave1()
Dim oOutlook As Object ' New Outlook.Application
Dim oNamespace As Object 'Outlook.Namespace
Dim myFolder As Object 'Outlook.Folder
Dim myMail As Object 'Outlook.Items
Dim myItem As Object 'Outlook.MailItem
Dim ad As String
t = ActiveWorkbook.Path
Set oOutlook = GetObject(, "outlook.Application")
Set oNamespace = oOutlook.GetNamespace("MAPI")
Set myFolder = oNamespace.GetDefaultFolder(6)
Set myMail = myFolder.Items
For Each myItem In myMail
On Error Resume Next
'If myItem.Subject = "1" Then
If myItem.Attachments(1).Count <> 0 And myItem.Attachments(1).Name = "11111.xlsx" Then
Debug.Print "a=" & myItem.Attachments(1)
Debug.Print "s=" & myItem.Subject
End If
Next
End Sub
Не подскажите как проверить словарь не пустой ли он? У меня на Nothing ругается. И на индекс тоже.
Код
Sub Macro4()
Dim a5pop As Object
Set a5pop = CreateObject("Scripting.Dictionary")
If a5pop.keys()(0) = "" Then Debug.Print "Nothing"
'If a5pop <> Nothing Then Debug.Print "Not Nothing"
End Sub
Не подскажите, как удалить все массивы и все словари (не зная их названий). Искал - не нашел. У меня много запутанных процедур, где мог ставил Erase и RemoveALL. Однако это не помогает, видимо, что-то проходит мимо этих команд. Часто вылазит OUT of Memory.
Подскажите новичку. Есть ли команда, которая всю память освобождает от всего, что там есть? Чтоб я ее воткнул в конце и все было ок.
Раньше операции производил с листом, поэтому с CountIf проблем не было. Передавал в него строку и считал. Было долго, сейчас перехожу от листов к массивам. Есть двухмерный массив (аналог листа эксель). Как использовать CountIf только для определенной части массива (строки)? Есть ли у двухмерного массива аналог Range для листа? Если я буду постоянно выкидывать на лист часть массива и брать его в Range, то это не будет долго?
Код
Sub countt()
Dim Vv()
Dim a As Range
Sheets("sheet2").Select
Vv = Sheets("sheet2").Range(Cells(1, 1), Cells(10, 10)).Value
Sheets("sheet1").Cells(1, 1).Resize(1, 10) = Vv
Sheets("sheet1").Select
Set a = Sheets("sheet1").Range(Cells(1, 1), Cells(1, 6))
b = 4
s = WorksheetFunction.CountIf(a, b)
Debug.Print s
End Sub
Добрый день. Не подскажите как скопировать часть массива без цикла?
Хочу убыстрить работу макроса и производить операции не на листе, а в двухмерном массиве. На листе все просто. Выделил часть листа. Copy и Paste в другую часть листа. Можно ли то же самое реализовать в массиве? Копирнуть часть двухмерного массива (например, строку) и вставить эту строку в другой массив (другую часть того же массива)?
Проблема с производительностью (см. код ниже или приложенный файл).
Макрос работает, но медленно. Есть два массива данных: список-столбец (a5) и лист(ch2). Надо из листа выдернуть все строки, содержащие хотя бы один элемент из списка и занести их на лист ch5. Потом все дубликаты в ch5 удалить (по удалению макрос писал не я, The Prist посоветовал).
Я много читал и искал по этой теме (поиск). Находил только про "словари". Мол в них поиск мгновенный по значению. Но насколько Я понял, в словаре только два значения (key и item), а мне надо по крайней мере три (key-значение в ячейке, номер строки и номер столбца, т.е. два item, а не один).
Посоветуйте чтонить...
Заранее спасибо!
Код
Sub Macro3()
Dim found As Range
'удаляю следы предыдущего веселья
Sheets("ch5").Select
Selection.Clear
'начинаю цикл по искомым значениям из листа а5
For c55 = 1 To 2
'ищу все значения в листе ch2
b30 = Sheets("a5").Cells(c55 + 3, 4).Value
Sheets("ch2").Select
Set found = Sheets("ch2").Range(Cells(1, 1), Cells(10000, 10000)).Find(What:=b30, After:=Cells(1, 1), LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False)
b31 = found.Row
b32 = found.Column
b33 = 0
b34 = 0
h1 = 1
Do Until b31 = b33 And b32 = b34
Sheets("ch2").Select
Set found = Sheets("ch2").Cells.FindNext(After:=found)
'определяю положение найденного на листе
b33 = found.Row
b34 = found.Column
'копирую строку с найденным значением, но только ДО найденного значения
Sheets("ch2").Select
Range(Cells(b33, 1), Cells(b33, b34)).Select
Selection.Copy
Sheets("ch5").Select
Cells(h1, 1).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
ActiveSheet.Paste
h1 = h1 + 1
Loop
Sheets("ch5").Select
MsgBox (c55)
'удаляю совпадения
Dim lCol As Long, lr As Long
Dim arr()
lr = Sheets("ch5").UsedRange.Row + Sheets("ch5").UsedRange.Rows.Count - 1
lCol = Sheets("ch5").UsedRange.Column + Sheets("ch5").UsedRange.Columns.Count - 1
ReDim arr(0 To lCol - 1)
For li = 1 To lCol
arr(li - 1) = li
Next li
Range("A1").Resize(lr, lCol).RemoveDuplicates arr, xlNo
Next c55
End Sub
Если макрос бежит по 5000 строк, то все ок и ошибок не возникает. Но вот на 15000 он мне выдает Delete method of Range class failed и указывает на строку Selection.EntireRow.Delete В чем дело? Ему строки за 10000 удалять религия не позволяет?
Код
c1 = 5
Do While Sheets("Vvod dannyh").Cells(c1, 2).Value <> ""
If Sheets("Vvod dannyh").Cells(c1, 4).Value = Sheets("Vvod dannyh").Cells(c1 - 1, 4).Value And Sheets("Vvod dannyh").Cells(c1, 3).Value = Sheets("Vvod dannyh").Cells(c1 - 1, 3).Value And Sheets("Vvod dannyh").Cells(c1 + 1, 3).Value = "" Then
Sheets("Vvod dannyh").Select
Sheets("Vvod dannyh").Rows(c1).Select
Selection.EntireRow.Delete
End If
c1 = c1 + 1
Loop
Понимаю, что вопрос банален. Но не могу его сформулировать, чтобы забить в поиск и найти самому.
Есть матрица 1000 на 1000. Значения в матрице задаются формулами. Нужно сделать текущий "срез". Либо копернуть всю матрицу целиком, либо присвоить каждой ячейке не формулу, а текущее значение. Не подскажите как сделать макросом? При копировании и удалении исходной матрицы ессесна возникает #value, т.к. копируется ссылкой.
Мне надо с помощью макроса в эксель осуществить поиск сообщений в Outlook по их названию. Есть темы про копирование вложений в аутлуке, есть темы про обращения из эксель к другим приложениям, но... Я так понимаю, у каждого приложения свои переменные. У меня эксель ругается. Пишет, что нет такого типа переменных как MailItem
Код
Sub Outlook()
Dim mli As MailItem
Dim flr As Outlook.MAPIFolder
On Error Resume Next
For Each mli In flr.Items
If mli.Subject = "Ïðèâåò" Then
mli.Attachments.Open
End If
Next
End Sub
Никто не подскажет возможен ли обмен данными между двумя книгами на двух разных компьютерах через инет. Ответ в виде - сделай книгу с общим доступом - не устраивает, т.к. пользователей будет уйма + конфиденциальность и разграничение доступа.
Предполагается, что главный эксель-файл ("мамка") делает другие эксель-файлы ("дочки"), заносит в них данные, заносит туда макрос и отправляет через аутлук пользователям.
Пользователи, заполнив свои данные, жмут кнопку и .... копированный эксель-файл ("дочка") через инет ищет "мамку" и добавляет в нее инфу.
Как прописать такой "путь" к "мамке" на другом компе?
Можно, конечно, к дочке прикрутить кнопку "Отправить обратное сообщение по аутлуку на комп с "мамой"" и прикрепить дочерний эксель-файл, но тогда пользователю мамки придется самому ручками открывать этот файл-дочку из аутлука и производить действие, чтобы перенести данные, что не автоматизация ни разу.
У меня есть макрос, он создает несколько файлов и мувит туда отдельные листы из изначальной книги. В новых файлах исходного макроса нет. Как его туда запихнуть? Это возможно сделать без save as потому как не хочется потом по новым файлам вновь пробегать и удалять ненужную инфу.
Не подскажите, как прикрепить к сообщению Outlook несколько файлов? Один отсылается, а вот несколько. Как я только не записывал и через запятую, и через точку с запятой... нифига .Attachments.Add "C:\Users\aaa\Desktop\1\111.jpg"
Но там немного другая ситуевина. При использовании save as старый файл "закрывается".
У меня есть основной файл (назовем его Х), в котором работает макрос. Макрос создает листы и заполняет их. Понятно, что так продолжаться долго не может (кол-во листов станет огромным и все висанет).
Я вот думаю, мне надо каждый раз новый лист сохранят в новый файл, при этом, НЕ ЗАКРЫВАЯ ФАЙЛ Х, который продолжает заполнять один и тот же лист и сохранять его в отдельный файл.
Сейчас ищу клетки обычным файндом с циклом. Но зашита же в эксель функция "найти все" в поиске. Решил поискать, что это за зверь. Но нашел только в английском сегменте и свиснул оттуда сей макрос.
Но мне пишет, что фанкшн нот дефайнд. В чем дело? Файл прикладываю.
Заранее спасибо!
Код
Sub TestFindAll()
Dim SearchRange As Range
Dim FindWhat As Variant
Dim FoundCells As Range
Dim FoundCell As Range
Set SearchRange = Range("A1:A10")
FindWhat = 77
Set FoundCells = FindAll(SearchRange:=SearchRange, _
FindWhat:=FindWhat, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByColumns, _
MatchCase:=False, _
BeginsWith:=vbNullString, _
EndsWith:=vbNullString, _
BeginEndCompare:=vbTextCompare)
If FoundCells Is Nothing Then
Debug.Print "Value Not Found"
Else
For Each FoundCell In FoundCells
Debug.Print "Value Found In Cell: " & FoundCell.Address(False, False)
Next FoundCell
End If
End Sub
Msgbox вылезает только с кнопками. А мне нужно именно сообщение, типа "Загрузка...", чтоб включалась вначале и выключалась в конце. Также хотел бы туда переменную засунуть (это возможно?). Типа "Обработано" & c & "из" & y & "компаний"
Никто не подскажет как незнающему человеку работать с этим самым RemoveDuplicates? Проблема в следующем. На лист экслеля макросом скидываются данные (т.е. данные не статичны). А этот RemoveDuplicates очень консервативен и ругается, если его что-то не устраивает. Например,
Если заполнено только два первых столбца, а третий - пустой, то ремув работать не хочет. Ставлю нолик в пустой клетке третьего столбца и (о, чудо!) работает. Но заполнять все пустые клетки нулями - это время. А макрос обрабатывает огромные данные и итак тормозит.
В связи с изложенным два вопроса: 1) как сделать так, чтоб ремув работал несмотря на пустые столбцы (если это возможно) 2) как в этот ремув записать Array(1, 2, 3) не тупым перебором циферок, а даипазоном 1-1000, потому как лист у меня может и до 1000 заполняться и все дубликаты надо удалить