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

Страницы: 1
VBA .Copy - копирование не видимых ячеек(автофильтром), Как подружить .Copy и автофильтр?
 
Доброго дня, подскажите пожалуйста. Вопрос скорее к пониманию механики работы.
Хотелось бы скопировать и ставить на свое место массив А2:С5, при применении автофильтра.
Если функцией "скрыть" строку или столбец, копирование массива и вставка его на своем место происходит корректно.
Если же к строкам будет применен автофильтр начинается цирк:
- например скрыта строка №2 - копироваться будут только видимая часть массива, причем вставка пройдет именно на нужную первую строку массива, тем самым все "съедет"
-  например скрыта строка №3 - также копироваться будет только видимая часть массива, причем разбитая соответственно. При вставке появляется ошибка, что нге соответствую массивы копирования - вставки.
- например будут скрыты все строки, кроме №5 - также копироваться будет только видимая часть массива. А при вставке произойдет "автозаполнение" на все скрытые ячейки.

Что касается вставки во всех примерах - все почти логично и понятно. Копируемый массив меньше вставки - значит вставка сместиться влево-вверх. Копируемый массив раздроблен  - ошибка. Хотя почему бы не вставить по выше описанной логике?!. Копируемый массив цельно-кратно меньше массива вставки - автозаполнение.

А вот про копирование не понятно - почему удается скопировать массив из "скрытых" ячеек, и НЕ удается скопировать массив из "скрытых автофильтром"?

тест:
Код
Sub test()
Range("A2:C5").Copy
Range("A2:C5").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End Sub


 
Не перестаю удивляться возможностям excel и VBA.
VBA. Ошибка type mismatch при чтении словаря (Dictionary.Item)
 
Вновь прошу совета экспертов. Не понимаю, почему ругается на Тип, при чтении словаря. По разному попробовал и через число и через текст. В интернете один похожий случай нашел с этой ошибкой, но там все решилось изменением регистра ключа с "ФРУКТЫ" на "Фрукты". У меня в качестве ключа используется число. Подскажите пожалуйста.

Ошибка type mismatch возникает на этой(18) строке:
Код
If dicHead.Item(i)(0) = HeadMes Then
Если отобразить переменные:
Код
If dicHead.Item(1)(0) = "Ошибка2" Then
Код
Option Explicit
Dim A()
Public dic As Dictionary, dicHead As Dictionary
Public HeadCount As Long
Sub HeadMesAdd(HeadMes As String, AreMes As String, NoMes As String)
Set dicHead = CreateObject("Scripting.Dictionary")
'dicHead.CompareMode = 1
Set dic = CreateObject("Scripting.Dictionary")
'dic.CompareMode = 1
dicHead.Add HeadCount + 1, Array(HeadMes, AreMes, NoMes, 0) '1-общий заголовок, 2 - если будут сообщения, 2 - если не будет сообщений, 3 - колличество сообщений
dic.Add HeadCount + 1 & "_0", Array(HeadMes, AreMes, NoMes, "", "", "", "", "", "", "")
HeadCount = HeadCount + 1
End Sub

Sub MesAdd(HeadMes As String, HM1 As String, HM2 As String, HM3 As String, HM4 As String, HM5 As String, HM6 As String, HM7 As String, HM8 As String, HM9 As String, HM10 As String)
Dim i As Long
For i = 1 To dicHead.Count
      If dicHead.Item(i)(0) = HeadMes Then
      dicHead.Item(i)(3) = dicHead.Item(i)(3) + 1
      dic.Add i & "_" & dicHead.Item(i)(4), Array(HM1, HM2, HM3, HM4, HM5, HM6, HM7, HM8, HM9, HM10)
      Exit For
      End If
Next i
End Sub

Вся процедура начинает работу с макроса test в соседнем модуле
Не перестаю удивляться возможностям excel и VBA.
Проверить отсутствие заполнения элемента массива
 
Доброго утра. С отсылкой к архивной теме, подскажите пожалуйста - как можно проверить отсутствие заполнения элемента массива?
Например имея двумерный массив A(i, j), и частично специально заполненный "" (ничем) и другими данными в т.ч..
Код
If A(i, j) = Empty Then msgbox "Элемент пуст" 'не подходит т.к. "" считается за Empty
If Not Not A(i, j) Then msgbox "Элемент пуст" 'Ругается на разность типов данных

Или по умолчанию, при создании массива, все его элементы = "" ?

Изменено: Shama - 02.12.2022 09:05:33
Не перестаю удивляться возможностям excel и VBA.
Изменение в коллекции объектов внутри цикла For Each, Можно ли перескочить или зациклить некоторые объекты из коллекции при выполнении цикла For Each?
 
Доброго утра. Циклы For i to... или Do... можно легко зациклить или перенестись к концу цикла изменив переменную i или условие внутри него, это понятно.
А можно ли аналогично поступить с циклом по объектам For Each?
Для примера, хотелось бы зациклить ниже приведенный пример на последней 10 строке. Пример конечно же не работает(он для визуализации))). Можно ли это как то сделать или это просто не предусмотрено и нарушает саму суть этого цикла?

P.s. GoTo пришел на ум. А как нибудь еще? т.е. именно изменить переменную с ?

Код
Sub test()
Dim c As Range
For Each c In Range("A1:A10")
      If Range(c.Address).Row = 10 Then c = Range(c.Address).Offset(-1, 0)
Next c
End Sub
Изменено: Shama - 17.01.2022 09:06:02
Не перестаю удивляться возможностям excel и VBA.
Получаю разное значение при одинаковых условиях в функциях Int и Fix
 
Доброго дня. Подскажите пожалуйста, почему получается разные результаты, если в первом примере число функции Fix задано расчетом, а во втором рассчитанной переменной? Аналогично ведет себя int.
Fix((1.1234 * 10000)) = 11233, почему?
Грубо говоря это проверка числа на округление до 4 знака после запятой.  
Код
Sub test1()
Dim x As Double
x = 1.1234
If (x * 10000) - Fix((x * 10000)) <> 0 Then MsgBox "Ошибка"
End Sub

Sub test2()
Dim x As Double, y As Double
x = 1.1234
y = x * 10000
If y - Fix(y) <> 0 Then MsgBox "Ошибка"
End Sub

Изменено: Shama - 09.09.2021 08:48:17
Не перестаю удивляться возможностям excel и VBA.
Показать/скрыть объект, при отображении/скрытии строк /столбцов
 
Доброго дня. Думаю ответ простой, но до меня что то дойти никак не может.
Хочу, что бы объект "стрелка вверх" был виден, если будут скрыты столбцы E:F и соответственно наоборот.
Подскажите пожалуйста, как правильно это записать?
Код
Private Sub Worksheet_Change()
 If Columns("E:F").EntireColumn.Hidden = True Then
      Shapes("Стрелка вверх 1").Visible = True
 Else
      Shapes("Стрелка вверх 1").Visible = False
 End If
End Sub
Не перестаю удивляться возможностям excel и VBA.
Отладчик(F8) выключается после Application.GetOpenFilename
 
Доброго дня. Может быть кто то уже сталкивался или сразу понимает в чем проблема.
Пишу/настраиваю макрос построчно, через отладчик. Добавляю и корректирую строки, после чего с первой строки через F8 и далее.
Но как только проходит строку: (После выбора файлов)
Код
avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
Отладчик выключается, а макрос продолжает работать со своей, максимально возможной скоростью.
Разумеется он останавливается на ближайшей ошибке где то дальше, но дальше не могу отследить, как в процессе были рассчитаны переменные, какие файлы и как он обрабатывал. Почему же выключается отладчик и запускается макрос?

Думаю проблема в индивидуальных настройках, но где конкретно не знаю. От того и пример не прикладываю.  
Не перестаю удивляться возможностям excel и VBA.
курсы в МГТУ им. Н.Э.Баумана, Поделитесь мнением, отзывами, рекомендациями.
 
Доброго дня. В ближайшем бедующем у меня есть возможность посетить курс повышения квалификации в МГТУ им. Н.Э.Баумана, по углубленному программированию на VBA. Буду признателен, если поделитесь своим мнением, стоит/не стоит того? Возможно кто то там уже был? какие области стоит подтянуть, что бы "вывести" углубленные курсы по VBA?  
Не перестаю удивляться возможностям excel и VBA.
.Pattern заменить или дополнить списком из массива
 
Добрый день. Очень трудно(совсем) пока даются пользовательские функции, даже пока для понимания.
И надеюсь понял правильно, что .Pattern возвращает некий шаблон символов, для последующей их замены в функции.
Можно ли, каким то образом заменить или дополнить "список" этих символов, целыми значениями, например из ячеек, в столбце рядом?
С одной стороны подумал - почему бы и нет, ведь функционал и смысл будет тот же. Но с другой абсолютно не понимаю как это прописать, да и получился ли по логике, ведь слово - это не символ. Но переменная может быть и символом и словом. :( Запутался

P.S. Спасибо мастеру ikki. Его примеры и учения всегда будут наставлять новых специалистов.  
Не перестаю удивляться возможностям excel и VBA.
Почему "Invalid procedure call or argument", в функции Dir?
 
Доброго дня. Имеется макрос, задача которого найти одинаковые книги в разных папках("донор" и "акцептор") и произвести действие.
Первым действием находим первый фал донор и дальше смотрим такой же в акцепторах.
Внутренний цикл Do по акцепторам переключаться по файлам нормально, а вот внешний цикл по донерам завершается при переключении с ошибкой(ниже, строка 25).
Причем, если макрос прогнать через F8 - он сработает как надо, без ошибки.

В интернете есть один пример с подобной ошибкой, но решение - использовать другой цикл по книгам в двух макросах. Хотелось бы понять, почему в данном примере появляется ошибка.
Может я не правильно работаю с несколькими Dir в циклах? подскажите пожалуйста.
Код
Sub ZamenaListov_1()
Dim i As Long
Dim tb As Workbook, Donorb As Workbook, Acceptorb As Workbook
Dim sFilesDonor As String, sFilesAcceptor As String

For i = 1 To 4
sFolderDonor = ThisWorkbook.Worksheets("Свод").Cells(4 + i, 2)  'папка с донорами
If sFolderDonor <> "" Then
      sFolderAcceptor = ThisWorkbook.Worksheets("Свод").Cells(10 + i, 2)  'папка с акцепторами
      If sFolderAcceptor <> "" Then
            sFolderDonor = sFolderDonor & IIf(Right(sFolderDonor, 1) = Application.PathSeparator, "", Application.PathSeparator)
            sFolderAcceptor = sFolderAcceptor & IIf(Right(sFolderAcceptor, 1) = Application.PathSeparator, "", Application.PathSeparator)
            sFilesDonor = Dir(sFolderDonor & "*.xls*")
            sFilesAcceptor = Dir(sFolderAcceptor & "*.xls*")
            Do While sFilesDonor <> ""
                  Do While sFilesAcceptor <> ""
                        If sFilesDonor = sFilesAcceptor Then
                              Set tb = ThisWorkbook
                              Set Donorb = Application.Workbooks.Open(sFolderDonor & sFilesDonor, UpdateLinks:=0)
                              'что нибудь делаем
                              Donorb.Close False
                        End If
                        sFilesAcceptor = Dir
                  Loop
                  sFilesDonor = Dir
            Loop
      End If
End If

sFolderDonor = ""
sFolderAcceptor = ""
sFilesDonor = ""
sFilesAcceptor = ""
Next i
End Sub
Изменено: Владимир Шаматонов - 13.11.2020 10:10:00
Не перестаю удивляться возможностям excel и VBA.
Лучше чем Find, который не работает с ячейками, с более 255 знаками
 
Доброго дня. Подскажите пожалуйста способ поиска(лучше/проще/быстрее) чем Find, который не хочет работать с ячейками с содержанием больше 255 знаков.
Пробовал Vlookup, но он тоже останавливается на просмотре такой "толстой" ячейке.

Таблица с примером во вложении. Если настроить Find по целой ячейке(xlWhole) - макрос сработает отлично, кроме одной злосчастной строки. Если настроить по целой части ячейки(xlPart) макрос сработает полностью, но не правильно.
Смысл простой - перенести "значения" из таблицы 1 в таблицу 2, по названию "Шапки2". Теоретически таблица 2 в неточном Range и вообще в другой книге, поэтому для вставки также пользуемся поиском "шапки2".
Не перестаю удивляться возможностям excel и VBA.
.Replace с текстом и числами. Отказывается заменять, пропускает запятую.
 
Подскажите пожалуйста - как правильно выставить настройки для .Replace, что бы он работал также, будто это пользователь выполняет "найти/заменить".
Дело в том, что при выставлении числового определенного формата .Replace не будет работать с числами, у которых присутствуют знаки, которые по формату не вошли в ячейку. А при выставлении  текстового формата(+когда число сохранено как текст) .Replace заменяет число, но пропускает запятую о_0), превращая 2,354 в 2354.
Настройки хотелось бы выставить что бы макрос одинаково работал с ячейками с числом, датой и текстом. Если это конечно возможно.
Пример прилогаю.

Или направьте на мысль, а то сам зашел в тупик(
Ps извиняюсь за Range через Cells, просто использую переменные для его определения в основном коде.  
Изменено: Владимир Шаматонов - 16.10.2020 08:32:22
Не перестаю удивляться возможностям excel и VBA.
Макросом определить влияющие ячейки и подписать их столбцы
 
Прошу прощения. Была такая запинка на реализации промежуточного решения в части кода VBA, который:
- Увидел бы ячейки, который выделил пользователь и в первой строке подписал их "1"
- Во второй строке нашел формулы. По ним нашел бы все влияющие ячейки и, аналогично, отметил бы их "1" в соответствующих столбцах, в первой строке.  

Решение выглядит так, возможно кому то пригодится:
Код
Sub marker_columns()
For Each mcol In Selection.Columns
    Cells(1, mcol.Column) = 1
        For Each TSPcol In Cells(2, mcol.Column).Precedents 
        Cells(1, TSPcol.Column) = 1
        Next
    Next
End Sub

PS помните про проверку наличия формул в выделенном массиве, иначе цикл завершится ошибкой.

Изменено: Владимир Шаматонов - 04.09.2020 13:48:45
Не перестаю удивляться возможностям excel и VBA.
Обозначать столбцы выделенных массивов, через ctrl
 
Доброго дня. Подскажите пожалуйста, как можно научить ексель - обозначать столбцы выделенного массива, например единичкой в ячейке первой строки?
При выделении одной ячейки или столбца - все просто. При выделении массива - написал макрос ниже с обозначением столбцов-границ и последующем перебором ячеек в первой строке. Если столбец этой ячейки находится в диапазоне столбцов выделенного массива, она подписывается "1".
Код
Sub signature()
Dim col1 As Long, col2 As Long
col1 = Selection.Cells(1).Column
col2 = Selection.Cells(Selection.Cells.Count).Column

For i = 1 To 1000
    Cells(1, col1 + i - 1) = 1
    If col1 + i > col2 Then
    Exit For
    End If
Next i
End Sub

Голову сломал, как добиться такого же результата(подписи ячеек в первой строке) при выделении хаотичных массивов через CTRL?
Не перестаю удивляться возможностям excel и VBA.
Формула, возращающая ИСТИНУ, если выполняются условия в двух ячейках одного столбца.
 
Уважаемые знатоки, доброго дня.
Уверен решение есть, т.к. условия достаточно четкие а границы логики конкретные, но описать их в формуле у меня не получается(.

Какую формулу нужно записать в желтый столбец, которая вернула бы значение "ИСТИНА", если выполняются два условия в одном столбце, справа от формулы:
1. Значение ячейки во второй строке = "1"
2. Значение ячейки в строке с формулой = "ЛОЖЬ"

Пытаюсь решить это уравнение формулами массива, но к сожалению пока ничего не выходит.  
Не перестаю удивляться возможностям excel и VBA.
Консолидация таблиц по нескольким признакам, с суммированием данных
 
Добрый день, уважаемые знатоки. Подскажите пожалуйста Ваше мнение по решению не особо сложной задачки. Имея несколько таблиц, у которых одинаковые первые три поля, но не обязательно повторяющиеся, их сложить так, что бы на выходе получить одну таблицу. Первые три поля в которой будут сгруппированы просто по принципу их наличия, а значения остальных столбцов просто просуммировано.
Решение(В примере), с идеальным результатом к которому стремлюсь, заключается в использовании супермегакрутых функций сводной таблицы))), которая быстро и группирует и суммирует необходимые данные. Однако для ее источника таблицы приходится разбивать в ручную.
Проблемы заключается в том, что таких таблиц хочется использовать 10-15, что трудоемко. Да и в том, что в их сумме получится более 1 000 000 строк(((
Пробовал использовать сводную таблицу с несколькими источниками, но она у меня не группировала данные, а "перемножала" строки между собой, в итоге файл просто зависал(((
Пробовал создать Базу Данных в Аксесе(Сори, знаю что не по адресу) но он, не группирует строки, а исключает лишние, если такие отсутствуют в другой таблице.
Похожих тем куча, но они используют для связи только один столбец(Создать такой не проблема, допустим сцепкой), и всегда эти связи совпадают по значению, т.е. фиксированное количество строк и значений в них.
Можно ли решить такую задачу не прибегая к ручной работе создания базы для сводной?  
Изменено: Владимир Шаматонов - 05.10.2018 14:50:21
Не перестаю удивляться возможностям excel и VBA.
Удалить разделители .csv при сборе данных через VBA, Удалить разделители .csv при сборе данных через VBA
 
Добрый день. Возникла необходимость пользоваться источником данных, который по дефолту выгружается в формате .csv с разделителями ";" вместо привычных столбцов. При ручном открытии такого файла разделители видимо автоматически превращаются в столбцы и данные превращаются в удобную таблицу. Но при сборе(копировании) этих данных, при чем из нескольких файлов, через VBA по средствам самого распространенного макроса автоматизация такая не работает и на выходе я получаю не удобную собранную таблицу, а столбец, в строках которого зашиты данные с разделителями.
Перечитал много тем, связанных с переформатированием .csv в .xls, но применить их решения никак не получилось((( Я решения понял так, но реализовать его не получилось:
нужно строку Workbooks.Open CSVfilename, local:=True
изменить и как то применить либо в части кода, где идет выбор файлов: avFiles = Application.GetOpenFilename("Excel files(*.csv*),*.csv*", , "Выбор файлов", , True)
Либо уже в части копирования данных, через цикл.
Файл для сбора "Макрос" и файлы как источник данных прилагаю. Может быть у здешних гуру есть идеи решения такой пустяковой проблемы?
Не перестаю удивляться возможностям excel и VBA.
Установка в макросе даты и времяни доставки пьсма Outlook., Как в макросе указать время и дату доставки письма?
 
Добрый день. Каждый день требуется отправлять по 20-30 писем на на разные адреса с разными данными. Получилось сделать макрос, который сам это письмо создает, добавляет необходимых адресатов и даже вставляет в письмо нужную часть таблицы из одной большой. Но скоро долгожданный отпуск) и поставили задачу отпавить данные письма до отпуска, но что бы они пришли. как обычно в необходимое время.
Ручной работы наверно на весь день - каждому письму задовать дату доставки, но не нравится мне больше всего то, что я не узнаю, возможно ли это реализовать через макрос, который мне автомотизирует все остальное.
Решение найти пытался, из полезного нашел только настройку таймера - но это не то. Нужно что бы былы задана конкретнся дата и время получения(лучше чтоб из ячейки) при формировании письма. Часть макроса на формирование письма выглядит так - возможно как и адресата и текст письма, также можно задать функцию доставки на конкруютную дату и время:
Код
Set objOutlookApp = CreateObject("Outlook.Application")
    objOutlookApp.Session.Logon
    Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub 'если не получилось создать приложение или экземпляр сообщения - выходим
 
    sTo = Range("C4").Value    'Кому
    sSubject = Range("C6").Value   'Тема письма
    sBody = Range("C7").Value    'Текст письма
       
        With objMail    'создаем сообщение
        .To = sTo   'адрес получателя
        .CC = Range("C5").Value
        .Subject = sSubject   'тема сообщения
        '.Body = ???  'отключил, текст вшит в НТМЛсообщение
        .BodyFormat = olFormatHTML   'формат HTML
        .HTMLBody = Range("C7").Value & SheetToHTML(ThisWorkbook.Worksheets("Доставка (2)"))
        .Attachments.Add sAttachment
        .Display   'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра, '.Send 'отправлять без просмотра
    End With
Изменено: Владимир Шаматонов - 12.05.2016 13:18:10
Не перестаю удивляться возможностям excel и VBA.
Помогите объеденить два цикла и действия в макросе на удаление строк и столбцов
 
Добрый день. Из одного макроса по удалению строк - самому получилось аналогично составить второй, на удаление столбцов. Оба простые и по отдельности работают.
Но в одном макросе работать не хотят - отанавливается и выдает ошибку в строке:        
Код
   If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)      ' добавляем столбец в диапазон для удаления
Сам макрос выглядит так, все подписано и должно быть понятно:
Код
Sub DeleteRowsAndColumns123()
Dim ra As Range, delra As Range, DeleteRow As String, DeleteColumn As String     'как обычно, задаем переменные
    
DeleteRow = "Удалить строку"       ' удаляем строки с таким текстом
DeleteColumn = "Удалить столбец"       ' удаляем столбцы с таким текстом
    
For Each ra In ActiveSheet.UsedRange.Rows      ' перебираем все строки в используемом диапазоне листа
If Not ra.Find(DeleteRow, , xlValues, xlPart) Is Nothing Then     ' если в строке найден искомый текст
If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)     ' добавляем строку в диапазон для удаления
End If      'Конец проверки "если"
Next       'Конец цикла поиска
If Not delra Is Nothing Then delra.EntireRow.Delete       ' если подходящие столбцы найдены - удаляем их
    
For Each ra In ActiveSheet.UsedRange.Columns       ' перебираем все столбцы в используемом диапазоне листа
If Not ra.Find(DeleteColumn, , xlValues, xlPart) Is Nothing Then     ' если в столбце найден искомый текст
If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)      ' добавляем столбец в диапазон для удаления
End If      'Конец проверки "если"
Next        'Конец цикла поиска
If Not delra Is Nothing Then delra.EntireColumn.Delete       ' если подходящие строки найдены - удаляем их
End Sub
Офис 2010. Пожалуйста, подскажите, где я ошибся?
Не перестаю удивляться возможностям excel и VBA.
Страницы: 1
Наверх