Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Правильное обращение к диапазону с помощью with
 
Объясните, плиззз, чайнику.

Если лист активен, то все ок. Если нет, то начинаются проблемы. Использую 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

П.С. да, я нихрена не знаю, да, мне надо учить матчасть , да искал, но не нашел, да ... уже иду...
Изменено: zavhoz1984 - 07.12.2015 10:50:06
Помогите научиться писать быстро в VBA
 
Предыдущую тему, видимо, залочили.

Постоянно приходится писать CreateObject("Scripting.Dictionary") и прочие длинные выражения. Пытаюсь упростить написание кода.

Не работает макрос. Оно и понятно di - объект, а я в него строку пытаюсь запихнуть (название нового словаря).

Помогите, плиииз. Надо, чтоб создался словарь "ssn". Аналогично с функцией add.
Код
Global di As Object
Sub test4()
di = "ssn": Call sd
End Sub
Sub sd()
Set di = CreateObject("Scripting.Dictionary")
End Sub
Изменено: zavhoz1984 - 02.12.2015 12:53:43
Изменение громкости с помощью VBA
 
Никто не знает, как с помощью VBA громкость звука поменять?
Проигрывание exe из VBA, AppActivate
 
Помогите, плиз.

Работает ЧЕРЕЗ раз. То работает, то нет.
Может это просто способ с кнопками "глючный"? Дык вроде нет.
Уже поставил задержку (думал, машина слишком быстро вбивает клавишы). Не помогло.
Расшифровка команд и долгая задержка не помогают понять причину, т.к. окно exe активировано, но НЕ РАЗВЕРНУТО и что там происходит я не вижу. Может кто подскажет аналог команды AppActivate для разворачивания окна, я хоть пойму в чем дело.

П.С. путь к файлу вбивает всегда. До кнопки "завершить" доходит через раз :(
Код
'запускаем exe
p = "C:\Users\XXX\Desktop"
    Call Shell(p & "\XXX.exe")
    Application.Wait (Now + TimeValue("0:00:05"))
        
'активируем окно exe
    AppActivate ("XXX")
'нажимаем TAB, Enter
    SendKeys "{TAB 1}", True
    Debug.Print "tab"
    Application.Wait (Now + TimeValue("0:00:05"))
    
    SendKeys "{Enter 1}", True
    Debug.Print "enter"
    Application.Wait (Now + TimeValue("0:00:05"))
'курсор на окне "обзор" вбиваем в него путь к файлу
    SendKeys p & "\XXX.xlsx", True
    Application.Wait (Now + TimeValue("0:00:05"))
 
'нажимаем TAB, Enter
    SendKeys "{Enter 1}", True
    Debug.Print "enter"
    Application.Wait (Now + TimeValue("0:00:05"))
    
    AppActivate ("XXX")
    Application.Wait (Now + TimeValue("0:00:05"))
    
    SendKeys "{Enter 1}", True
    Debug.Print "enter"
    Application.Wait (Now + TimeValue("0:00:05"))
    
    SendKeys "{TAB 1}", True
    Debug.Print "tab"
    Application.Wait (Now + TimeValue("0:00:05"))
    
    SendKeys "{Enter 1}", True
    Debug.Print "enter"
    Application.Wait (Now + TimeValue("0:00:05"))
Использование like "*.xlsx"
 
Прошу помощи, сижу уже несколько часов.

Почему при использовании
Код
If a Like "*.xlsx" Then

он мне отсеивает .pptx и .docx
Как называется имя вложения в аутлуке?
 
Прошу помощи. Не подскажите, как называется имя вложения в аутлуке?

Запускаю код, но он мне все сообщения выдает при проверке ифом имени вложения (не работает, сволочь, по имени вложения). При чем по теме (имени) письма работает (в коде заковычено).

Код
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
Запаролить книгу макросом
 
Не подскажите, как запаролить книгу макросом?

Как ручками - знаю. Пробовал записать макрорекордером - нифига.
Удалить открытый файл эксель
 
Прошу помощи.
Не подскажите, как удалить запущенный файл экселя?
kill не помогает.
Ввести текст из эксель в поле ввода в другой программе
 
Опять прошу помощи. Как ввести текст в поле ввода из эксель в другую программу (запускается exe файлом)?

Поле типа "Обзор".
Как остановить exe-файл запущенный макросом
 
Прошу вашей помощи.

Нашел код запуска exe файла. А как его потом также програмно вырубить? Код будет в цикле. Надо будет несколько раз врубать/вырубать.

Код
Private Sub Form_Load()
 MyPath = "C:\1"
 Set WshShell = CreateObject("WScript.Shell")
 WshShell.CurrentDirectory = MyPath
 Call Shell("1.exe")
 
 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 в другую часть листа.
Можно ли то же самое реализовать в массиве? Копирнуть часть двухмерного массива (например, строку) и вставить эту строку в другой массив (другую часть того же массива)?
Объявить публичный массив
 
Помогите, плиз, начинающему коддеру.
Как объявить публичный массив, занести туда данные и пользоваться им из любого макроса и из любого модуля?

Спасибо!
Ошибка, если не выделять лист
 
Пишет ошибку, если не селектить лист. Как обойтись без селекта?
Код
       With Sheets("Vvod dannyh").Range(Cells(5, 1), Cells(5, 9)).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent1
        .TintAndShade = 0.599993896298105
        .PatternTintAndShade = 0
    End With
Найти все значения из одномерного массива в двухмерном очень быстро и удалить повторы, что-то быстрее .Find
 
Помогите, плиз, начинающему коддеру.

Проблема с производительностью (см. код ниже или приложенный файл).

Макрос работает, но медленно. Есть два массива данных: список-столбец (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 из экселя
 
Помогите, пожалуйста!

Мне надо с помощью макроса в эксель осуществить поиск сообщений в 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
Обмен данными между двумя книгами на двух разных компьютерах через инет
 
Никто не подскажет возможен ли обмен данными между двумя книгами на двух разных компьютерах через инет.
Ответ в виде - сделай книгу с общим доступом - не устраивает, т.к. пользователей будет уйма + конфиденциальность и разграничение доступа.

Предполагается, что главный эксель-файл ("мамка") делает другие эксель-файлы ("дочки"), заносит в них данные, заносит туда макрос и отправляет через аутлук пользователям.

Пользователи, заполнив свои данные, жмут кнопку и .... копированный эксель-файл ("дочка") через инет ищет "мамку" и добавляет в нее инфу.

Как прописать такой "путь" к "мамке" на другом компе?

Можно, конечно, к дочке прикрутить кнопку "Отправить обратное сообщение по аутлуку на комп с "мамой"" и прикрепить дочерний эксель-файл, но тогда пользователю мамки придется самому ручками открывать этот файл-дочку из аутлука и производить действие, чтобы перенести данные, что не автоматизация ни разу.
Почему ругается макрос при создании xlsm?
 
Пишу вот это и ругается. Чего он хочет?
Код
   Workbooks.Add
    ActiveWorkbook.SaveAs Filename:="C:\Users\aaa\Desktop\1\123.xlsm"
Макрос копирующий в новосозданную книгу самого себя
 
У меня есть макрос, он создает несколько файлов и мувит туда отдельные листы из изначальной книги.
В новых файлах исходного макроса нет. Как его туда запихнуть? Это возможно сделать без save as потому как не хочется потом по новым файлам вновь пробегать и удалять ненужную инфу.
Прикрепить к сообщению Outlook несколько файлов
 
Не подскажите, как прикрепить к сообщению Outlook несколько файлов?
Один отсылается, а вот несколько. Как я только не записывал и через запятую, и через точку с запятой... нифига
.Attachments.Add "C:\Users\aaa\Desktop\1\111.jpg"
Как выбрать все листы книги, кроме текущего
 
Добрый день!

Не подскажите, как выбрать все листы книги, кроме текущего.
Делается для того, чтобы схайдить все листы кроме выбранного.

Я сначала открываю все листы, выбираю нужный и закрываю все листы, но мне надо, чтоб комп не пытался закрыть текущий.
Код
Dim sh As Worksheet, sha As Shape
For Each sh In ThisWorkbook.Worksheets
sh.Visible = True
Next sh

Sheets("2").Select
Range("A1").Select
Вопрос сводится к тому, как написать исключение из цикла.
Как с помощью макроса начать новую строку в одной и той же ячейке
 
Как с помощью Value перепрыгнуть на следующую строку в ячейке?
Код
Sub Supersub()
For j = 1 To 22
Sheets("Sheet1").Select
Sheets("Sheet1").Cells(j, 1).Value = "Sub F" & j
Next j
End Sub

Создаю макрос, который поможет мне написать много однообразных макросов, в которых меняются лишь некоторые значения :)
Быстрое сохранение листов по отдельным файлам
 
Нашел вот эту тему
http://www.planetaexcel.ru/techniques/12/160/

Но там немного другая ситуевина.
При использовании save as старый файл "закрывается".

У меня есть основной файл (назовем его Х), в котором работает макрос. Макрос создает листы и заполняет их. Понятно, что так продолжаться долго не может (кол-во листов станет огромным и все висанет).

Я вот думаю, мне надо каждый раз новый лист сохранят в новый файл, при этом, НЕ ЗАКРЫВАЯ ФАЙЛ Х, который продолжает заполнять один и тот же лист и сохранять его в отдельный файл.

никто не сталкивался с решением такой проблемы?
Find all function не работает
 
Сейчас ищу клетки обычным файндом с циклом. Но зашита же в эксель функция "найти все" в поиске. Решил поискать, что это за зверь. Но нашел только в английском сегменте и свиснул оттуда сей макрос.

Но мне пишет, что фанкшн нот дефайнд. В чем дело?
Файл прикладываю.

Заранее спасибо!
Код
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)
 
Добрый день!

Прошу помощи.

Msgbox вылезает только с кнопками. А мне нужно именно сообщение, типа "Загрузка...", чтоб включалась вначале и выключалась в конце. Также хотел бы туда переменную засунуть (это возможно?). Типа "Обработано" & c & "из" & y & "компаний"
Применение RemoveDuplicates
 
Добрый день!

Никто не подскажет как незнающему человеку работать с этим самым RemoveDuplicates?
Проблема в следующем. На лист экслеля макросом скидываются данные (т.е. данные не статичны).
А этот RemoveDuplicates очень консервативен и ругается, если его что-то не устраивает.
Например,
Код
    Range("A1:CRR5000").Select
    ActiveSheet.Range("$A$1:$CRR$5000").RemoveDuplicates Columns:=Array(1, 2, 3), Header _
        :=xlNo

Если заполнено только два первых столбца, а третий - пустой, то ремув работать не хочет.
Ставлю нолик в пустой клетке третьего столбца и (о, чудо!) работает.
Но заполнять все пустые клетки нулями - это время. А макрос обрабатывает огромные данные и итак тормозит.

В связи с изложенным два вопроса:
1) как сделать так, чтоб ремув работал несмотря на пустые столбцы (если это возможно)
2) как в этот ремув записать Array(1, 2, 3) не тупым перебором циферок, а даипазоном 1-1000, потому как лист у меня может и до 1000 заполняться и все дубликаты надо удалить

Заранее спасибо.
Страницы: 1
Наверх