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

Страницы: 1
Удаление дубликатов Collection vs. Dictionary
 
Всем привет!

Скачал отсюда файл с макросами от ZVI, где Dictionary значительно превосходит Collection в скорости при удалении дублей в столбце с 60 000 ячеек.
Создал список из 600 000 ячеек с 500 000 уникальных текстовых значений, загрузил их в массив и обработал двумя способами:

CollectionUniq start:   600000 27.11.2017 1:04:10
CollectionUniq end:    500000 27.11.2017 1:04:44

Collection - 34 секунды

DictionaryUniq start:   600000 27.11.2017 1:04:44
DictionaryUniq end:    500000 27.11.2017 1:07:52

Dictionary - 3 минуты и 8 секунд

Подскажите, пожалуйста, в чем причина того, что Dictionary в моем случае работает медленнее.

Код:
Код
Option Explicit
Sub MegaArray()
    Dim Base() As Variant, Base2() As Variant
    Dim TimeS As Variant, TimeE As Variant
    Base = ActiveSheet.Cells(1, 1).Resize(600000, 1).Value
    Base2 = Base
    TimeS = Time
    Debug.Print "CollectionUniq start:   " & UBound(Base) & " " & Date & " " & TimeS
    CollectionUniq Base
    TimeE = Time
    Debug.Print "CollectionUniq end: " & UBound(Base) + 1 & " " & Date & " " & TimeE
    TimeS = Time
    Debug.Print "DictionaryUniq start:   " & UBound(Base2) & " " & Date & " " & TimeS
    DictionaryUniq Base2
    TimeE = Time
    Debug.Print "DictionaryUniq end: " & UBound(Base2) + 1 & " " & Date & " " & TimeE
    
End Sub
Public Sub CollectionUniq(ByRef StringArray() As Variant)
  Dim x, y, arr, i As Long
  
  ReDim arr(LBound(StringArray) To UBound(StringArray))
  arr = StringArray
  If IsArray(arr) Then
    ReDim y(0 To UBound(arr))
    With New Collection
      On Error Resume Next
      For Each x In arr
        If Len(x) > 0 Then
          Err.Clear
          .Add 0, CStr(x)
          If Err = 0 Then
            y(i) = x
            i = i + 1
          End If
        End If
      Next
    End With
  End If
  
  If y(i) = Empty Then
  ReDim Preserve y(0 To i - 1)
  End If
StringArray = y
End Sub
Public Sub DictionaryUniq(ByRef StringArray() As Variant)
  Dim x, arr, y, i As Long
  Dim Uniq_1D_Array() As Variant
  ReDim arr(LBound(StringArray) To UBound(StringArray))
  arr = StringArray
  
  If IsArray(arr) Then
    'With CreateObject("Scripting.Dictionary") ' Позднее связывание
    With New Dictionary ' Раннее связывание, нужен Reference на MS Scripting Runtime
      .CompareMode = vbTextCompare
      ReDim y(0 To UBound(arr))
      For Each x In arr
        If Len(x) > 0 Then
          If Not .Exists(x) Then
            .Add x, 0
            i = i + 1
            y(i) = x
          End If
        End If
      Next
      Uniq_1D_Array = .Keys  ' так можно получить сразу весь массив уникальных
    End With
  End If
  
StringArray = Uniq_1D_Array
End Sub

Изменено: AB1 - 27.11.2017 01:24:18
Групповое суммирование для одного из членов группы
 
Всем привет!

Столкнулся с такой задачей.
В первом листе ("results") есть два столбца с исходными данными: A - с названиями, B - с числовыми значениями.
Во втором листе ("base") размещена таблица с горизонтально сгруппированными названиями.
В столбце D на листе "results" даны названия, для которых необходимо вывести сумму в столбце E, посчитанную в столбце B, на основе принадлежности к одной из групп на листе "base".
Для определения группы нужно найти номер строки на листе "base" и, затем, посчитать сумму для всех значений в этой строке.
Файл и скриншоты прилагаются.
Заранее благодарен за любую помощь!

Лист "results":

Лист "base":

Схема
Применение регулярных выражений (VBA) для поиска вхождений одного текста в другом
 
Приветствую!

Не в первый раз сталкиваюсь с подобной проблемой, но никак не могу добавить регулярку в свой макрос.
Пример подходящего кода от heso.
Что касается макроса, то речь идет о выдаче значения "NF" (в ячейке I6), если искомый текст является частью просматриваемого, в случае если левый и/или правый символы (от вхождения искомого текста в просматриваемом) содержат либо буквы, либо цифры.
Решил задачу Excel-формулами (в ячейке H6), но получилось длинновато.
Заранее спасибо!
[ Закрыто] Использование значений функции ВПР в качестве исходного текста функции НАЙТИ, Проблема при сборе одной функции из четырех
 
Добрый день!

Возникла следующая проблема.
Пытаюсь собрать все функции из диапазона C4:F4 в одну путем добавления функций из диапазона D4:F4 в C4.
После замены F4, используемого в функции НАЙТИ в качестве исходного текста, в ячейке C4 на функцию из ячейки F4:
Код
(ВПР(types_names!$B4;types_names!$A:$D;4;0))

результат работы функции в ячейке C4 изменяется.

Заранее признателен всем, кто найдет возможность помочь!

[ Закрыто] Удаление дубликатов, полученных из внешних книг
 
Добрый день, друзья!

С вашей помощью получил следующий макрос:
Код
Sub TownOpen()
Dim i As Long
Dim j As Long
Dim k As Integer
Dim l As Long
Dim iLastRow As Long
Dim FoundCell As Range
Dim FAdr As String
Dim a(), z As Long, ii As Long, x As Byte, tmp As String
Set sh = Workbooks("open_file.xlsm").Worksheets("one")
    iLastRow = sh.Cells(Rows.Count, "A").End(xlUp).Row
 folder = Workbooks("open_file.xlsm").Worksheets("two").Cells(1, 1)
 fway = Dir(folder + "*.xls*")
 While fway <> ""
 Workbooks.Open(Filename:=folder + fway).RunAutoMacros Which:= _
  xlAutoOpen
With ActiveWorkbook.Sheets(1)
  For i = 1 To iLastRow
    Set FoundCell = .Columns(3).Find(sh.Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
       FAdr = FoundCell.Address
        n = 1
      Do
      j = j + 1
        Workbooks("open_file.xlsm").Worksheets("three").Cells(j, n) = sh.Cells(i, "A")
        Workbooks("open_file.xlsm").Worksheets("three").Cells(j, n + 1) = Cells(FoundCell.Row, "B")
        Set FoundCell = .Columns(3).FindNext(FoundCell)
      Loop While FoundCell.Address <> FAdr
     End If
     Next
 End With
 ActiveWorkbook.Close
 
   a = Workbooks("open_file.xlsm").Worksheets("three").[a1].CurrentRegion.Value
   ReDim b(1 To UBound(a), 1 To 2)
   With CreateObject("Scripting.Dictionary")
   
        For z = 1 To UBound(a)
           tmp = a(z, 1) & "|" & a(z, 2)
           If Not .exists(tmp) Then
               .Item(tmp) = vbNullString
               ii = ii + 1
               For x = 1 To 2: b(ii, x) = a(z, x): Next
           End If
       Next
   End With
  
   Workbooks("open_file.xlsm").Worksheets("three").[a1].Resize(ii, 2) = b
 fway = Dir()
 Wend
 
End Sub

Он последовательно считывает XLS*-файлы из указанной папки, получая информацию из двух столбцов (путем сравнения значений из предварительно открытого списка).
После обработки информации из каждого файла, дубликаты значений в двух столбцах должны удаляться (столбец 1 & столбец 2).
С удалением дубликатов пока не все гладко)
При обработке третьего файла, выдается следующая ошибка:


При нажатии на "Debug", подсвечивается строка:
Код
a = Workbooks("open_file.xlsm").Worksheets("three").[a1].CurrentRegion.Value
Кроме этого, данные, полученные после удаления дубликатов, располагаются не с первой строки:



Надеюсь на вашу помощь!
Заранее благодарю.
Обработка информации из внешней книги (VBA)
 
Добрый день!

Пытаюсь получить информацию из внешней книги.
Макрос из open_file.xlsm открывает файл cities.xlsx, но информацию из него не обрабатывает.
Помогите, пожалуйста!

Код макроса:
Код
Sub TownOpen()
Dim i As Long
Dim iLastRow As Long
Dim n As Integer
Dim FoundCell As Range
Dim FAdr As String
    iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Range("B2:I" & iLastRow).ClearContents
    FilePath = Sheets("Лист2").Cells(1, 1)
    Workbooks.Open Filename:=FilePath
 With Workbooks("cities.xlsx").Worksheets("cities")
  For i = 2 To iLastRow
    Set FoundCell = .Columns(3).Find(Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
       FAdr = FoundCell.Address
        n = 2
      Do
        Cells(i, n) = Cells(i, "A")
        Cells(i, n + 1) = .Cells(FoundCell.Row, "B")
        Set FoundCell = .Columns(3).FindNext(FoundCell)
        n = n + 2
      Loop While FoundCell.Address <> FAdr
     End If
     Next
 End With
End Sub

Скорее всего проблема в обращении к листу во внешней книге:
Код
 With Workbooks("cities.xlsx").Worksheets("cities")
Объединение двух циклов по выводу значений из двух столбцов в один (VBA)
 
Здравствуйте!

Подскажите, пожалуйста, как объединить два цикла в один.
Заранее благодарен.

Первый:
Код
With Worksheets("source")
 
  For i = 2 To iLastRow
    Set FoundCell = .Columns(1).Find(Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
      FAdr = FoundCell.Address
        n = 2
      Do
       Cells(i, n + 1) = .Cells(FoundCell.Row, "B")
       Set FoundCell = .Columns(1).FindNext(FoundCell)
       n = n + 2
       
       Loop While FoundCell.Address <> FAdr
       End If
     Next
 End With

Второй:
Код
  With Worksheets("source")
  
  For i = 2 To iLastRow
    Set FoundCell = .Columns(1).Find(Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
      FAdr = FoundCell.Address
        n = 2
      Do
       Cells(i, n) = .Cells(FoundCell.Row, "A")
       Set FoundCell = .Columns(1).FindNext(FoundCell)
       n = n + 2
        Loop While FoundCell.Address <> FAdr
       End If
  Next
 End With


Макрос целиком:

Код
Sub Town()
Dim i As Long
Dim iLastRow As Long
Dim n As Integer
Dim FoundCell As Range
Dim FAdr As String
   iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
   Range("B2:I" & iLastRow).ClearContents
   
 With Worksheets("source")
 
  For i = 2 To iLastRow
    Set FoundCell = .Columns(1).Find(Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
      FAdr = FoundCell.Address
        n = 2
      Do
       Cells(i, n + 1) = .Cells(FoundCell.Row, "B")
       Set FoundCell = .Columns(1).FindNext(FoundCell)
       n = n + 2
       
       Loop While FoundCell.Address <> FAdr
       End If
     Next
 End With
 
  With Worksheets("source")
  
  For i = 2 To iLastRow
    Set FoundCell = .Columns(1).Find(Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
      FAdr = FoundCell.Address
        n = 2
      Do
       Cells(i, n) = .Cells(FoundCell.Row, "A")
       Set FoundCell = .Columns(1).FindNext(FoundCell)
       n = n + 2
        Loop While FoundCell.Address <> FAdr
       End If
  Next
 End With
 
End Sub

Добавление комментариев к пользовательским функциям (UDF)
 
Добрый день!

Подскажите, пожалуйста, есть ли возможность добавлять подобные комментарии (описание) к пользовательским функциям?



Спасибо.
Изменено: AB1 - 22.06.2017 17:50:51
Перевод совпадающих значений в горизонтальную плоскость
 
Добрый вечер!

Подскажите, пожалуйста, каким образом возможно поочередно вывести совпадающие значения?



В исходном списке сортировки по алфавиту (по первому столбцу) может и не быть.
Заранее благодарю за любую помощь.
Построение динамического графика
 
Решил попробовать создать динамический график вместо обычного.
Столкнулся с двумя проблемами:
1. Даты на шкале выводятся числовыми значениями;
2. Информация из второй строки не используется.

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

Помогите, пожалуйста, разобраться!
Не считает "СЧЁТЕСЛИ"
 
Здравствуйте, друзья!

Хочу сосчитать значения менее 56, но не получается :)
Код
=СЧЁТЕСЛИ(A$1:A$100;"<56")
Подскажите, пожалуйста, в чем проблема?
Файл с примером прикрепил.
Удаление дубликатов (50 млн. строк, VBA)
 
Здравствуйте!

Подскажите, пожалуйста, возможно ли при помощи VBA обработать 50 миллионов строк (удалить дубликаты)?
Источник: текстовый файл (с одним столбцом, без разделителей).
Результат: список уникальных строк в Excel (менее одного миллиона), на одном листе.
Спасибо.
Извлечение текстовых значений по четырем критериям
 
Добрый день!

Подскажите, пожалуйста, как изменить функцию, чтобы она стала работать с текстовыми значениями (диапазон $B$4:$G$9):
Код
=СУММПРОИЗВ(($A$4:$A$9=$A10)*($B$1:$G$1=B$10)*($B$2:$G$2=С$10)*($B$3:$G$3=D$10)*$B$4:$G$9))

Пример во вложении.
Спасибо.
Подстановка значений ячеек в ссылку на лист
 
Добрый день!

Допустим, есть два листа ("sum" - первый, "10.05.2017_SONY" - второй).
В первом листе есть ячейка A1 = "10.05.2017" и ячейка A2 = "SONY".
В ячейку A3 первого листа нужно вставить значение из ячейки во втором:
Код
='10.05.2017_SONY'!A1
Возможно ли подставить значения ячеек A1 и A2 в ссылку на лист?

Пример:
Код
='A1&"_"&A2'!A1
Заранее благодарю за помощь!
Вставка данных из CSV-файлов в разные листы по нескольким условиям (VBA)
 
Здравствуйте!

Как при помощи макроса загрузить данные из CSV-файлов по 4-м условиям в разные листы?

Условие 1 - Наименование товара
Условие 2 - Страна
Условие 3 - Дата
Условие 3 - Вид оплаты (нал / безнал)

Количество столбцов с данными будет увеличиваться: два столбца на страну для определенной даты.
Количество строк в каждом листе Excel-файла не более 200.
Наименования товаров могут совпадать в разных листах.

Заранее благодарен за любую помощь!

Примеры отчета (Excel-файл) и исходных данных (CSV-файлы)
Изменено: AB1 - 05.05.2017 17:34:52 (Замена XLSX-файла)
Подсчет количества вхождений ячейки в столбце
 
Добрый день!

Подскажите, пожалуйста, как выполнить подсчет к-ва вхождений содержимого ячейки в столбце без использования доп. столбца B.
Спасибо.
Добавление параметра для выбора столбца в рамках заданного диапазона ячеек (VBA)
 
Добрый день!

Имеется следующая пользовательская функция:
Скрытый текст

Подскажите, пожалуйста, как добавить дополнительный (Optional) числовой параметр для диапазона LTab, чтобы была возможность указать номер столбца в выбранном диапазоне ячеек?

Например, для диапазона A1:D2 параметр 1 должен указывать на столбец B, 3 - на D.

Объявить, наверное, нужно примерно так: Optional NLtab As Long = 1?
Как передать выбранный диапазон для обработки данных?

Заранее благодарен за любую помощь!


Точный поиск слов в тексте при помощи VBA
 
Здравствуйте!

Есть пользовательская функция, при помощи которой происходит замена значений в ячейке.
Как сделать так, чтобы замена значений происходила с учетом следующего правила:
"Если пробелов по краям слова нет, значит это не слово, а часть слова, и замена не осуществляется."?

Недостаток этого подхода в том, что при замене придется отделять пробелами различные знаки в начале и в конце слов.
Для этого подготовил набор знаков, которые, возможно, придется отделять (файл примера, вкладка "signs").

Еще один вопрос: Где удобнее и эффективнее разместить набор знаков? В отдельной вкладке или в самом макросе?
Есть ли возможность использовать в пользовательских параметрах функции ключевое слово для определения того, что следующий за ним диапазон указывает на расположение набора знаков?

Пример:
Код
=NSub(A8;$D$8:$E$10;1;2;signs:signs!A1:A21)

В данном примере ключевое слово "signs:".

Если есть более простой способ для решения этой задачи, то было бы интересно узнать о нем.

Заранее благодарю за любую помощь!

Изменено: AB1 - 04.05.2017 11:29:02
Замена значений с учетом обратных замен (пользовательская функция)
 
Добрый день!

Есть пользовательская функция, при помощи которой происходит замена значений в ячейке.
Как сделать так, чтобы замена значений происходила с учетом обратных преобразований?

Пример:
Исходный текст:
красный

Таблица замен:
красный -> синий
синий -> красный
В результате, исходный текст не меняется.

Цель:
синий

Спасибо!

Подробности в файле.
Замена значений с частичным учетом регистра в макросе
 
Добрый день!

Есть пользовательская функция, при помощи которой происходит замена значений в ячейке с учетом регистра.
Как сделать так, чтобы замена значений происходила и в случаях когда:
1. в исходном тексте первая буква заглавная,
2. все буквы в исходном тексте заглавные
В остальных случаях должен сохраняться исходный текст.

Заранее благодарю!
Вывод значений из разных ячеек, размещенных в одном столбце, в одну ячейку
 
Здравствуйте!

Есть ли возможность вывести значения всех ячеек в столбце A в ячейку C1 без указывания адреса каждой ячейки?
Спасибо.
Сопоставление данных по условию для текстовых значений (не ВПР)
 
Добрый вечер!

Помогите, пожалуйста, решить задачу.
В столбце A содержатся либо текстовые, либо числовые значения, которым присвоены порядковые номера в диапазоне B1:F19.
В столбце H размещены порядковые номера, напротив которых, по совпадению с номерами в диапазоне B1:F19, должны быть выведены значения в столбце I.
Мне удалось получить данные только для числовых значений:
Поиск начальной позиции при помощи VBA
 
Здравствуйте!

В ячейке A1 размещен исходный текст, в B1 - текст, который нужно найти, в C1-XVD1 - начальные позиции всех вхождений текста из B1 (в каждой ячейке по одной начальной позиции). В принципе, все работает при помощи стандартных формул (см. пример), но боюсь, что при большом количестве вычислений использование макроса будет эффективнее. Заранее благодарю за помощь!
Извлечение символов из строки
 
Здравствуйте!

Символы из ячейки A1 извлекаю в столбец B, используя при этом столбец C.
Есть ли способ сделать то же самое, но без использования столбца C?
Спасибо.
Автоматическая сортировка по нескольким условиям (VBA)
 
Здравствуйте!

Нужна помощь для реализации автоматической сортировки по нескольким условиям (VBA):
1. Максимальное значение в столбце E для первой строки группы.
2. Сортировка по убыванию в рамках группы.
3. При равных значениях первых строк в столбце E, первой выводится наиболее многочисленная группа.
4. Если все условия в пункте 3 равны, то данные должны сортироваться по алфавиту в рамках первых двух условий.

Заранее благодарю.
Пример сортировки:
Извлечение слов из текста
 
Здравствуйте, друзья!

Помогите, пожалуйста!


В столбце А размещены фразы.
В столбце B нужно (прошу не относить данное слово на свой счет) вывести уникальные слова из фраз, размещенных в столбце A.
В столбце C выводится количество вхождений слов из столбца B во фразах из столбца A.

Спасибо.
Изменено: AB1 - 21.04.2017 14:58:16
Сопоставление данных по двум критериям
 
Здравствуйте, помогите решить вопрос, пожалуйста!
Необходимо вставить данные по двум критериям.
В столбцы B & C нужно вставить информацию из столбцов E:H после сопоставления названий и дат.
Изменено: AB1 - 13.04.2017 16:29:02
Получение формулы из соседней ячейки
 
Здравствуйте!

Есть ли способ получить содержимое (область формул) соседней ячейки?
Пример:
Ячейка C1 содержит формулу
Код
=A1

Есть ли возможность в ячейке E1 получить "A1"?

Спасибо.

Страницы: 1
Loading...