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

Страницы: 1
Связанные (зависимые) выпадающие списки 4 уровня, VBA, DropDown List, 4 levels
 
Привет, форумчане!
Я пытаюсь реализовать что-то похожее на то, что описано в этой статье: https://www.planetaexcel.ru/techniques/1/38/.
Кроме того, хочу добавить функционал: чтобы при изменении любого значения в ячейках C1, C2, C3 или C4 на листе Device_LIST_GENERATION остальные значения автоматически обновлялись сверху вниз. Для трёх значений (C2,C3,C4) всё работает нормально, но когда добавляю четвёртое (C1) — перестаёт функционировать. Плюс, не пойму, почему при вставке имени диапазона по формуле OFFSET (имя Building) в ячейку, например, C2, вылетает ошибка.
На листе есть код. Буду очень признателен, если кто-то подскажет, в чём может быть проблема и как это пофиксить! Заранее спасибо за помощь.


Код
Private Sub Worksheet_Change(ByVal Target As RANGE)
    If Not Intersect(Target, Me.RANGE("C1:C4")) Is Nothing Then
        Application.EnableEvents = False  ' Избежать рекурсии
        Call UpdateLinkedCells(Target)
    
        Application.EnableEvents = True
    End If
End Sub

Sub UpdateLinkedCells(Target As RANGE)
    Dim wsGEN As Worksheet
    Dim wsDB As Worksheet
    Dim lastRowDB As Long
    Dim r As Long
    Dim found As Boolean
    Dim currentC2 As String
    
    Set wsGEN = ThisWorkbook.Sheets("Device_LIST_GENERATION")
    Set wsDB = ThisWorkbook.Sheets("DB_C0")
    lastRowDB = wsDB.Cells(wsDB.Rows.Count, "A").End(xlUp).row
    found = False
    
    ' Сохраняем текущее значение C2 перед изменением
    currentC2 = UCase(Trim(wsGEN.RANGE("C2").Value))
    
    If Target.Address = "$C$2" Then  ' TAG_RELEVANT_EQUIPMENT changed
        Dim selRelevant As String
        selRelevant = UCase(Trim(wsGEN.RANGE("C2").Value))
        For r = 2 To lastRowDB
            If UCase(Trim(wsDB.Cells(r, 3).Value)) = selRelevant Then  ' Column C in DB_C0
                wsGEN.RANGE("C3").Value = wsDB.Cells(r, 5).Value  ' Discipline to C3
                wsGEN.RANGE("C4").Value = wsDB.Cells(r, 2).Value  ' TAG_ITEM_NUMBER_CCMS to C4
                found = True
                Exit For
            End If
        Next r
        
    ElseIf Target.Address = "$C$3" Then  ' Discipline changed
        Dim selDisc As String
        selDisc = UCase(Trim(wsGEN.RANGE("C3").Value))
        
        ' Сначала ищем запись с текущим C2 и новым значением Discipline
        For r = 2 To lastRowDB
            If UCase(Trim(wsDB.Cells(r, 3).Value)) = currentC2 And _
               UCase(Trim(wsDB.Cells(r, 5).Value)) = selDisc Then
                wsGEN.RANGE("C4").Value = wsDB.Cells(r, 2).Value  ' Обновляем только C4
                found = True
                Exit For
            End If
        Next r
        
        ' Если не нашли комбинацию C2 + новая дисциплина, тогда меняем C2
        If Not found Then
            For r = 2 To lastRowDB
                If UCase(Trim(wsDB.Cells(r, 5).Value)) = selDisc Then  ' Column E
                    wsGEN.RANGE("C2").Value = wsDB.Cells(r, 3).Value  ' TAG_RELEVANT to C2
                    wsGEN.RANGE("C4").Value = wsDB.Cells(r, 2).Value  ' TAG_ITEM to C4
                    found = True
                    Exit For
                End If
            Next r
        End If
        
    ElseIf Target.Address = "$C$4" Then  ' TAG_ITEM_NUMBER_CCMS changed
        Dim selTag As String
        selTag = UCase(Trim(wsGEN.RANGE("C4").Value))
        For r = 2 To lastRowDB
            If UCase(Trim(wsDB.Cells(r, 2).Value)) = selTag Then  ' Column B
                wsGEN.RANGE("C2").Value = wsDB.Cells(r, 3).Value  ' TAG_RELEVANT to C2
                wsGEN.RANGE("C3").Value = wsDB.Cells(r, 5).Value  ' Discipline to C3
                found = True
                Exit For
            End If
        Next r
    End If
    
    ' Если не найдено, можно добавить логику очистки, например:
    ' If Not found Then wsGen.Range("C2:C4").ClearContents
End Sub


Извлечение цветов текста из одной ячейки
 
Цитата
Андрей VG написал:
Вариант. Перекодировку hex значений цветов в названия можете сделать, например, по такой  таблице .

Добрый день, Андрей.
Возможно ли подправить текст кода, написанный Вами ниже, таким образом, чтобы не выдавало ошибку, если весь текст в ячейке написан одним цветом?

Код
Option Explicit

Public Function Test(ByVal foo As Range) As Variant
    Dim pReg As Object, sXml As String, pItems As Object
    Dim vOut() As Variant, i As Long

    If foo.Count = 1 Then
        Set pReg = CreateObject("VBScript.RegExp")
        pReg.Global = True: pReg.IgnoreCase = True
        pReg.Pattern = "<Font[^>""]*?(?:html:Color=""(#[A-F\d]+)"")?>(.+?)</FONT>"
        sXml = foo.Value(xlRangeValueXMLSpreadsheet)
        Set pItems = pReg.Execute(sXml)
        ReDim vOut(0 To pItems.Count - 1, 1 To 2)
        For i = 0 To pItems.Count - 1
            vOut(i, 1) = pItems(i).SubMatches(1)
            vOut(i, 2) = pItems(i).SubMatches(0)
            If IsEmpty(vOut(i, 2)) Then vOut(i, 2) = "#000000"
        Next
        Test = vOut
    End If
End Function


Можно конечно, прописать мини-функцию.  С добавлением IFERROR(Test(A2);OneColor(A2)).
Но это неудобно для работы с большим кол-вом данных.

Код
Public Function OneColor(Cell As Range)
    OneColor = Cell.Font.Color
End Function


Заранее спасибо.
Извлечение цветов текста из одной ячейки
 
Андрей VG, спасибо Вам большое. Превосходно!
Извлечение цветов текста из одной ячейки
 
Добрый день, ребята!

Подскажите, пожалуйста, можно ли извлечь цвета частей текста из одной ячейки?
Имеется одна ячейка, в которой через тире и пробелы прописаны 3 цифры 3 разных цветов (красный, зелёный и чёрный).
Извлечь цифры отдельно получается, а вот цвета этих чисел непонятно как (возможно какой макрос функцией?!)
Заранее спасибо!

Изменено: Алексей Павлов - 23.10.2020 15:19:20
Функция подсчёта уникальных значений в фильтрованном диапазоне (Excel VBA)
 
Андрей VG, cпасибо Вам большое.
рабочий код:
Код
Public Function CountZZZ(Area As Range) As Double
Dim rCell As Range
Dim Unique As New Collection
On Error Resume Next
    
    For Each rCell In Area
    If Not IsEmpty(rCell) And Not rCell.EntireRow.Hidden Then Unique.Add rCell.Value, CStr(rCell.Value)
 Next
    
CountZZZ = Unique.Count
End Function
Функция подсчёта уникальных значений в фильтрованном диапазоне (Excel VBA)
 
Добрый день.

Пожалуйста, посмотрите на приложенный код.
Как можно его подправить, чтобы ф-ция подсчитывала кол-во уникальных значений именно в фильтрованном диапазоне.
На данный момент ф-ция считает все уникальные значения в заданном диапазоне.
Код
Public Function CountZZZ(Area As Range) As Double
Dim rCell As Range
Dim Unique As New Collection
On Error Resume Next
    
    For Each rCell In Area
        If Not IsEmpty(rCell) Then Unique.Add rCell.Value, CStr(rCell.Value)
    Next
    
CountZZZ = Unique.Count
End Function

Может добавить доп переменную, в таком виде?
Set Area1 =Area.SpecialCells(xlCellTypeVisible)
Power view. Перевод репорта в таблицу
 
Добрый день, ребята!

Подскажите, пожалуйста, как можно вытащить Power View репорт и перевести его в обычную таблицу Excel.
В приложение можете увидеть - простой пример: 2 таблицы связаны одним уникальным столбцом: "Страны".
Путём Power View, у меня как бы делаются VLOOKUP'ы и подгоняются в одну таблицу.

Может есть иной способ, не прописывая подобные фунцкии, также как INDEX и MATCH,
а просто связав таблицы по уникальному столбцу и получить добавочные данные с других таблиц.
Потому что формулами каждый раз сложно подхватывать данные с разных таблиц, оперируя большим кол-вом данных.

Изменено: Алексей Павлов - 16.01.2019 19:47:38
Заполнение формы на веб-сайте через Internet Explorer
 
Jungl,
спасибо огромное, оказалось так просто.  :oops:
Код
Set lst = frm.Document.getElementsByName("SelectReport")(0)

"SelectReport" он там один и получается начинается с 0. как определить - когда нужно ставить цифру в конце кода?

еще заметил, что вы использовали Network опцию в IE. это только ради ссылок? или что-то ещё необычное может показать?  :)
Изменено: Алексей Павлов - 07.08.2018 00:04:27
Заполнение формы на веб-сайте через Internet Explorer
 
Jungl,
да, поэтому я и пишу на форуме планета EXCEL.
я ищу возможности - кто подскажет мне как реализовать это в макросе.
законтролировать FRAME через VBA.
Заполнение формы на веб-сайте через Internet Explorer
 
Всем привет.

Пытаюсь заполнить форму на сайте: в рамке FRAME > в выпадающем меню выбрать некоторое значение.
Если бы выпадающее меню находилось в теле сайта, то проблем нет, выбирает без всякого.
Не получается  прописать код касательно FRAME раздела.


Код
Sub Attempt()
Dim ie As Object
Dim frm As Object
Dim frm1 As Object
Dim lst As Object
    Set ie = CreateObject("internetexplorer.application")
    ie.Visible = True
    'открываем сайт
    ie.navigate "http://ets.aeso.ca/ets_web/docroot/Market/Reports/HistoricalReportsStart.html"
    'ждёмс
    Do
    Loop Until Not (ie.Busy)
    Application.Wait Now + TimeValue("00:00:02")
'выбираем рамку (вот может тут уже неправильно присвоено)
Set frm1 = ie.document.Frames
Set frm = frm1("report_nav")
                
' может проблема здесь
Set lst = frm.document.getElementsByTagName("SelectReport")
'на вэлью появляется ошибка
lst.Value = "Market/Reports/PublicSummaryAllReportServlet"
Set lst = frm.Function("populateReportType(document.reportForm, getCurrReportObj())")
lst
    
    Set ie = Nothing
    Set frm = Nothing
    Set frm1 = Nothing
    Set lst = Nothing
    
End Sub
Изменено: Алексей Павлов - 05.08.2018 08:33:28
Запуск макроса другой книги
 
AAF, большое спасибо, отлично работает. (решено).
Запуск макроса другой книги
 
AAF,  так ведь и не работает, посмотрите...
Код
 Option Explicit[P] 
 Sub WBk1M()
 Dim x, wb As Workbook
 For Each x In Workbooks
   If x.Name = "Книга2.xlsm" Then Exit For
 Next
 If IsEmpty(x) Then Workbooks.Open ThisWorkbook.Path & "\Книга2.xlsm"
 Application.Run "Книга2.xlsm!module1.WBk2M"
 End Sub
 Option Explicit
 
 Sub WBk2M()
 Dim x
 For Each x In Workbooks
   If x.Name = "Книга1.xlsm" Then x.Close False: Exit For
 Next
 
 'после предыдущей строчке макрос перестаёт работать...
 MsgBox "Появись, появись...!"
 ' это сообщение не появляется, через 1 книгу..
 End Sub

не появляется MSGBOX, если запускаете Книгу 1, кнопку 1. а мне как раз нужно найти способ, чтоб не прерывался макрос.
Изменено: Алексей Павлов - 12.06.2018 14:37:54
Запуск макроса другой книги
 
sokol92, так не пойдёт, вы закрываете книгу в первом макросе(первой книги).
мне нужно закрыть обязательно во втором.

Дело в том, что 1-я книга у меня открывается в режиме чтения (стоит парольная защита на книгу).
в 1-й нажимается кнопка, которая открывает 2-ю книгу и её макрос.
этот макрос закрывает 1-ю книгу и открывает в режиме редактирования 1-ю книгу (вводя пароль), делает некоторые операции, потом снова открывает 1-ю книгу в режиме чтения.

Дабы не нагружать излишней информацией я лишь и спрашиваю как реализовать закрытие 1-ой книги и продолжить макрос 2-ой книги.

Либо, если кто подскажет, как сделать в одной книге:

книга открывается в режиме чтения (у книги стоит парольная защита).
нажав на кнопку в книге, переоткрыть книгу в режиме редактирования (макрос вводит пароль автоматически), сделать некоторые операции и снова открыть книгу в режиме редактирования..
Изменено: Алексей Павлов - 12.06.2018 06:51:52
Запуск макроса другой книги
 
Там нет, закрытия первой книги, вопрос в другом:
как предотвратить прерывание работы макроса, после закрытия первой книги.
Запуск макроса другой книги
 
1. Запускаю макрос (FIRST.XLSM), который открывает другую книгу (SECOND.XLSM)
2. Запускаю макрос из (SECOND.XLSM),  который закрывает книгу (FIRST.XLSM) и продолжает делать макрос второй книги без прерывания.

Я пробовал это, но не получается...

Скрытый текст

Но после закрытия книги 1 действия прерываются, подскажите, что делать?
где-то читал, что вместо Application.Run нужно написать Application.OnTime Now + 1 , но не знаю как, подскажите, пожалуйста.
Рандомная закраска ячеек по условию
 
Wiss, спасибо огромное, работает действительно быстро и как нужно. Это Ветерок.
Рандомная закраска ячеек по условию
 
Цитата
БМВ написал: Технические-характеристики-и-ограничения-microsoft-excel-16...[
хорошо, пусть будет 20 цветов, дело в том как исправить цикл, пусть через несколько строк повторяется, рандом в коде нормален, только на большое количество строк не работает
Рандомная закраска ячеек по условию
 
Сергей Немец, нужно рандом как в примере, цветовые шкалы не пойдут.
как бы так исправить VBA код ..
Рандомная закраска ячеек по условию
 
Всем привет!  

У меня в таблице 2 столбца с 250000 строками.
Задача: закрасить ячейки столбца "B" в рандомные светлые тона
в зависимости от цифры в столбце "A", если цифра повторяется, то цвет должен повторяться
дубликаты идут всегда по порядку (перед макросом колонка заранее отсортирована 1-99999*) - может это поможет для модифицированного макроса

в приложенной книге, на Sheet1 я написал макрос, который работает как и хотелось только на 15 вариаций,
но на Sheet2 где как раз те самые 250000 строк  макрос зависает (заменив lNAME с Sheet1 на Sheet2 и For str1=1 to 249989), и не отвечает (пробовал ждать 2 часа - так и зависло).
так у меня вариций в колонке А - 60000, но файл весит 2,2 мегабайт, поэтому когда откроете Sheet2 нажмите макрос с кнопкой - дописать значения.

подскажите, пожалуйста, что нужно изменить в макросе, чтобы работало на 250000 строк с 60000 вариаций.

(текст макрос продублирую здесь):
Скрытый текст
ComboBox с посимвольным отслеживанием введенного текста
 
Цитата
Logistic написал: См. вложение  и кроликов ищет и печеньки...
спасибо ;)
ComboBox с посимвольным отслеживанием введенного текста
 
Народ подскажите, при поиске по форме,
у меня ищет только по буквам с первого слова,
как сделать чтоб искало со второго, третьего и пр...?
Изменено: spartan11 - 08.10.2016 21:23:31 (не прикрепился файл)
ComboBox с посимвольным отслеживанием введенного текста
 
Dima S, а как сделать тоже самое, только на UserForm, что нужно поменять?
Страницы: 1
Наверх