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

Страницы: 1 2 3 След.
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
Dmitriy XM, добрый день!
Извините, можете еще глянуть код, который был итоговый,  но увы он отрабатывает в некоторых моментах или некорректно,
или непонятно!  Где то по результатам  сравнения  выделятся слова целиком, где то части слов и это круто!  Так и хотелось бы.
А где-то одни и те же слова выделяются целиком, а в другой строчке, то же слово выделяется  по другому и частично.
Если вы конечно на связи ...

Код
Option Explicit 
Sub CompareText_Main()
    Dim rng1 As range, rng2 As range
    Set rng1 = GetRange("Основной диапазон")
    Set rng2 = GetRange("Диапазон для сравнения")
     
    If rng1.Rows.Count <> rng2.Rows.Count Then
        MsgBox "Диапазоны должны быть равны", vbCritical, "***"
        Exit Sub
    End If
     
    rng1.Font.Color = vbBlack
    rng2.Font.Color = vbRed
     
    Call CompareRanges(rng1, rng2)
End Sub
 
Private Sub CompareRanges(rng1 As range, rng2 As range)
    Dim x As Long
    For x = 1 To rng1.Rows.Count
         
        Dim where As String, find As String
        where = rng2.Cells(x).Value
        find = RealFind(rng1.Cells(x).Value, where)
         
        If find <> Empty Then
            Dim arrSpl As Variant
            arrSpl = Split(find, ";")
             
            Dim i As Long
            For i = LBound(arrSpl) To UBound(arrSpl) - 1
                 
                Dim word As String: word = arrSpl(i)
                Dim q As Integer, step As Integer
                step = IIf(Len(word) = 1, 1, Len(word))
                For q = 1 To Len(where) Step step
                    Dim inString As Long
                    inString = InStr(q, LCase(where), LCase(word), vbTextCompare)
                     
                    If inString > 0 Then
                        rng2.Cells(x).Characters(inString, step).Font.Color = vbBlack
                        q = inString + step
                    End If
                Next q
            Next i
        End If
    Next x
End Sub
 
Function RealFind(ByVal what As String, ByVal where As String) As String
    what = CleanString(what)
     
    Dim arrWhat As Variant
    arrWhat = Split(what, " ")
 
    Dim n As Long
    For n = LBound(arrWhat) To UBound(arrWhat)
        Dim inString As Long: inString = 0
        inString = InStr(1, LCase(where), LCase(arrWhat(n)), vbTextCompare)
         
        Dim result As String
        If inString > 0 Then result = result & arrWhat(n) & ";"
    Next n
     
    RealFind = result
End Function
 
Private Function CleanString(what As String) As String
    Dim RE As Object
    Set RE = CreateObject("VBScript.RegExp")
    RE.Global = True
    RE.Pattern = "[^\dА-Яа-яA-Za-z,()=]"
     
    CleanString = Application.Trim(RE.Replace(what, " "))
End Function
 
Private Function GetRange(header As String) As range
    Set GetRange = Application.InputBox(header, "Выделите диапазон", , , , , , 8)
End Function
Изменено: YGrigor18 - 15.08.2025 09:57:46
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
online, добрый день!
подскажите, можно ли в вашем варианте сделать выбор - выделять целые слова при  несовпадении или только символы несовпадения?
это еще один поиск в найденных словах или проще?
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
online, Dmitriy XM, МатросНаЗебре, спасибо за рабочие варианты программ и учет нюансов!  Надеюсь, что и других ваши коды порадуют!!!
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
МатросНаЗебре, добрый день, только добрался до задачи!  Все работает как задумано,  в том числе и по учету регистра.
Потестирую на других данных, но думаю, что все уже ОК! Спасибо!
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
Dmitriy XM, добрый день, только добрался до задачи!  по RE.Pattern понял. На тех данных, что есть сейчас все работает корректно!

Спасибо!  Буду пробовать далее.  Интересно, что данные для сравнения могут быть и на разных листах и даже в разных книгах.  
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
Dmitriy XM,  попробовал на данных,  "мм", "на" и "6" -  более не выделяются.
Но запятые "," выделяются красным и круглые скобки (),  строки 10 и 11 в файле, например.
Черт знает, как учесть эти все моменты?  :)  
Изменено: YGrigor18 - 22.07.2025 18:33:30
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
МатросНаЗебре,  проверил на тех же данных! Вроде как все ОКЮ пробелы не влияют! Спасибо!
И я правильно понимаю, что если нужно учитывать или не учитывать регистр ?, то дописываем параметр
If StrComp(cleanWordA, cleanWordB) = 0 Then  
If StrComp(cleanWordA, cleanWordB,1) = 0
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
МатросНаЗебре,  добрый день!  попробовал применить код программы на данных.
Посмотрите, пожалуйста, вложенный файл.  Код вполне рабочий! Спасибо!

Что заметил?
1) если в строе "Мама мыла раму"  вставить пробелы лишние типа- "Мама     мыла     раму", то красным выделяются все три слова.
   Посмотрите, pls,  по возможности как это можно устранить.
Изменено: YGrigor18 - 22.07.2025 16:40:28
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
Dmitriy XM,  в вашем коде выделяются не целые слова строк, в которых есть разночтения, а выделяются сами символы в этих словах.
Это отличает ваш вариант от других.
Посмотрите, pls, почему выделяются -  "мм", "на" и "6" - ?
И насколько понял, регистр символов не учитывается, а как сделать, чтобы он учитывался? (при необходимости)
Спасибо!
Изменено: YGrigor18 - 22.07.2025 16:35:45
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
Dmitriy XM,  спасибо,  все в п.1  ок!
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
Dmitriy XM, добрый день!  Попробовал применить код программы. Посмотрите, пожалуйста, вложенный файл.
1). При сравнении строк красным цветом выделяется то, что есть в обеих строках, а черным выделяется несовпадение.
    Как бы сделать наоборот,  а еще лучше, чтобы это было входным параметром (типа 0 или 1), на выбор оператора.
2). Во вложенном файле есть пример, где программа отловила "Н", написанные в разных кодировках.
    В строке в файле выделено "на" и "6" - тоже вопрос.    
    В других строках выделяется "мм",  тоже вопрос.  
Изменено: YGrigor18 - 21.07.2025 12:31:31
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
МатросНаЗебре, добрый день! Спасибо за вариант! Проверить смогу в понедельник, на выходных нет компа под рукой. Обязательно отпишусь!
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
Dmitriy XM, добрый день! Спасибо за вариант! Проверить смогу в понедельник, на выходных нет компа под рукой. Обязательно отпишусь!
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 
online, Добрый день! Попробовал на реальном файле, все сработало идеально! даже не знаю, что можно добавить!
И исключения в строке есть и работает в обе стороны при сравнении. Гениально!
Осталось по мелочи добавить, чисто для удобства, запрос к оператору - какие колонки нужно сравнивать, потому как они могут быть не 1 и 2,  и пожалуй все.
Огромное спасибо!!!
Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 

Вообще нужно решить как быть с регистром, пробелами и запятыми и ввести их как входные параметры в функцию или подпрограмму.
1). Чтобы можно было выбирать - учитывать регистр при сравнении или нет.
2). Учитывать наличие пробелов или нет?
Но, что имеется ввиду? Если будет написано все без пробелов, то это слишком и за это и браться не стоит - "мамамылараму"
Но если написано - "мама    мыла    раму" - то пробелы больше одного видимо не нужно учитывать и отбрасывать при сравнении.
3). По запятым - их лучше сделать входным параметров - хочешь учитывай, хочешь нет.

В приведенном коде программы идет по-позиционнное и посимвольное сравнение.
Если во второй строке поставить перед первым словом пробел, то "страдает" все сравнение...

Выделение цветом несовпадающих фрагментов строк (Excel, VBA)
 

Добрый день! Задача сравнения строк в Excel (VBA) и выделения цветом несовпадающих фрагментов строк.
Посмотрел решения и нужного как-то не нашел. В файле есть код, который ближе всего к желаемому, нашел в инете.
Например, сравниваем строки :
1) Мама мыла раму и 2) Мама намылила раму

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

Т.е находится несовпадение и выделяется строка цветом  с этого места и до конца.

И сравнение строк и выделение цветом после нахождения совпадения не до конца корректный.
Слово "рама" есть и в строке 1 и 2, его не нужно цветом выделять.

или
1) Мама мыла раму и 2) мама намылила раму - выделено цветом: "мама намылила раму"
Выделяется вся строка, так как играет роль регистр.

А если вставлять в строки пробелы или запятые, типа : мама    намылила,     раму
то результат вообще неправильный, так как идет сравнение строк по-позиционное.

Может кто видел более интеллектуальное решение?

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

Спасибо!

Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?, Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?
 
Вопрос в принципе решил, но не знаю, оптимально это или нет.
Если перед просмотром поменять размер окна, то все работает.

Application.WindowState = xlMaximized

' Предварительный просмотр листа            
'Workbooks("Книга1").Worksheets("Лист1").PrintPreview
Application.WindowState = xlNormal
Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?, Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?
 
online, Дмитрий(The_Prist) Щербаков, все получилось как нужно, но когда открыт один файл Excel!
Cпасибо! В принципе работать можно.

p.s. из непонятного остался момент, когда открыты другие файлы Excel.
В коде явно указываю, какая книга и лист активные.
При первом просмотре перед печатью Preview,  открывается окно предварительного просмотра, которое можно закрыть только нажав крест "X"  на окне (правый верхний угол). Нет реакции ни на одну кнопку к самом окне предварительного просмотра Preview.  Окно как заблокировано!
Но если нажать ту же кнопку  просмотра на форме повторно - то закрыть окно просмотра Preview можно уже и кнопкой на форме и "X".
И после повторных просмотров в окне просмотра доступны все кнопки! (параметры страницы и другие)

В чем может быть проблемка?  Ведь кнопка просмотра запускает один и тот же код.

А когда открыт один файл Excel, такой проблемы вообще нет - можно закрыть окно просмотра с первого раза и далее как угодно.
Из наблюдения - если есть открытые файлы Excel и загружаю свой файл с формой управления, то форма становится верхней и активной, а вот
лист самого файла, которому принадлежит форма может оказаться не сразу за формой, а где-то между предыдущими файлами Exceл.
Может в этом и суть, но тогда как с этим бороться?

Код
Public Sub PrintPreview()
         Application.DisplayAlerts = False
         Application.ScreenUpdating = True
         Application.Visible = True       
        Windows("Книга1.xlsm").Activate
        Workbooks("Книга1.xlsm").Sheets("Лист1").Activate

       ' Скрываем UserForm1 перед запуском предварительного просмотра
        UserForm1.Hide              

      ' Предварительный просмотр листа      
       'Workbooks("Книга1").Worksheets("Лист1").PrintPreview
                              ' или      
       Workbooks("Книга1").Worksheets("Лист1").PrintOut Copies:=1, Preview:=True      

     ' Показываем UserForm снова после закрытия окна предпросмотра         
      UserForm1.Show
End Sub
Изменено: YGrigor18 - 12.12.2024 12:22:07
Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?, Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?
 
online,  Дмитрий(The_Prist) Щербаков,  спасибо!
потестирую оба варианта, решения вполне подходят.
Изменено: YGrigor18 - 10.12.2024 16:47:26
Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?, Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?
 
online, добрый день! красивое решение.
при выполнении кода, к сожалению, ошибка на строке:
previewOpen = Application.CommandBars("Print Preview").Visible

Ругается на "Print Preview", имя не воспринимает - требует индекс. (?)
Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?, Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?
 
online, спасибо!
так собственно пробовал, но почему то не подошло.
Но сейчас думаю, что все устраивает.

Конечно,  хотелось бы понять, как перехватить событие от "х" - закрытие окна предварительного просмотра.
Но видимо это уже другая история.
 
Изменено: YGrigor18 - 09.12.2024 22:57:08
Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?, Подскажите, как можно форму предварительного просмотра листа Excel перед печатью вывести кодом VBA поверх формы UserForm1 ?
 
Добрый день, форумчане!  
В Excel  использую форму UserForm1 и кнопки управления. UserForm1 соответственно визуализируется - UserForm1.Show
Одна из кнопок запускает Sub, которая заполняет лист и запускает перед печатью предварительный просмотр
Код
Worksheets("Лист").PrintPreview

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

1. Подскажите, как можно  форму предварительного просмотра листа Excell перед печатью вывести кодом VBA поверх формы UserForm1 ?
   (Ну или - как можно UserForm1 спрятать под окно  предварительного просмотра перед печатью и потом вернуть назад?)
2. Форму предварительного просмотра можно вообще-то потом закрыть,  нажав "Х".
   А как можно перехватить событие, что окно предварительного просмотра закрыто?

Спасибо за идеи и код!  
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
online, добрый день!  все более менее заработало  как нужно, спасибо!
но столкнулся с  вопросом по теме группировки.
С группировкой по одному полю понятно как работает.
А как реализовать последовательную группировку по двум или трем полям последовательно?
сужая поиск (кол-во строк) после каждой группировки.
Т.е группировку по второму полю выполнять на данных не всего массива, а на данных полученных после первой группировки.
При этом, чтобы после допустим группировки по второму и третьему полю были доступны значения всех полей, е не только поля по которому делается группировка.


Сейчас мы группируем по одному полю по всей таблице (по всему массиву).
Используем массив, словарь и коллекцию и пишем в массив или в ComboBox.

Далее из  полученного списка в ComboBox выбираем опят таки одно значение и по нему ищем опять по всему массиву совпадение с выбранным значением.
А как сделать, чтобы искать уже не по всему массиву, а только по полученному списку после группировки по первому полю?
Изменено: YGrigor18 - 25.11.2024 18:21:16
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
online, добрый день!  сделал следующее, в Private Sub ComboBox1_Click()  и Private Sub ComboBox2_Click() - поместил код полностью аналогичный кодам
Private Sub ComboBox1_AfterUpdate()  и Private Sub ComboBox2_AfterUpdate() - соответственно.

И все работает без нажатия Enter, а поля обновляются после выбора элемента из списка, т.е по Click()

Еще сделал  UserForm1.ComboBox1.ListIndex = 0  и  UserForm1.ComboBox2.ListIndex = 0
Чтобы в списках стоял нулевой индекс и соответственно первый элемент списка.

Не знаю насколько это супер правильно.
Ну и в этих Sub объявляются одни и те же переменные. Как минимум с этим нужно посмотреть.
Вынести их в глобальные?

И  видимо если в  ComboBox1  не будет элементов, то  UserForm1.ComboBox1.ListIndex = 0   выдаст ошибку.
И аналогично, если после выбранного элемента ComboBox1, не найдется такого в ComboBox2, то
UserForm2.ComboBox2.ListIndex = 0  также даст ошибку.
Это то, что я увидел.

Можно такой подход использовать в целом?
ну с коррекциями по переменным и проверкой существовования непустого списка в ComboBox1 и ComboBox2
Изменено: YGrigor18 - 21.11.2024 13:04:31
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
online, добрый день!  
насколько понял процедуры Private Sub ComboBox1_AfterUpdate() и Private Sub ComboBox2_AfterUpdate()
нужно перенести из модуля1 в  код формы Form1, а в модуле 1 этот код удалить.
Далее в этих процедурах чуть подправил  с If array2(i, 1) = selectedGroup  на If array2(i, 2) = selectedGroup
и вроде как работает.

Сейчас это работает так:
1)  Выбираем в ComboBox1  элемент группы, например ИТ,  нажимаем Enter (без нажатия ничего не происходит)  и
    в ComboBox2  появляются номера ID, которые привязаны к ИТ.
2)  Далее переходим в ComboBox2 , выбираем нужный ID номер и опять нажимаем Enter (без нажатия ничего не происходит).
    И тогда заполняются ComboBox3, 4,5

Это почти норм, но вопрос - можно ли сделать так, чтобы обновлялись поля не по Enter, а чтобы каждый раз выбирая из списка элемент группы
(ComboBox1 ) - сразу без Enter заполнялось поле ID (ComboBox2)  ?
А выбирая в (ComboBox2)  определенный ID  - без нажатия Enter заполнялись ComboBox3, 4,5

Предположу, что можно для этого задействовать:
Private Sub ComboBox1_CLick()  и Private Sub ComboBox2_CLick()   ' ?
или может быть
Private Sub ComboBox1_Change()  и Private Sub ComboBox2_Change()  ' ?

Подскажите, плз, как это принято обычно делать.
Спасибо!
Изменено: YGrigor18 - 19.11.2024 15:46:33
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
online, добрый день! поднастроил совсем немного под поля формы.
Работает в некоторыми оговорками.
По идее - выбирается элемент в ComboBox1 - из списка и в ComboBox2  вычисляется и формируется список ID.
Это и происходит. Но если выбрать другой элемент ComboBox1,  на ComboBox2  он лайн изменения нет, пока не откроешь его список.

Далее выбираем ID из списка в ComboBox2 и ничего на форме не происходит.
Все вычисляется - ComboBox3 ComboBox4  ComboBox5 , но чтобы обновилась форма (поля формы) нужно перейти на ComboBox3.

- посмотрите плз код, почему нет визуального он-лайн изменения данных.
- и концептуально используется Коллекция. А можно было это сделать на функционале Словаря, там ведь как и в Коллекции значение - ключ?
- я попробовал также использовать Filter, но пока не сделал
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
online,  добрый день!  ранее не работал с коллекциями, но в целом разобрался и адаптирую код под форму.
пока, что то не так отрабатывает, и похоже нормально на выхи смогу заняться и написать, сейчас в командировке,
спасибо за помощь
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
забыл файл вложить
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
online, добрый день! адаптировал код под свой тестовый пример.
Можно спросить концептуально по какому пути пойти далее?
В присоединенном файле, на форму в тестовом примере, вывел в списки ComboBox нужные поля.
Может конечно можно более сжато это сделать, но не факт.
Далее хочу сделать следующее:
1. при выборе любого значения из списка ID,  а это поле уникальное, чтобы в остальные поля подставлялись соответствующие значения из нужной строки, т.е из массива array2.
Как это сделать алгоритмически представляю. В разделе AfterUpdate поместить код: чтения UserForm1.ComboBox2.Value и искать в массиве array2 такое значение и найдя вычислить индекс и по нему уже проставить данные в другие поля ComboBox-ов.
Хотя можно и сразу, вычислять индекс элемента списка ComboBox2 на котором стоит курсор.
Код
Dim J As Integer, st As String
 J = ComboBox2.ListIndex
 If J >= 0 Then st = ComboBox2.List(J)
Это примерно правильно мыслю?

2.  далее хочу попробовать сделать выбор нужных данных по фильтрации полей Вид деятельности - Специальность -Город
    Чтобы выбирая Вид деятельности, в списках полей  - Специальность -Город  сразу пересчитывались данные  и в них оставались для выбора только данные для  выбранной Специальности.
И соответственно, если далее выбрать далее Специальность, то список поля Город также автоматически пересчитывался.
ФИО, это скорее инфо поле, оно просто покажется в итоге, когда будет выбрана позиция.

Как такое реализовать в принципе, концептуально?

На ADO по идее это вложенные SELECT c соответствующими WHERE.
Предположу, что можно использовать команду FILTER и полученные массивы на выходе прописывать в ComboBox-ы
Изменено: YGrigor18 - 08.11.2024 18:21:00
Подскажите по синтаксису строк соединения c файлом Excel в ADO
 
online, огромное спасибо! изучаю, пробую и адаптирую код под свою форму и т.д., все сложнее, чем думал по сравнению с sql запросом :)  
Страницы: 1 2 3 След.
Наверх