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

Страницы: 1
Копирование АДРЕСА текущей ячейки в буфер обмена, или как быстро создавать внутренние гиперссылки по книге?, Нужно для быстрого создания гиперссылок внутри книги Excel с кучей листов.
 
Задача: быстро создавать навигацию по книге с кучей листов.

Как сейчас:
1. запомнить в голове адрес и лист целевой ячейки
2. Переходим на лист, где создаем ссылку
3. CTRL+K
4. Мучительно ищем в огромном списке нужный лист (а по дефолту Excel предлагает список имен, а не листов! Жутко бесит и неудобно. Т.е. и тут лишние клики мышки, нажать "место в документе", потом закрыть "определённые имена", потом уже открыть "список листов" и искать нужный)
5. Ручками пишем адрес ячейки.


Как хочу:
1. Хоткей на копирование в буфер адреса ячейки с полным путем. Какой?
2. Переходим на лист, где создаем ссылку
3. CTRL+K (или что-то другое, если есть такой вариант)
4. CTRL+V — но сильно сомневаюсь, что прокатит, т.к. мне надо не только адрес ячейки вставить, но ещё и путь до целевого листа. Как тогда ещё можно?


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

PS. Если есть хоть какой-то вариант решения задачи через Надстройку Plex или ASAP — то тоже пойдет, они обе у меня есть.
Изменено: zamboga - 24.01.2024 14:52:30
Вызов штатного окна со списком листов горячей клавишей и в центр окна, Хоткей или на VBA
 
Есть стандартный список всех листов, который вызывается ПКМ в левом нижнем углу.
На большом мониторе прыгать мышкой туда-сюда постоянно не очень удобно. Что побудило меня написать простенький скрипт, который вызывает список листов для быстрого перехода к нужному. Но и там не все хорошо, т.к. есть проблема со скроллом, и проблема с автоматическим ресайзом формы.

Может быть, я зря изобретаю велосипед, и все проще?

Как вызывать это стандартное окно с листами горячей клавишей? Как сделать так, чтобы это окно вызывалось в центр рабочей области?
Как сделать скролл на Listbox?, быстрый переход на другой лист через список листов
 
Excel 2016.
У меня файл с кучей листов. Делаю удобный переход между ними (да, я знаю что можно нажать ПКМ в левом нижнем углу самого Excel, где стрелки перехода между листами, но туда надо тянуться мышкой, что не очень удобно на большом мониторе).

Список листов вызывается сочетанием CTRL + ALT + W
Переход на нужный лист — двойной щелчок на нужном листе или кнопкой.

Вопрос. Как сделать, чтобы работал скролл мышкой в Listbox? Яндекс с гуглом предлагают страшные решения по перехвату мышиного колесика с глюками и без гарантии нормальной работы. Неужели так все плохо? Ведь если скролл-бар автоматом появляется, по логике, сам скролл мышкой должен работать. Может опция какая-то специфическая есть у ListBox, которую я не выгуглил?
Изменять размер ListBox в зависимости от длины списка, VBA
 
Excel 2016.
У меня файл с кучей листов. Делаю удобный переход между ними (да, я знаю что можно нажать ПКМ в левом нижнем углу самого Excel, где стрелки перехода между листами, но туда надо тянуться мышкой, что не очень удобно на большом мониторе).

Список листов вызывается сочетанием CTRL + ALT + W
Переход на нужный лист — двойной щелчок на нужном листе или кнопкой.

Вопрос. Можно ли сделать, чтобы размер Listbox'a (и размер самой формы) автоматически менялся в зависимости от числа элементов в ней?
Изменено: zamboga - 14.12.2016 00:23:25
Можно ли задать массив через Range, добавив формулу для каждого элемента? Или только цикл?, на VBA
 
Файл прикладывать смысла нет, вопрос короткий.

Задаю массив. Для простоты кода переменные заменены на абсолютные значения.
Код
arr = Range(Cells(1, 1), Cells(10, 10)).Value

Я работаю с текстом, и мне нужно чтобы в массив попадали значения без лишних пробелов, которые могут быть в конце слов.

Как прикрутить функцию Application.Trim("ячейка") к массиву, чтобы в него попадали уже обработанные данные, без лишних пробелов?
Только циклом или есть синтаксис для этого?
Не могу прервать выполнение процедуры по нажатии кнопки или по "крестику"
 
Для "пришельцев" с поисковых систем. Пауза для скрипта VBA с возможностью продолжения.
Вложение "Пауза для скрипта с возможностью продолжения.xlsm"

Во вложении итоговый код (скрипт) на VBA, который решает задачу:
  • Поставить скрипт на паузу, показать окно продолжения (НЕ модальное)
  • Пользователь может сделать любые действия в Excel, не прерывая сам скрипт
  • Продолжить скрипт по нажатию "Ок" / прервать скрипт по нажатию на "Выход" или "крестик"

Первоначальный вопрос. Вложение "Выход.xlsm" с ошибкой, прерывание скрипта еще не реализовано.
Скрытый текст
Изменено: zamboga - 10.12.2016 14:02:43
Как запустить цикл только по определенным (выделенным мышкой) листам книги?, на VBA
 
Сейчас так:
Код
    For Each sh In Sheets
        sh.Activate
        ...        'много букв
    Next
Работа ведется по всем листам книги.


А как сделать цикл только по выделенным листам, которые выделяем в обычном окне Excel, мышкой, перед запуском макроса?
Можно ли задать 3х-мерный массив (лист, строка, столбец), не используя цикл?, на VBA
 
Вот код, которым задаем массив со всеми ячейками с данными.

Код
Option Base 1

        'определяем последнюю ячейку с данными
        With ActiveSheet.UsedRange: End With
        lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
        lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
         
        'задаем массив исходных данных
        arr = Range(Cells(1, 1), Cells(lLastRow, lLastCol)).Value

Подскажите, плз, есть ли способ, чтобы превратить массив arr в трехмерный вида  arr(номер_листа, строка, столбец)? Я не могу сообразить синтаксис. Как добавить номер листа?

   
Код
For Each sh In Sheets
    sh.Activate
    arr = Range(Cells(1, 1), Cells(lLastRow, lLastCol)).Value    'как добавить номер листа в эту строку?
Next

Понятно, что можно запустить двойной вложенный цикл (for i=1 to lLastRow, for j=1 to lLastCol) по всем ячейкам каждого листа, а есть ли способ проще, используя Range или еще как то?
Изменено: zamboga - 08.12.2016 12:06:39
Как дать понять Excel, что записанное значение — формула? Через VBA.
 
Продолжение вчерашней темы.
Дисклаймер: в моих экспериментах могут быть очевидные глупости для сведущих людей — не судите строго, если сам Excel я знаю неплохо, то с VBA у меня скиллы базового уровня.
====================
Задача.
Вытащить из массива готовые записи, которые записаны в виде формул вида "=ГИПЕРССЫЛКА("[другая книга.xlsm]Лист1!A1";"Лист1!A1") и вставить их на новый лист.

Проблема: Excel не воспринимает формулы, как формулы до переинициализации ячейки. Т.е. мне надо нажать F2, как бы войти в режим редактирования, и выйти из него. тогда ячейка начинает обрабатывать содержимое, как формулу.
Конечно, можно набросать цикл, который будет последовательно обходить все ячейки, и "редактировать" их. Но на больших таблицах это будет очень долго. И, как мне кажется, должно быть более изящное решение.
====================
Что пробовал сделать:
1. Сразу делаем формат ячеек, как "общий". Строка с маркером '555555
Код
'555555
        ActiveSheet.[a1].Resize(.Count, 2).NumberFormat = "General"
Скрипт ругается на этапе вставки формул на лист.

1.1. Пробовал принудительно дать понять, что записанное значение — это формула:
Код
'444444
a(i, 2).FormulaLocal = .Item((aK(i - 1)))
'или 
'444444
a(i, 2).FormulaR1C1Local = .Item((aK(i - 1)))
Скрипт ругается. Судя по всему, нельзя объявить тип данных для массива. Синтаксис, как засунуть формулу в массив в виде формулы, я не выгуглил (если вообще такое существует, конечно. Как я понял, операнд .FormulaLocal применим к ячейкам и диапазонам, а не к массивам).

1.2. Пробовал записать английское написание формулы.
Код
'111111
... _
"=ГИПЕРССЫЛКА(""[" & _
заменить на 
'222222
... _
"=HYPERLINK(""[" & _
Вообще не вариант, в итоге все равно надо давить F2, и Excel в итоге вполне логично выдает мне ошибку #ИМЯ

1.3 Пробовал вставлять записи без знака "=", добавляя его в самом конце работы скрипта, через поиск и замену.
Код
'333333 без знака "="
... _
"ГИПЕРССЫЛКА(""[" & _
...
...
...

'777777
'Поиск и замена, добавляем обратно знак =, не работает. Но работает "ручками", а не через макрос.
        Range("B1").Select
        Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
        Selection.Replace What:="ГИПЕРССЫЛКА(""[", Replacement:="=ГИПЕРССЫЛКА(""[" _
        , LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat _
        :=False, ReplaceFormat:=False
Через скрипт замена не работает! При этом ручками, через CTRL+H знак "=" отлично добавляется, и все записи "превращаются" в формулы. Если записать макрос — то макрос замену не делает.
====================
2. Делаем формат ячеек, как "текстовый". Строка с маркером '555555
Код
'555555
        ActiveSheet.[a1].Resize(.Count, 2).NumberFormat = "@"
Разумеется, теперь макрос отлично работает. Но в итоге у нас формулы записаны как текст=))
Пробуем исправить, и сказать, что бывший [текст] — это теперь [формула].

2.1 Разбиваем текст по столбцам (замечу, что эту операцию я делаю в любом случае, т.к. ранее скрипт сохраняет в одно поле данные для нескольких ячеек, разделитель "|")
Код
'666666
        'разбиваем в колонке B:B текст по столбцам, разделитель -- точка с запятой.
        Columns("B:B").Select
        Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :="|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
        Columns("B:B").Delete
Опять-таки, ручками через Excel — все замечательно, записи "превращаются" в формулы, пишем скрипт штатным рекордером — все работает, но записи не превращаются в формулы.
====================
Во всех случаях в качестве финальной попытки делал еще так:
3. Пробовал давить на кнопку "Пересчёт" (F9) и "Произвести вычисления" (Shift + F9). Нет эффекта.
4. Копирование проблемных ячеек -- "специальная вставка" - "вставить формулы". Нет эффекта.

Файлы для экспериментов — во вложении.
Текущий код целиком:
Скрытый текст
Файл для экспериментов — во вложении.
Изменено: zamboga - 01.12.2016 15:31:36
Плавающая ошибка при применении словарей: Run-time error '13': Type mismatch
 
В VBA я новичок, знаю мало. Пока правлю чужой код под себя, параллельно разбираясь в нем, т.к. своих знаний пока мало.

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

Глобально на входе будет список из 10-10000 строк, и искать он должен в таблицах из 1-50 листов и 100-100 000 строк.
В качестве примера данных гораздо меньше.

Изначально скрипт не мой, но я основательно разобрал его по косточкам, понял как работает, снабдил его комментариями и дописал его под себя. Особенно запутало меня наличие "словаря" при работе данного скрипта.
Код
Sub pr()
    Dim sh As Worksheet, t$
    Dim lLastRow As Long, lLastCol As Long, r As Long, i As Long, j As Long
       
  
    Windows("Скрипт поиска.xlsm").Activate
    
    'альтtрнативный способ задать массив без открытия файла. не подходит для фраз, состоящих более чем из одного слова.
    'a = Split(CreateObject("Scripting.FileSystemObject").Getfile(ActiveWorkbook.Path & "\ИД.txt").OpenasTextStream(1).ReadAll, vbNewLine)
    
    'открываем файл с Исходными Данными
    PathFileTxt = ActiveWorkbook.Path & "\ИД.txt"
    Workbooks.OpenText Filename:=PathFileTxt, Origin:=1251
    Columns("A:A").Select
    
    'разбиваем по столбцам чтобы найти слова, а не фразы
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    
    
    'удаляем пустые строки
    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
      
    
    'определяем последнюю ячейку с данными
    With ActiveSheet.UsedRange: End With
    lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
    
    'задаем массив исходных данных
    'a = [a1].CurrentRegion.Value       'ограничивает диапазон первой пустой строкой/столбцом, не подходит
    a = Range(Cells(1, 1), Cells(lLastRow, lLastCol)).Value
    ActiveWorkbook.Close False
    
    'создаем словарь с исходными данными для поиска
    With CreateObject("scripting.dictionary")
        For Each el In a
             .Item(el) = ""
        Next
        MsgBox "Список ключей для поиска:" & vbLf & vbLf & Join(.Keys, vbLf)
    'ищем в словаре совпадения на наших листах
        For Each sh In Sheets
            'определяем последнюю ячейку с данными
            With sh.UsedRange: End With
            lLastRow = sh.UsedRange.Row + sh.UsedRange.Rows.Count - 1
            lLastCol = sh.UsedRange.Column + sh.UsedRange.Columns.Count - 1
            'задаем массив
            a = sh.Range(sh.Cells(1, 1), sh.Cells(lLastRow, lLastCol)).Value
            'a = [a1].CurrentRegion.Value       'ограничивает диапазон первой пустой строкой/столбцом
            'забиваем словарь адресами ячеек, в которых есть совпадения с ИД
            For i = 1 To UBound(a)
                For j = 1 To UBound(a, 2)
                    t = a(i, j)

'111111 эта строка норм работает
'                   If .exists(t) Then .Item(t) = .Item(t) & IIf(.Item(t) = "", "", ";") & sh.Name & "(" & i & "," & j & ")"

'222222 эта строка НЕ работает, хотя она просто длиннее прошлой, и MsgBox ее отрабатывает так, как и надо в итоге.
'                  MsgBox "=ГИПЕРССЫЛКА(""[" & Application.ActiveWorkbook.FullName & "]" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ");""" & sh.Name & "!""&АДРЕС(" & i & ";" & j & "))"
                  If .exists(t) Then .Item(t) = .Item(t) & IIf(.Item(t) = "", "", ";") & "=ГИПЕРССЫЛКА(""[" & Application.ActiveWorkbook.FullName & "]" & sh.Name & "!""&АДРЕС(" & i & ";" & j & ");""" & sh.Name & "!""&АДРЕС(" & i & ";" & j & "))"
                
                Next
            Next
            
        Next
        
        'создаем новую книгу
        Workbooks.Add
        
        'вытаскиваем из словаря ключи (keys) и их значения (items)
        ActiveSheet.[a1].Resize(.Count, 2) = Application.Transpose(Array(.Keys, .Items))
        
        'разбиваем в колонке B:B текст по столбцам, разделитель -- точка с запятой.
        Columns("B:B").Select
        Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
        Columns("B:XFD").EntireColumn.AutoFit
        Range("A1").Activate
        Application.ScreenUpdating = True
        MsgBox "Done!"
        'ActiveWorkbook.Close False
    End With
 End Sub
Вопросы.
1. Валится ошибка Run-time error '13': Type mismatch в самом конце работы скрипта, при построении итогового массива и отображением его на экране ( 'вытаскиваем из словаря ключи (keys) и их значения (items)). Опытным путем установлено, что проблема возникает из-за строки, обозначенной '222222  в скрипте. Как победить? При этом точно такая же строка '111111, которая короче по длине, отрабатывает нормально.
2. Валится ошибка Run-time error '13': Type mismatch, (надо активировать строку '111111 и закоментить '222222), если добавить в таблицу "искать тут.xlsm" пустые строки и/или столбцы, как на скриншоте. http://prntscr.com/ddlywa -- а это очень актуальная проблема, т.к. файлы с данными для поиска имеют совершенно разную структуру и могут содержать любое число пустых строк и столбцов.
3. В изначальном скрипте кроме "Dim sh As Worksheet, t$" объявлений переменных больше не было, остальные, про тип которых знаю, я добавлял сам. В массивах и словарях я совсем не силен. Судя по гуглению яндекса, ошибка 13 может быть из-за этого. Подскажите, каким типом надо правильно объявить все используемые в скрипте переменные?
4. Входные фразы могут состоять из любого числа слов. При формировании одномерного массива туда попадает пустая строка (см скрин http://prntscr.com/ddmi73 ). Как этого избежать?
5. Как посмотреть значения .Key и значения .Item в созданном словаре во время отладки? Через MsgBox очень не удобно, а никакой другой способ я так и не нагуглил.

http://prntscr.com/ddlywaВо вложении файл и исходными данными и сам скрипт с xlsm файлом для проверки.
Изменено: zamboga - 30.11.2016 18:06:15
Даты в Excel отображаются с запятыми, хотя в настройках системы — точки. Как починить?
 
Excel 2016. Проблеме примерно 2-3 месяца, полгода назад точно ее не было.

1. Во всех файлах (и новых) на моем компе даты отображаются через запятую, а не через точку.
2. Можно ввести пользовательский формат ячеек, или заменить все запятые на точки, но это только для ранее введенных данных. Кроме того, есть таблицы с сотнями тысяч строк, их не хочется перегружать пользовательским форматом.
3. При вводе новых дат, в старые файлы они вводятся через запятую.
4. При вводе новых дат, в новые файлы они также вводятся через запятую.
5. На других компах файл показывается нормально, с точкой,
6. На скриншоте видно, что проблема в том, что формат даты в Excel прописан с запятой. В настройках системы — стоит точка. В настройках Excel ("файл"-"параметры" - "дополнительно" - "параметры правки") —  у опции "Использовать системные разделители" галка стоит.

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

Итого. Запятые в датах уже бесят, куда копать дальше? Как поменять запятую в формате дат в Excel на точку? Может в реестре есть какой-то параметр?
Изменено: zamboga - 29.11.2016 12:23:18
Расширение стандартного поиска. Как искать списки слов?, как стандартный CTRL+F, только со списком слов.
 
Стандартная функция поиска известна если не всем, то очень многим=)
Но она позволяет искать только по одному слову или фразе.

В моем же случае у меня список из сотен строк, в каждой из которых -- одно-три слова.
Если бы надо было искать "мой список" в одной таблице в одном листе -- способов море. В моем же случае таблиц много, и листов в каждой может быть 5-20 штук. И списки разные каждый раз.

Нужно, чтобы на "вход" задавался список слов, на "выходе" показывались бы "имя книги", "имя листа", "адрес ячейки", "значение", т.е. чтобы выглядело это примерно также, как и при стандартном поиске CTRL+F, и при клике на результат автоматически переходить к нужной ячейке. Ну и для тех слов, для которых вообще ничего не нашлось, чтобы писалось "не найдено".

Вопрос, как можно решить эту задачу? Только макросами? Макросы я знаю очень плохо, могу только чужой код немного подправить, или записать свой. Может, такая функция есть в какой-то надстройке?
Изменено: zamboga - 25.11.2016 15:07:43
Генерация всех возможных комбинаций слов из 2-3 колонок
 
Исходные данные (на примере ФИО понять ТЗ легче, но в итоговой задаче число колонок может быть 2-10):

Предположим, есть 3 колонки: "Фамилия", "Имя", "Отчество". Список может содержать N записей.

Фамилия Имя Отчество
Иванов Сергей Никанорович
Смирнов Петр Петрович
Сидоренко Михаил Евгеньевич
… … …
… … …
… … …
Необходимо сгенерировать новый список, который будет включать в себя все возможные комбинации между собой (все фамилии + все имена + все отчества).

Фио
Иванов Сергей Никанорович
Иванов Сергей Петрович
Иванов Сергей Евгеньевич
Иванов Петр Никанорович
Иванов Петр Петрович
Иванов Петр Евгеньевич
Иванов Михаил Никанорович
Иванов Михаил Петрович
Иванов Михаил Евгеньевич
Смирнов Сергей Никанорович
Смирнов Сергей Петрович
Смирнов Сергей Евгеньевич
Смирнов Петр Никанорович
Смирнов Петр Петрович
Смирнов Петр Евгеньевич
Смирнов Михаил Никанорович
Смирнов Михаил Петрович
Смирнов Михаил Евгеньевич



Подскажите плз, как такое реализовать, желательно с помощью формул.
Изменено: zamboga - 03.10.2017 00:04:29
Страницы: 1
Наверх