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

Страницы: 1
Преобразование формулы СЧЁТЕСЛИ, находящей дубли, в макрос, Формула ищет дубли в столбце, но когда много ячеек работает очень долго, макрос ускорит процесс
 
Здравствуйте. Есть формула
Код
=СЧЁТЕСЛИ(A:A;A2)>1

она ищет дубли в столбце А:А, если значение в ячейке имеет дубликат то формула пишет в столбце В:В ИСТИНА, а если значение в ячейке уникальное то ЛОЖЬ.
Формула хорошо работает когда ячеек для проверки несколько тысяч, но с десятками тысяч уже замедляется, а с сотнями считает часами.

Вопрос: можно ли преобразовать эту формулу в макрос, который будет искать в выделенном диапазоне дубли, и если дубли найдены писать слово дубль правее (например дубли ищут в столбце А:А, а если они есть то пишет слово дубль в столбец В:В).
Нужно чтобы слово дубль писалось рядом с каждым значением у которого есть дубль, т.е одинаковые значения в ячейках А3 и А15 и машина пропишет слово дубль правее обоих этих ячеек в В3 и В15
В файле примере для наглядности выделил дубли цветом.
Модификация макроса для массового поиска дублей, Макрос выделяет найденные дубли цветом, а нужно добавить чтоб ещё выделял словом справа от столбца.
 
Здравствуйте. bedvit, в теме https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=82834 написал отличный макрос для быстрого поиска дублей в больших массивах данных и выделения их цветом.
Код
Option Explicit'Автор Б. Виталий В. (bedvit)
'Макрос записан: 21/10/2016
'Редакция: 6 от 26/02/2020
'Действие: выделение разными цветами дубликатов в выделенных диапазонах
Sub select_replica() 'рабочий
Dim R As Range, Rf As Range, Rc As Range, i As Long, s(3) As Long, ac, t, x, cell
Dim Dict: Set Dict = CreateObject("Scripting.Dictionary")
Dim DictColor: Set DictColor = CreateObject("Scripting.Dictionary")
t = Timer
 
On Error Resume Next
If Selection.CountLarge = 1 Then
    Set Rf = ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas, 23)
    Set Rc = ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, 23)
Else
    Set Rf = Intersect(ActiveSheet.UsedRange, Selection).SpecialCells(xlCellTypeFormulas, 23)
    Set Rc = Intersect(ActiveSheet.UsedRange, Selection).SpecialCells(xlCellTypeConstants, 23)
End If
On Error GoTo 0
 
With Application: .ScreenUpdating = 0: .DisplayAlerts = 0: .EnableEvents = 0: ac = .Calculation: .Calculation = -4135: .StatusBar = "BE: обработка данных...": End With
Set R = Rf: GoSub Go_
Set R = Rc: GoSub Go_
With Application: .ScreenUpdating = 1: .DisplayAlerts = 1: .EnableEvents = 1: .Calculation = ac: .StatusBar = False: End With
Debug.Print "select_replica = " & Timer - t
MsgBox "Выделено разных групп дубликатов (разными цветами): " & i, vbInformation
Exit Sub
     
Go_:
If Not R Is Nothing Then
    R.Interior.Pattern = Empty
    For Each cell In R.Cells
        If Dict.Exists(cell.Value) Then
            x = Dict.Item(cell.Value)
            If x(3) = 1 Then
                i = i + 1
                x(2) = 6740479
            cell.Interior.Color = x(2)
        Else
            s(0) = cell.Row
            s(1) = cell.Column
            s(3) = 1
            Dict.Add cell.Value, s
        End If
    Next
End If
Return
End Sub
 
Function Generate_nice_color() As Long
Dim R As Long, G As Long, B As Long
Do
    Randomize
    R = Int(Rnd * 256)
    G = Int(Rnd * 256)
    B = Int(Rnd * 256)
Loop Until R + G + B > 500 And R + G + B < 700
Generate_nice_color = RGB(R, G, B)
End Function

Иногда при сравнении больших массивов, на сотни тысяч ячеек, может быть всего несколько дублей, и их не получается найти через стандартный фильтр эксель.
Вопрос можно ли усовершенствовать макрос так чтобы, он после поиска дублей, правее сравниваемого столбца, напротив ячейки с залитым цветом дублем, писал слово дубль.
Пример ищем дубли в столбце В:В, макрос их нашёл и в столбце С:С напротив дублей написал слово Дубль.
Изменено: zvolkz - 21.06.2022 14:52:04
Усовершенствование формулы сравнивающей даты, Есть две формулы сравнивающие даты, но они работают с погрешностью
 
Здравствуйте. Я придумал 2 формулы сравнивающие множество дат, на предмет чтобы дата в столбце К:К была самой младшей т.е обязательно должна быть меньше или равна датам в соседних столбцах, а если те даты в соседних столбцах меньше, то это ошибка.
Код
=ЕСЛИМН(ДЛСТР(M2)>0;K2<=M2;ДЛСТР(O2)>0;K2<=O2;ДЛСТР(Q2)>0;K2<=Q2;ДЛСТР(S2)>0;K2<=S2;ДЛСТР(U2)>0;K2<=U2;ДЛСТР(W2)>0;K2<=W2;ДЛСТР(Y2)>0;K2<=Y2;ДЛСТР(AA2)>0;K2<=AA2;ДЛСТР(AC2)>0;K2<=AC2;ДЛСТР(AE2)>0;K2<=AE2;ДЛСТР(AG2)>0;K2<=AG2;ДЛСТР(AI2)>0;K2<=AI2;ДЛСТР(AK2)>0;K2<=AK2;ДЛСТР(AM2)>0;K2<=AM2;ДЛСТР(AO2)>0;K2<=AO2;ДЛСТР(AQ2)>0;K2<=AQ2;ДЛСТР(AS2)>0;K2<=AS2)
Эта формула работает, если даты идут в неверном порядке то пишет ЛОЖЬ, если дата есть только в столбце К:К то пишет Н/Д, если всё норм то ИСТИНА, но при работе была обнаружена погрешность формулы. Формула может вывести ИСТИНА в случае если не все даты идут в верном порядке т.е когда внутри формулы есть значения ЛОЖЬ и ИСТИНА, формула может поставить ИСТИНУ.
Чтобы это преодолеть я сделал другую формулу:
Код
 =ЕСЛИ(ИЛИ(ДЛСТР(M2)>0;ДЛСТР(O2)>0;ДЛСТР(Q2)>0;ДЛСТР(S2)>0;ДЛСТР(U2)>0;ДЛСТР(W2)>0;ДЛСТР(Y2)>0;ДЛСТР(AA2)>0;ДЛСТР(AC2)>0;ДЛСТР(AE2)>0;ДЛСТР(AG2)>0;ДЛСТР(AI2)>0;ДЛСТР(AK2)>0;ДЛСТР(AM2)>0;ДЛСТР(AO2)>0;ДЛСТР(AQ2)>0;ДЛСТР(AS2)>0);И(K2<=M2;K2<=O2;K2<=Q2;K2<=S2;K2<=U2;K2<=W2;K2<=Y2;K2<=AA2;K2<=AC2;K2<=AE2;K2<=AG2;K2<=AI2;K2<=AK2;K2<=AM2;K2<=AO2;K2<=AQ2;K2<=AS2))
Но, она тоже работает с погрешностью, так если дата в К:К меньше или равно М:М, а в следующих столбцах пусто, то формула всё равно выводит ЛОЖЬ.

Подскажите можно ли преодолеть эти погрешности в формулах? или нужна новая формула?  
Макрос копирующий данные на новые листы по условию
 
Здравствуйте.
Задача: в общей таблице на листе '1'! есть данные по множеству подразделений, наименование подразделений в столбце G:G. Нужно чтобы макрос в этой же или новой книге (как удобней и проще реализовать) скопировал на новые листы данные столбцов F:F, G:G, H:H, I:I, по условию - наименованию подразделения из столбца G:G.
Как будто, ты в ручную выбрал через фильтр подразделение в столбце G:G, и сам скопировал эти 4 столбца на новый лист.  
Может быть это можно реализовать через отдельный лист справочник, или машина сама отличит уникальные значения в столбце G:G.
Макрос заливающий ячейку красным цветом по условию
 
Здравствуйте. Есть формула, она нужна для проверки нумерации, если первое число не равно 1 (ноля не может быть), то формула пишет Аларм, а потом я в ручную заливаю ячейку красным цветом. Если равно 1 то ничего не пишет, и ни какой заливки не нужно.
Код
=ЕСЛИ($B$2<>1;"Аларм";"")
Вопрос: можно ли из этой формулы сделать макрос, который будет сам заливать ячейку красным, если число в $B$2 не равно 1, чтоб макрос срабатывал на активном листе. Сама формула находиться в ячейке G1 и там же макрос выводил бы Аларм
Объединение двух макросов в одном.
 
Здравствуйте. Ігор Гончаренко в теме https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=145156&... и New  в теме https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=145230&... написали отличные макросы для сравнения данных - двух столбцов.
Макрос Игоря сравнивает один столбец в выделенным диапазоном и в случае совпадения пишет слово ОК. Макрос New тоже сравнивает столбцы между собой, но в случае совпадения располагает совпавшие данные правее таблицы т.е располагает соосно, что очень удобно когда нужно сравнить большее количество данных. Макрос Игоря сравнивает ячейки практически мгновенно, сотни тысяч меньше чем за 1 мин. Макрос New для сравнения требует больше времени, на большом количестве ячеек значительно.

Макрос Игоря
Код
Sub Find_Matches()
  Dim a, b, d, r&, tm
  tm = Timer
  a = Range([m2], Cells(Rows.Count, 13).End(xlUp))
  Set d = CreateObject("Scripting.Dictionary")
  For r = 1 To UBound(a): d(a(r, 1)) = 1: Next
  a = Selection: ReDim b(1 To UBound(a), 1 To 1)
  For r = 1 To UBound(a)
    If d.exists(a(r, 1)) Then b(r, 1) = "ok"
  Next
  Selection.Offset(0, 1) = b
  MsgBox Timer - tm
End Sub
Макрос Макрос New
Код
Sub Test()
    Dim arrNoNCD, arrData, arrOut, LastRow As Long, iRow As Long, i As Long, iCol As Long
       
    With ActiveSheet
        If .FilterMode Then .ShowAllData
        LastRow = .Cells(.Rows.Count, "G").End(xlUp).Row
        arrNoNCD = .Range("G2:G" & LastRow).Value
        LastRow = .Cells(.Rows.Count, "AD").End(xlUp).Row
        arrData = .Range("AD2:AY" & LastRow).Value
    End With
       
    ReDim arrOut(1 To UBound(arrNoNCD), 1 To UBound(arrData, 2))
    For iRow = 1 To UBound(arrNoNCD)
        For i = 1 To UBound(arrData)
            If arrData(i, 1) = arrNoNCD(iRow, 1) Then
                For iCol = 1 To UBound(arrData, 2)
                    arrOut(iRow, iCol) = arrData(i, iCol)
                Next iCol
            End If
        Next i
    Next iRow
       
    Range("BA2").Resize(UBound(arrOut, 1), UBound(arrOut, 2)).Value = arrOut
    MsgBox "Данные выведены в столбец BA", vbInformation, "Конец"
End Sub

Вопрос - можно ли совместить эти макросы в одном? Например чтобы в начале столбцы сравнивались макросом Игоря, машина бы прописывала ОК, а дальше уже макрос New правее таблицы выводил совпавшую инфу, или не писал ОК если машине может вести расчёт без этой визуализации совпадения.  
Расшифровка синтаксиса функции ПРОСМОТР
 
Уважаемый Николай Павлов написал отличную формулу в теме по адресу https://www.planetaexcel.ru/techniques/2/106/
Код
=ПРОСМОТР(2^15;ПОИСК(F$2:F$4;A2);G$2:G$4)
Объясните пожалуйста, что означает 2^15 и для чего это нужно. Когда открываешь функцию это искомое значение и оно равно 32768
Изменено: zvolkz - 29.03.2022 15:11:07
Сравнение нескольких столбцов с датами с помощью формулы
 
Здравствуйте. Есть таблица в ней столбцы с датами начиная со столбца К:К и далее. Все даты идут через один столбец с решением, например после К:К дата будет в М:М, потом в О:О и т.д. При верном заполнении таблицы все даты увеличиваются слева на право т.е в столбе К:К самая ранняя дата, а в столбце АЕ:АЕ самая поздняя. Может быть когда в одной строке всего два столбца с датами, а в другой строке 11 столбцов с датами, в файле примере это наглядно видно.
Но бывает так что таблицу заполняют в обратном порядке справа на лево - когда дата в столбце К:К может быть может быть меньше чем в более правом столбце. Или когда в заполняют слева на право, но одном из столбцов ошибаются и вводят более раннюю дату чем в столбце К:К.
Правильный вариант когда дата в столбце К:К всегда старше (прим 01.01.2021) всех дат правее столбца К:К ( 10.02.2021, 20.09.2021 и т.д).
Вопрос как написать формулу которая будет последовательно сравнивать даты в столбцах начиная с К:К и далее?

Я сам придумал два варианта формулы которые бы ещё отсеивали пустые ячейки без дат, но я думаю что можно лучше.
Код
=ЕСЛИМН(И(K4<M4;M4=" <>");"";И(K4<O4;O4<>" ");"";И(K4<Q4;Q4<>" ");"";И(K4<S4;S4<>" ");"";И(K4<U4;U4<>" ");"";И(K4<W4;W4<>" ");"";И(K4<Y4;Y4<>" ");"";И(K4<AA4;AA4<>" ");"";И(K4<AC4;AC4<>" ");"";И(K4<AE4;AE4<>" ");"")
Код
=ЕСЛИМН(M4<>" ";K4<M4;O4<>" ";K4<O4;Q4<>" ";K4<Q4;S4<>" ";K4<S4;U4<>" ";K4<U4;W4<>" ";K4<W4;Y4<>" ";K4<Y4;AA4<>" ";K4<AA4;AC4<>" ";K4<AC4;AE4<>" ";K4<AE4)
Я знаю что можно написать 10-20 формул РАЗНДАТ правее таблицы и сравнить столбец К:К с каждой последующей датой, но каждая формула увеличивает размер файла и замедляет расчёт. Хотелось если возможно всё сделать "одним движением"
К сведению - в примере два листа 1) оригинал там так таблица выгружает и даты в ней представлены как значения 2) значения преобразованы в даты с помощью специальной вставки 0 (как значения, операция сложить) с последующим изменением формата на дату.  
Создание макроса для массового сцепления значений ячеек по горизонтали.
 
Здравствуйте. Есть большая таблица в которой нужно сцепить через знак \ больше сотни столбцов по очереди,  и строк около 80 - 90 тыс, и со временем таблица пополняется и увеличивается и в ширину (вправо), и в длину(вниз), это в реальной таблице. В прикреплённом файле данных меньше.

Что нужно сделать:
есть столбцы с C до Z, их нужно по очереди сцепить со столбцами A, B, AA, AB, AC по очереди через знак \ как это делает формула
Код
=СЦЕП($A2;"\";$B2;"\";C2;"\";$AA2;"\";$AB2;"\";$AC2)
то есть именно в таком порядке, и так нужно сцеплять столбец C до последнего заполненного значения, потом D, E и до Z , в файле примере это сделано формулами.
В столбцах с C до Z могут быть пустые ячейки, макрос должен их пропускать и искать следующую заполненную ячейку, например М2 заполнено, а М3 пусто, макрос пропускает ячейки в М:М пока не найдёт следующую заполненную.
После того как макрос сцепил все ячейки, он располагает сцепленные данные ниже обработанной таблицы, или правее, или вообще на другом листе, не знаю что проще реализовать при написании кода, главное чтоб сцепленные данные не перемешались с самой таблицей.

Так как диапазон данных "плавающий" то если возможно, в макросе надо сделать возможность менять столбцы которые нужно сцеплять. Например диапазон с C2:Z, заменить на I2:DM, так же как и A2 заменить на C2, а B2 на D2 и т.д

Прикладываю файл пример, где есть сама таблица и пример того что и как должен делать макрос (сделано с помощью функции СЦЕП)
Сравнение диапазонов значений при наличии пустых ячеек
 
Здравствуйте у меня есть формула сравнивающая диапазоны в таблице =ЕСЛИ((СЧЁТ(ЕСЛИОШИБКА(ПОИСКПОЗ(T2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(U2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(V2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(W2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(X2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(Y2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(Z2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(AA2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(AB2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(AC2;$AV2:$BB2;0);"");ЕСЛИОШИБКА(ПОИСКПОЗ(AD2;$AV2:$BB2;0);"")))=(СЧЁТЕСЛИ(T2:AD2;">0"));"совпало";"не равно")

Она нормально работает, но оказалось, что если в диапазоне T2:AD2 ячейки пустые, а в диапазоне AV2:BB2 есть заполненные ячейки, но после расчёта формула всё равно выдает результат "совпало".
Вопрос можно как то усовершенствовать формулу чтобы машина видела и эти не совпадения, когда в T2:AD2 пусто, а в AV2:BB2 не пусто.  
Возможно ли создать пользовательскую функцию на основе ЕСЛИМН с использованием подстановочного знака *
 
Возможно ли создать пользовательскую функцию на основе функции ЕСЛИМН, чтобы функция могла использовать подстановочные знаки * и ?.
У меня в ячейке логической проверки значение больше 255 символов, а если бы было можно использовать знак * то я бы выбрал ключевое слово и функция бы всё просчитала.  
Возможно ли усовершенствовать макрос выравнивающий (сортирующий) совпадения в двух столбцах
 
Здравствуйте. Я нашёл в сети макрос который как я понял способен расположить соосносто найденные совпадения в двух столбцах на одном листе.
Вопрос судя по коду он написан под совпадения которые начинаются с Букв, а можно ли изменить это на цифры.

Я столбец Z1:Z100 (примет тренировочный) сравниваю с помощью формулы массива =ЕСЛИ(ЕНД(ПОИСКПОЗ(ИСТИНА;СОВПАД($AM$2:$AM$100;Z2);0));"нет";"есть") (столбец AL) со столбцом AM1:AM100. Машина находит совпадения, только самих номеров из столбцов Z и AM, номера в обоих столбцах располагаются не по порядку, правее них есть AN по AU. Вопрос можно ли заставить макрос (или сделать это с помощью формулы) что бы если номер из столбца Z1:Z100 совпадает с номером из столбца AM1:AM100, то машина напротив (правее) совпавшего номера из столбца Z1:Z100 выводила бы совпавший номер из столбца AM1:AM100 и данные из столбцов AN по AU в том числе и пустые.
Может быть нужно располагать данные на разных листах или наоборот чтоб машина "сшивала" данные на новом листе, или вообзе это можно хитро сделать с помощью ВПР.
Прошу вашего совета, пример прилагаю.
Код найденного макроса
Код
Sub Listduplicates()
'Updateby Extendoffice 20160613
    Dim rngA As Range
    Set rngA = Range([E1], Cells(Rows.Count, "E").End(xlUp))
    rngA.Offset(0, 1).Columns.Insert
    With rngA.Offset(0, 1)
        .FormulaR1C1 = _
        "=IF(ISNA(MATCH(RC[-1],C[1],0)),"""",INDEX(C[1],MATCH(RC[-1],C[1],0)))"
        .Value = .Value
    End With
End Sub
Модификация макроса для сравнения двух столбцов
 
Здравствуйте! Подскажите пожалуйста есть ли способы ускорить работу этого макроса или это бессмысленно и нужно писать другой код.
При сравнение сотней тысяч заполненных ячеек (около 500 000, в будущем массив данных будет расти и до 800 000, 900 000) при запуске макроса Эксель намертво зависает.
Прикладываю файл с примером, все иные столбцы очищены, остались только номера, и формулы которые их преобразовывают для сравнения.
В примере столбы расположены так, насколько я знаю можно сделать так чтоб макрос работал в выделенном курсором диапазоне.
Код
Sub Find_Matches()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim CompareRange As Variant, x As Variant, y As Variant
' Установка переменной CompareRangeравной сравниваемому диапазону
Set CompareRange = Range("M2:M100")
' Если сравниваемый диапазон находится на другом листе или книге,
' используйте следующий синтаксис
' Set CompareRange = Workbooks("Книга2"). _
'   Worksheets("Лист2").Range("B1:B11")
'
' Сравнение каждого элемента в выделенном диапазоне с каждым элементом
' переменной CompareRange
For Each x In Selection
For Each y In CompareRange
If x = y Then x.Offset(0, 2) = x
Next y
Next x
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Страницы: 1
Наверх