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

Страницы: 1 2 След.
Выпадающий список и дата в одной ячейке
 
Здравствуйте. Подскажите, пожалуйста, как в одной ячейке объединить и выпадающий список, и ввод даты. Поясняю.

Имеется книга с единственным листом, на нем диапазон для ввода (выделен желтым). В данный диапазон можно ввести либо дату, либо предопределенный текст из умной таблицы "Пример". Ограничения выставлены путем проверки данных в желтом диапазоне следующей формулой:
Код
=ИЛИ(НЕ(ЕОШИБКА(-D1));СЧЁТЕСЛИ(ДВССЫЛ("Пример");D1)=1)

То есть, сейчас в желтый диапазон можно ввести либо дату, либо одно из предопределенных значений из таблицы "Пример".

Как сделать так, чтоб эти предопределенные значения из таблицы "Пример" нужно было вводить не руками, а выбирать из выпадающего списка? При этом, сохранив возможность ввода в ячейку желтого диапазона любого текста (на что проверка данных выдаст ошибку, если в ячейку будет введен не предопределенный текст или не дата)
Номер столбца заранее неизвестен в ВПР или ИНДЕКС
 
Здравствуйте. Имеются 2 таблицы - Т1 и Т2. В ячейку B2 выводится простой ВПР, который ищет значение в таблице Т1 справа от слова "тест". С этим всё просто.
Но как быть, если таблица Т1 была изменена пользователем и превратилась в таблицу Т2? В которой теперь искомое значение не в третьем столбце, а во втором. Сейчас речь не идет о том, когда Excel сам меняет формулы в некоторых случаях при изменении столбцов/строк.

Вопрос - как найти первое непустое значение в строке в таблице Т2 справа от слова "тест" и вставить его в ячейку E2 (выделена желтым)? Я пробовал через связку ИНДЕКС+ПОИСКПОЗ, это просто:
Код
=ИНДЕКС(K:M;ПОИСКПОЗ("тест";K:K;0);НОМЕРСТОЛБЦА)

Ну или тот же ВПР:
Код
=ВПР("тест";K:M;НОМЕРСТОЛБЦА;0)

Однако, всегда обязательно указание номера столбца. Но его никак не узнать при условии, что пользователь опять изменит столбцы. Предположим, что номер столбца изначально неизвестен, и его никак не проверить.

Что нужно вписать вместо НОМЕРСТОЛБЦА для того, чтоб искалось первое непустое значение? Но только без формул массивов, нужна простая формула как ВПР.
[VBA ]Выделение содержимого письма и вставка в Excel
 
Здравствуйте. Не могу найти способ, как нажать Ctrl+A и Ctrl+С в письме, подскажите плиз. Пробовал такой вариант (а также меняя xMailItem.HTMLBody на xMailItem.Body и еще что-то), он работает, но вставляет не целиком (если большой объем данных в письме), да и вообще "чистый" текст, а у меня в письме таблица, которая ручными манипуляциями Ctrl+A и Ctrl+С экспортируется в Excel без проблем:
Скрытый текст

И такой вариант, но он вообще почему-то не работает, якобы переменная не объявлена, а вроде всё объявлено:
Скрытый текст
Изменено: andronus - 26.12.2023 14:02:27
[VBA] Преобразование текстовой даты в нормальную дату
 
Добрый день. Помогите, пожалуйста, преобразовать текстовую дату в нормальную дату через VBA. Мне нужно, чтоб при фильтре на столбце E ("Дата") было не "Текстовые фильтры", а "Фильтры по дате".

Я пробовал разные способы:

1.
Код
For Each Cell In ActiveSheet.UsedRange.Columns("E").Cells
    Cell.Value = DateValue(Cell.Value)
Next Cell
Выдает ошибку Type Mismatch.

2.
Код
For Each Cell In ActiveSheet.UsedRange.Columns("E").Cells
    cell.Value = CDate(cell.Value)
Next Cell
Выдает ошибку Type Mismatch.

3.
Через замену точки на точку или пробела на пробел:
Код
Columns("E").Replace " ", " ", LookAt:=xlPart
Руками это работает, в VBA же результат нулевой.

4.
Через "Текст по столбцам" в коде. Ситуация аналогична п.3.

5.
Через создание доп. столбца и копирования туда значений из имеющегося столбца:
Код
Dim rngCop As Range, rngPas As Range
Dim clpbrd As Variant
Columns("F").Insert Shift:=xlToRight
Columns("F").NumberFormat = "General"
Set rngCop = Range(Range("E2"), Range("E2").End(xlDown))
Set rngPas = Range(Range("E2"), Range("E2").End(xlDown)).Offset(0, 1)
clpbrd = rngCop
rngPas = clpbrd
Безрезультатно. А если же сначала скопировать в блокнот, а оттуда вставить в тот же доп. столбец, то всё ок.

Помогите, пожалуйста. Не понимаю, в чем проблема.
[VBA] Копирование результатов подсчета в буфер обмена
 
Добрый день. Хочу посчитать кол-во видимых строк и копировать-вставить это значение через буфер обмена. Код такой:
Код
rowsCnt = WorksheetFunction.Subtotal(3, Range("B2:B1000000"))
rowsCnt.Copy
Выдает ошибку 424 "Object required".  Я пробовал и объявлять переменную rowsCnt через Range (но это не диапазон, поэтому тоже ошибка), и через Variant (та же ошибка 424), и через Long (ошибка Invalid qualifier).
В общем, ничего не помогает, я начинаю вскипать от этой простейшей ерунды, когда в Locals видно значение этого rowsCnt, но скопировать его Excel не умеет.
Подскажите, пожалуйста, как скопировать это значение rowsCnt в буфер.
Странные расчеты с использованием ВПР
 
Здравствуйте. У меня есть два идентичных числа в ячейка на разных листах - 0,689409341747419 (назовем числом X). Лист1!B1 и Лист2!B1. Книга прикреплена во втором сообщении.

При попытке вычислить разницу между двумя этими числами через ВПР и последующем сравнении их, больше ли результат ноля, Excel выдает, что-де да - результат больше ноля (проверки!C5).
При этом, на листах Лист1 и Лист2 ниже этих проблемных чисел есть тоже два одинаковых числа - 0,977777777777778 (назовем числом Y), и вот с ними всё нормально.

Однако, я решил проверить дальше, и чем больше я проверял число X, тем больше я начал сходить с ума:
1. Проверка разницы ВПР, выполненная в одной ячейке, выдает результат >0 (проверки!C5)
2. Проверка разницы результатов ВПР, выполненные в разных ячейках, тоже выдает результат >0 (проверки!H5)
3. Результаты ВПР, а затем их разница выдает, что результат-таки не >0 (проверки!K5)
4. Разница результатов ВПР выдает, что результат тоже не >0 (проверки!N5)

Помогите, пожалуйста, разобраться, почему в случае с числом X такие разные результаты, а с числом Y - всё нормально, при том, что числа X на двух листах идентичны между собой, равно как и числа Y между собой.

Важный момент: если скопировать число X с Лист1 на Лист2 (или наоборот), то формулы начинают работать верно. Тем самым, ячейки становятся максимально одинаковыми (хотя, визуально и некоторыми формулами они именно такие). Видимо, где-то проблема именно в разности ячеек Лист1!B1 и Лист2!B1, но где именно - неясно.

Более того, если в проверки!C5 выполнить расчет через "Формулы - Вычислить формулу", то результат получается такой (см. приложенные скриншоты):
Изменено: andronus - 28.09.2022 13:35:58
[VBA] ChrW вместо нужного символа выводит знак вопроса
 
Добрый день. Обнаружил замечательную функцию ChrW, позволяющую выводить символы из Юникода. Но для символа 9679 (●) она срабатывает лишь при применении ее к ячейке, то бишь данный код выведет символ в ячейку:
Код
Sub celltest()
Range("A1").Value = ChrW(9679)
End Sub

Но! Такой код не сработает, выведя в окно знак вопроса вместо нужного:
Код
Sub msgtest()
MsgBox ChrW(9679)
End Sub


Возможно ли вывести в MsgBox данный символ (и другие подобные символы Юникода, например ■)?
[VBA] Как открыть файлы и папки по маскам
 
Здравствуйте. Существуют ли простые способы открывать файлы и папки по маске названий? Кейс следующий - есть директории и файлы:
1. \ЛюбаяПапка\макрос.xlsm
2. \ЛюбаяПапка\YфайлY.xlsx
3. \ЛюбаяПапка\ПапкаY\Подпапка\подфайлY.xlsx

Сначала запускается файл с макросами из п.1, и в нем начинается работа с файлами. Мне нужно макросом открывать файлы из пунктов 2 и 3. Проблема в том, что названия папок и файлов могут меняться (переменное - всё, что обозначено как Y). Представляю я себе это примерно так (звездочки как маска):

Код
'открытие файла в п.2
PathFolderName = ThisWorkbook.Path ()
Workbooks.Open Filename:=ThisWorkbook.Path & "\*файл*.xlsx"


Код
'открытие файла в п.3
PathFolderName = ThisWorkbook.Path ()
Workbooks.Open Filename:=ThisWorkbook.Path & "\Папка*\Подпапка\подфайл*.xlsx"


Я нашел такое решение, но у меня оно не работает, либо я не смог корректно написать пути и названия:

Код
Sub Openfile()
  Dim Fso As Object, fs, Fl As Variant
    
  Set Fso = CreateObject("Scripting.FileSystemObject")
  Application.ScreenUpdating = False
  For Each Fl In Fso.getfolder(ThisWorkbook.Path & "\").Files
    If Fl.Name Like "RSNOS_*Summary*" Then  'for rawdata file
      Workbooks.Open ThisWorkbook.Path & "\" & Fl.Name
    End If
  Next
End Sub
VBA. Отобрать первые 10 и из них удалить ненужные
 
Здравствуйте. Прошу подсказать, как в VBA сделать фильтр сначала на первые 10, а затем среди них удалить из фильтра ненужные.

Что должно получиться в итоге:
1. Столбец С ("Кол-во") фильтруется на "Первые 10" (наибольшие, например), остаются числа 82, 79, 132, 80, 103, 89, 114, 135, 115, 104.
2. Далее из этого списка надо из фильтра убрать заданные числа, например, число 132.

Это легко сделать через настраиваемый фильтр вручную, но в VBA такого не нашел. Пробовал обойти таким кодом, но не сработало:
Код
ActiveSheet.Range("$A$1:$C$23").AutoFilter Field:=3, Criteria1:="10", _
    Operator:=xlTop10Items, Criteria2:="<>132", Operator:=xlAnd
СЧЁТЕСЛИМН для дат с условиями "больше или равно" и "меньше или равно"
 
Здравствуйте. Имеется Лист1, на котором указаны строки с датами в промежутке между 26.10.2020 6:56:05 и 28.10.2020 22:29:25. Таких строк - 625.
На Лист2 я хочу посчитать кол-во вхождений в периоде между 26.10.2020 0:00:00 и 28.10.2020 23:59:59. Пишу формулу в ячейку B2:
Код
=СЧЁТЕСЛИМН(Лист1!A:A;A2;Лист1!B:B;">="&"26/10/2020";Лист1!B:B;"<="&"28/10/2020")
где ясно видно, что нужно посчитать всё, больше либо равно (>=) 26/10/2020 и меньше либо равно (<=) 28/10/2020. То бишь, под это условие попадают все 625 строк.
Но Excel выдает значение 188, что равно периоду с 26/10/2020 по 27/10/2020. Если же я изменю формулу на:
Код
=СЧЁТЕСЛИМН(Лист1!A:A;A2;Лист1!B:B;">="&"26/10/2020";Лист1!B:B;"<"&"28/10/2020")
то ничего не изменится, значение так и остается 188.

Вопрос: почему, когда я пишу меньше либо равно (<=) 28/10/2020, Excel не учитывает эту дату? Ведь есть "равно" в формуле. Как посчитать еще и 28/10/2020?

PS: дополнительно игрался с формулой вида:
Код
=СЧЁТЕСЛИМН(Лист1!A:A;A2;Лист1!B:B;">="&B1;Лист1!B:B;"<="&C1)
в ячейке B4, что тоже не дало результата.
Объединение данных в ячейке с переносом
 
Здравствуйте. Помогите, пожалуйста, решить вопрос.

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



То есть, в ячейке G10 мы видим, что данные из ячеек C2 и C3 объединены путем переноса строки.
Повторяющихся строк может быть больше, чем 2, тут это просто пример.
Прибавка рабочих часов к дате
 
Здравствуйте.

Я опять по мотивам двух тем, в которых ранее мне помогли:
Разница в минутах между датами без учета определенных условий
Неправильно рассчитывается разница в минутах между датами без учета определенных условий

И всё бы ничего, но как обычно это бывает, появилась еще одна необходимость, а именно - как прибавить к дате количество рабочих часов, среди которых не учитываются выходные, праздники, время обеда и нерабочие часы?

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

Прикладываю файл, в котором рассчитывается разница в часах между двумя датами без учета выходных, праздников, времени обеда и нерабочих часов. Нужно в ячейке C10 к дате из ячейки A10 прибавить, например, 40 часов (только рабочих - без учета выходных, праздников, времени обеда и нерабочих часов) из ячейки B10.

Насколько я понимаю, простой переменой мест уменьшаемого/вычитаемого/разности тут не обойтись.
Неправильно рассчитывается разница в минутах между датами без учета определенных условий
 
Здравствуйте. Я создавал тему - Разница в минутах между датами без учета определенных условий - в которой имеется расчет разницы в минутах между двумя датами с учетом только рабочего времени (то есть, без учета праздников, выходных и нерабочих часов). С этим расчетом очень помог пользователь БМВ, за что ему огромное спасибо!

В течение года с момента получения решения всё было в порядке, но спустя год появилась потребность изменить длительность рабочего дня. И я не могу понять следующее - почему при изменении времени начала и конца рабочего дня так, чтоб разница получалась отличной от 9 часов, расчет неправилен? Сейчас в файле "Пример_БМВ.xlsx" (ячейка С2) заданы начало рабочего дня "09:00", начало обеда "13:00", конец обеда "14:00", конец рабочего дня "18:00". Разница между двумя датами (21.10.2019 00:00:00-23.10.2019 00:00:00) получается равной 960 минут, что верно, т.к. между этими датами 2 дня по 8 рабочих часов, а 2*8*60=960.
Но если с этими же датами задать конец рабочего дня, равным "20:00" (файл "Пример_andronus.xlsx"), то количество минут равно 1080, что неверно, т.к. 2 дня по 10 рабочих часов это 2*10*60=1200 минут. И если задать конец рабочего дня, равным "17:00", то количество минут равно 900, что тоже неверно, т.к. 2 дня по 7 рабочих часов это 2*7*60=840 минут.

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

Имеется макрос, который удаляет на листе строки, содержащие слово "удалить":
Код
Sub УдалениеСтрокОдинЛист()
Dim FindWord As Range, DeleteRow As Range
УдалятьСтрокиСТекстом = Array("удалить")
For Each FindWord In ActiveSheet.UsedRange.Rows
    For Each word In УдалятьСтрокиСТекстом
        If Not FindWord.Find(word, , xlValues, xlPart) Is Nothing Then
            If DeleteRow Is Nothing Then Set DeleteRow = FindWord Else Set DeleteRow = Union(DeleteRow, FindWord)
         End If
     Next word
 Next
If Not DeleteRow Is Nothing Then DeleteRow.EntireRow.Delete
End Sub


Макрос прекрасно работает на одном листе. Но есть необходимость в том, чтоб он отрабатывал на всех листах книги. Для этого я использую стандартный код с циклом:
Код
Dim ws As Worksheet
For Each ws In Sheets
'тут необходимый код
Next


Соответственно, получается следующее:
Код
Sub УдалениеСтрокВсеЛисты()
Dim ws As Worksheet
For Each ws In Sheets
Dim FindWord As Range, DeleteRow As Range
УдалятьСтрокиСТекстом = Array("удалить")
For Each FindWord In ActiveSheet.UsedRange.Rows
    For Each word In УдалятьСтрокиСТекстом
        If Not FindWord.Find(word, , xlValues, xlPart) Is Nothing Then
            If DeleteRow Is Nothing Then Set DeleteRow = FindWord Else Set DeleteRow = Union(DeleteRow, FindWord)
         End If
     Next word
 Next
If Not DeleteRow Is Nothing Then DeleteRow.EntireRow.Delete
Next
End Sub


Но при выполнении макроса выдается ошибка 424 Object Required, и ссылается она дебагом на DeleteRow.EntireRow.Delete (третья строка снизу). Подскажите плиз, как выполнить код на каждом листе?

Во вложении файл с тремя листами, на каждом из которых тестовые таблицы. Дополнительно на первом листе кнопки, запускающие макросы. Примечание - чтобы вызвать ошибку, кнопку для всех листов надо нажимать первой, а не после кнопки для одного листа.
Трнспонирование данных из столба в строки блоками на другой лист, Как реализовать цикл?
 
Здравствуйте. Помогите, пожалуйста загнать в цикл следующий код.
Код
Sub транспонирование()
Sheets("Один").Select
Range("A1").Select
Selection.End(xlDown).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Два").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, transpose:=True
Sheets("Один").Select
Selection.Offset(9, 0).Select
Selection.Copy
Sheets("Два").Select
Range("A" & Cells.Rows.Count).End(xlUp).Select
ActiveCell.Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, transpose:=True
Sheets("Один").Select
Selection.Offset(9, 0).Select
Selection.Copy
Sheets("Два").Select
ActiveCell.Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, transpose:=True

End Sub

Что он делает? Берет данные с первого столбца листа "Один" и вставляет их с транспонированием на лист "Два". Итог можно увидеть на листе "Результат" или запустив макрос.

Цикл нужен такой, чтобы работа макроса заканчивалась на последнем блоке данных столбца "А" листа "Один". То есть, сейчас там данные заканчиваются на ячейке "А27", но строк может быть куда больше.
Query-запрос с динамическим адресом
 
Здравствуйте. Подскажите плиз, как сделать динамическим путь к папке в query-запросе?

Имеется файл по пути "C:\Папка\Подпапка\файл.xlsx", соответственно, запрос на подключение к нему выглядит так:
Код
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array( _
    "ODBC;DSN=Excel Files;DBQ=C:\Папка\Подпапка\файл.xlsx;DefaultDir=C:\Папка\Подпапка;DriverId=1046;MaxBufferSize=2048;PageTimeout=5;" _
    )), Destination:=Range("$A$1")).QueryTable


Если я перемещу "Папка" в другое место, например, на диск D, то путь будет выглядеть так "D:\Папка\", и запрос станет нерабочим. То есть, нужно в "DBQ=" и "DefaultDir=" написать код, который при перемещении "Папка" в любое другое место остается рабочим. "DBQ=ThisWorkbook.Path & "\Подпапка\файл.xlsx" и "DefaultDir=ThisWorkbook.Path & "\Подпапка"не работает.

Нашел вот такое решение для единичной папки, но оно тоже не работает (а у меня ко всему прочему, еще и подпапка есть):
Код
Dim strFile as String
strFile = ThisWorkbook.Fullname
Dim stfPath as String
strPath = ThisWorkbook.Path

With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
"ODBC;DSN=Excel Files;DBQ=" & strFile & ";DefaultDir=" & strPath ";DriverId=1046;MaxBufferSize=2048;PageTimeout=5;"), _
Destination:=Range("$A$1")).QueryTable


PS: файла не будет, т.к. данные конфиденциальны, да и не нужен он тут, ибо речь о правильном синтаксисе кода.
Именованный динамический диапазон для сгрупированных строк
 
Здравствуйте.
В продолжении темы Динамический диапазон для диаграммы (VBA). Т.к. по правилам "Одна тема - один вопрос", то создаю новую тему.

Подскажите, пожалуйста, как задать именованный динамический диапазон для столбцов, содержащих сгрупированные строки? На скриншоте видно, что имеются две группировки, для диаграммы данные выбраны вручную. Как сделать так, чтобы в именованный диапазон попадали только видимые строки за последние 7 дней?
Динамический диапазон для диаграммы (VBA)
 
Здравствуйте.
Есть необходимость каждую неделю сдвигать диапазон данных в диаграмме. На изображении видно, что данные соответствуют периоду 15.02-21.02.
Сейчас их нужно поменять на 22.02-28.02 (выделено желтым).

Макрорекордер предлагает следующее:
Код
ActiveSheet.ChartObjects("Диаграмма 1").Activate
ActiveChart.FullSeriesCollection(1).Values = "=Лист1!$B$23:$B$29"
ActiveChart.FullSeriesCollection(2).Values = "=Лист1!$C$23:$C$29"
ActiveChart.FullSeriesCollection(2).XValues = "=Лист1!$A$23:$A$29"

Оно и понятно, ведь тут я задал данные вручную. Как это можно сделать автоматически? Период всегда одинаков - 7 дней от последней даты.

Я вижу это так, что для Values и XValues будет задана некая переменная, назовем ее VariableColumn(x), которая будет получена как-то так (пример для столбца А):
Код
Range("A1").Select 'выделяем первую ячейку в столбце
Selection.End(xlDown).Select 'перемещаемся до последней в столбце ячейки с данными
ActiveCell.Offset(-6, 0).Select 'перемещаемся на необходимое кол-во ячеек вверх
Range(Selection, Selection.End(xlDown)).Select 'выделяем семь ячеек вниз - это и есть нужный для переменной диапазон

Соответственно, в итоге, я думаю, будет выглядеть что-то типа этого:
Код
ActiveSheet.ChartObjects("Диаграмма 1").Activate
ActiveChart.FullSeriesCollection(1).Values = VariableColumnB
ActiveChart.FullSeriesCollection(2).Values = VariableColumnC
ActiveChart.FullSeriesCollection(2).XValues = VariableColumnA

Помогите, пожалуйста.
Проверка открытости книг и последующий запуск макроса
 
Здравствуйте.

Есть код макроса (пусть будет называться <MACROS>), который переключается между двумя открытыми книгами (пусть будут <BOOK1> и <BOOK2>) и тянет из них данные. Для того, чтоб пользователь не забывал открыть эти книги, нужно их принудительно открывать, если они закрыты. Подсмотрел тут код:
Код
If WorkBookIsOpen("имя_проверяемой_книги") Then    
Workbooks("имя_проверяемой_книги").Activate   
Else   
Workbooks.Open("путь к нужной книге")   
End if


Подскажите плиз, каким будет правильный код в моём случае? То есть, код должен проверять, открыты ли <BOOK1> и <BOOK2> и:
1. Если открыты, то запускать код <MACROS>
2. Если закрыты, то открывать их и запускать код <MACROS>

Я вижу это так (ниже), но не знаю, как правильно написать проверку двух книг, и плюс имеется проблема, заключающаяся в том, что код <MACROS> объёмен, и два раза его писать - это непорядок:
Код
If WorkBookIsOpen("<BOOK1>") И WorkBookIsOpen("<BOOK2>") Then
'<MACROS>
Else
Workbooks.Open("путь к <BOOK1>") И Workbooks.Open("путь к <BOOK2>")
'<MACROS>
End If
Выделение только видимых ячеек VBA
 
Здравствуйте.

Имеется файл с двумя листами - "НетФильтра" и "ЕстьФильтр".

На первом листе имеется таблица и кнопка с кодом:
Код
Sub НетФильтра()
    Range([A1].Offset(1, 2).Resize(2, 1).Address).Select
End Sub

Он выделяет две ячейки сразу под надписью "Числитель".

На втором листе имеется аналогичная первому листу таблица, но с фильтром (скрыты некоторые строки) и кнопка с кодом:
Код
Sub ЕстьФильтр()
    Range([A1].Offset(1, 2).Resize(2, 1).SpecialCells(xlCellTypeVisible).Address).Select
End Sub

Мною подразумевалось, что SpecialCells(xlCellTypeVisible) будет выделять только видимые ячейки, но это не так - выдается ошибка, мол нет ячеек по условию.

Подскажите плиз, как произвести выделение по видимым ячейкам на втором листе в рамках текущего кода (это важно, т.к. код будет использоваться в формуле)? При условии, что начальная ячейка - А2 (как и видно в коде), и что фильтр может быть разным, то есть вместо Resize(2, 1) в коде должно быть выделение до конца видимых ячеек столбца.

Итоговый вид, как я предполагаю, должен быть примерно таким:
Код
Range([A1].Offset(1, 2).Selection.End(xlDown).SpecialCells(xlCellTypeVisible).Address).Select

Да, он неправильный, но суть, надеюсь понятна - смещение от ячейки A1 вправо на два столбца и одну ячейку вниз, и дальнейшее выделение вниз до первой пустой видимой ячейки.
Изменено: andronus - 21.02.2019 17:21:53
Вставка значения выделения в формулу
 
Здравствуйте.

Имеются сложности с написанием макроса, в котором есть формула, внутри которой находятся числитель и знаменатель, являющиеся выделениями.

Поясняю. На листе необходимо выводить в A2 формулу СУММ(C2:C3)/B2, но числитель и знаменатель должны браться из выделения. Написал три макроса:

1. Выделение числителя:
Код
Sub ВыделениеЧислителя()
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Offset(1, 2).Select
Selection.Resize(Selection.Rows.Count - 1, Selection.Columns.Count).Select
End Sub


2. Выделение знаменателя:
Код
Sub ВыделениеЗнаменателя()
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Offset(1, 1).Select
Selection.Resize(Selection.Rows.Count - 1, Selection.Columns.Count).Select
End Sub


3. Вставка формулы в A2:
Код
Sub ВставкаФормулы()
Dim FormulaResult As Worksheet
Set FormulaResult = Excel.ActiveSheet
FormulaResult.Range("A2").Value = "=Sum(C2:C3)/B2"
End Sub


В итоге макрос должен выглядеть так:
Код
Sub ВставкаФормулыВыделения()
Dim FormulaResult As Worksheet
Set FormulaResult = Excel.ActiveSheet
FormulaResult.Range("A2").Value = "Выделение числителя / Выделение знаменателя"
End Sub


Подскажите, пожалуйста, как это сделать? В VBA новичок, но думаю, что для числителя и знаменателя нужно вводить какие-то переменные или что-то еще.
Изменено: andronus - 21.02.2019 13:26:34
Макрос для группировки
 
Здравствуйте. Имеется файл, в котором есть необходимость сгруппировать данные по дням (лист "Исходные"). Вручную это просто - выделить видимый диапазон, нажать "Данные - Группировать", а затем, выделяя по одной строку с датой, нажимать "Разгруппировать". В итоге получится то, что на листе "Результат".

Но это просто, когда данных мало. Когда данные за несколько месяцев, то получается очень большой объем монотонной работы.
Можно ли упростить этот процесс макросом? Я вижу макрос таким:
1. Выделить видимый диапазон.
2. Нажать "Данные - Группировать", выбрать "строки".
3. В диапазоне А:А найти строку, содержащую год (в данном случае, 2018 или 2019). Либо подсвеченные определенным цветом строки. Либо те строки, у которых в диапазоне Е:Е указано "Есть".
4. Выделить целую такую строку.
5. Нажать "Данные - Разгруппировать"
6. Повторить 3-5 до первой пустой ячейки в диапазоне А:А.

Я видел https://www.planetaexcel.ru/techniques/9/47/ , но, к сожалению, моих знаний не хватает, чтоб переделать под себя.
SQL-запрос подтягивает не все данные
 
Здравствуйте.
Имеется исходная таблица, в которой имеются числовые, текстовые и тексто-числовые данные (лист "Исходные").
На листе "Результат" имеется sql-запрос, который тянет данные с листа "Исходные". При его выполнении подтягиваются только числовые данные, почему так происходит? Как тянуть все данные?

Для проверки запроса файл должен быть в корне диска С (если не лень менять пути, то поменяйте). На всякий случай инфа о подключении и сам запрос:

Код
DSN=Excel Files;DBQ=C:\тест.xlsx;DefaultDir=C:\Users\;DriverId=1046;MaxBufferSize=2048;PageTimeout=5;

Код
SELECT `Исходные$`.тест
FROM `C:\тест.xlsx`.`Исходные$` `Исходные$`
ВПР. Поиск числа в в диапазоне со смешанными форматами данных
 
Здравствуйте. Имеются значения в таблицах, у них у всех одинаковый формат - текстовый. Но это числа (причем явно это видно только в столбце А). Несмотря на то, что числам принудительно выставлен текстовый формат, Excel продолжает думать, что в ячейках разные форматы. Соответственно, ВПР по таким данным не будет срабатывать корректно.
В приложенном примере в трех столбцах видно, что во всех трех ячейках формат текстовый, но сравнение ячеек не дает истинный результат всегда.
Посему вопрос - может ли ВПР работать без учета формата и если да, то как?
Изменено: andronus - 08.02.2019 12:19:30
Попиксельное перемещение или изменение размеров объектов диаграммы
 
Здравствуйте. Часто возникает потребность перемещать значения и надписи на диаграммах (или менять размеры), при этом нередко бывает необходимо точное позиционирование - вплоть до пикселей. Насколько я знаю, Excel позволяет двигать объекты и изменять их размеры только вручную, что вызывает слишком долгое корпение над диаграммой.

Есть ли возможность изменять местоположение или размеры объектов с помощь, например, клавиатуры? То есть, стрелка вправо - смещение вправо, стрелка влево - смещение влево, и т.д. Сейчас стрелками я могу только выбрать другой объект. Например, как передвинуть "Сектор1" на несколько пикселей в любую сторону? Или как изменить размер области построения по типу размера со вкладки "Формат"?
[VBA] Условие "не равно" для Array
 
Здравствуйте. Подскажите плиз, как в коде для Array обозначить "не равно"? Поясняю.

В приложенном файле нужно отфильтровать по второму столбцу так, чтобы скрылись строки с 0, код макроса такой:
Код
Sub ArrayTest()
    
    ActiveSheet.Range("$A$1:$B$5").AutoFilter Field:=2, _
    Criteria1:=Array("1", "3"), Operator:=xlFilterValues
    
End Sub
Но кроме "1" и "3" могут же встречаться другие значения, а их все в код не вписать. Хочу поступить проще, а именно - исключить из фильтра всё, кроме 0. Пошел простым путем, попробовав написать так:
Код
Sub ArrayTest()
    
    ActiveSheet.Range("$A$1:$B$5").AutoFilter Field:=2, _
    Criteria1:=Array(<>"0"), Operator:=xlFilterValues
    
End Sub
Или так:
Код
Sub ArrayTest()
    
    ActiveSheet.Range("$A$1:$B$5").AutoFilter Field:=2, _
    Criteria1:=Array<>("0"), Operator:=xlFilterValues
    
End Sub
Или как либо еще. Но VBA всегда говорит, что я неправ. Гугление результатов не принесло...

Как сделать Array с условием "Не равно"?
Уведомление на почту при самоличном изменении поста или своем ответе в свою тему
 
Здравствуйте.

Впервые вижу форум, с которого приходят уведомления на почту при изменении моего поста мною же (или при своем ответе в свою тему). Зачем? Это лишний спам в почте. Я и так знаю, что это именно я изменил свой же пост или ответил в свою тему.

Отключите, пожалуйста, уведомления на почту при самоличном изменении своего же поста (или при своем ответе в свою тему).
Изменено: andronus - 16.12.2018 10:46:36
Сохранение формата ячеек при при удалении условного форматирования
 
Здравствуйте.

Подскажите плиз, как сохранить цвет ячеек, к которым применено условное форматирование (далее - УФ), при удалении условия?

Поясняю на примере. В столбце "Результат" происходит заливка цветом ячеек на основании условий из столбца "Условие". Я хочу удалить столбец "Условие" так, чтобы в столбце "Результат" не удалились результаты УФ. Либо просто удалить УФ, но форматирование оставить.

Добавление новых столбцов нежелательно, т.к. бывают задачи с огромным кол-вом столбцов и строк с текстовыми значениями, где добавление строки/столбца приводит к длительному ожиданию. Идеальный вариант - макрос типа "Конвертация формул в значения" в надстройке PLEX, только для УФ.
Изменено: andronus - 16.12.2018 09:59:44
Запрос данных из закрытых файлов
 
Здравствуйте. Часто бывает, что в таблицу нужно подтягивать значения из другого файла. Для таких ситуаций я использую подключение к опрашиваемому файлу через Query-запрос. И это действительно удобно, когда нужно вытянуть всю таблицу с листа. Но часто возникает необходимость вытащить значение определенной ячейки (без ВПР и проч., просто какой-то ячейки с листа). Можно, конечно, пойти путем создания ссылки на ячейку другого файла.

В случае, если опрашиваемый файл открыт, то формула выглядит так:
Код
=[Выгрузка_ПН.xls]ПРОДАЖИ_ТЕК'!$A$1
А если файл закрыт, то добавляется путь:
Код
='C:\Исходники\[Выгрузка_ПН.xls]ПРОДАЖИ_ТЕК'!$A$1

Но Excel в таких ситуациях ведет себя неопределенно - он то читает закрытые файлы, то не читает, выдавая #ЗНАЧ.

Поэтому вопрос - можно ли как-то сделать Query-запрос на ячейку? Если нет, то как корректно считывать данные с закрытых файлов&
Изменено: andronus - 14.09.2018 16:40:16
Разница в минутах между датами без учета определенных условий
 
Здравствуйте.
Помогите, пожалуйста, написать формулу. Имеются две даты в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС, нужно определить разницу между ними в минутах, но в этой разнице не должны учитываться:
1. Праздничные дни
2. Выходные дни
3. Нерабочие часы. Рабочие часы это 09:00-13:00 и 14:00-18:00.

Всё было бы просто, если б не эти нерабочие часы - решилось бы с помощью ЧИСТРАБДНИ, да и дело с концом.

Смотрел несколько тем тут на форуме, но ни одна не решает мою задачу так, как нужно...
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=38459
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=29992
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=2246
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=9720
Страницы: 1 2 След.
Наверх