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

Страницы: 1
Вхождение данных из одной колонки в другой.
 
Anchoret, Вы имеете ввиду сортировать сначала средствами эксель отсортировать колонку а потом загнать в массив?

Цитата
artyrH написал: у вас какая версия excel?
Извиняюсь забыл ответить 2016 x32
Вхождение данных из одной колонки в другой.
 
Anchoret, если использовать массив то нужно будет перебрать 75000x5000. У меня эксель завис на минут 10, далее я не стал ждать, и принудительно завершил его работу.
Вхождение данных из одной колонки в другой.
 
Цитата
artyrH написал:
какой макрос? )
Извиняюсь запрос.
Вхождение данных из одной колонки в другой.
 
artyrH, огромное спасибо. Хоть это и не SQL но довольно мощная штука, пошёл набираться ума.

PS. Макрос действительно отработал очень быстро.
Изменено: Tipok - 07.02.2019 22:17:34
Вхождение данных из одной колонки в другой.
 
artyrH, Вы используете язык запросов SQL ведь так? Я не знал что можно обратиться к данным в той же книге.
Я знал что эксель поддерживает работу с базами данных, но не знал что можно обратится к открытой книге.
Изменено: Tipok - 07.02.2019 22:17:03
Вхождение данных из одной колонки в другой.
 
Выкладываю файл, он слегка поменьше чем рабочий, разница только в количестве строк.
https://yadi.sk/i/n_6ZOOTkVnSSCw
Нужно найти объём для строк что в колонке "сравнение"
Изменено: Tipok - 07.02.2019 22:16:50
Вхождение данных из одной колонки в другой.
 
artyrH, прошу прошения, я сделал не верные выводы.
Но как это мне поможет, я могу с помощью Power Query вытянуть столбец целиком но не определённые строки, так ведь?
Вхождение данных из одной колонки в другой.
 
artyrH, Вы использовали автофильтр. Но когда у вас более 75000 уникальных артикулов, даже просто открыть автофильтр уже проблема. Всё очень надолго зависает.
Вхождение данных из одной колонки в другой.
 
Александр Моторин,

Я со словарями ещё не работал. Не могли бы вы ответить, в чём будет разница по сравнению с массивами. Разве это поможет избежать кучи итераций в цикле?

PS. Я так понимаю их использование надо включать отдельно, то есть это не встроена возможность VBA
Изменено: Tipok - 07.02.2019 12:27:38
Вхождение данных из одной колонки в другой.
 
Всем привет. Нужна помощь в фильтрации данных.

Имеется таблица с тремя колонками. Первая и вторая колонка это данные артикул товара и объём. Третья колонка это тоже артикула которые нужно найти в первой и получить объём из второй.

Количество данных в третьей колонке постоянно меняются. Можно конечно получить данные протягивая функцию ВПР, но в виду некоторых причин это очень хлопотно.
Данные в первой колонке(артикула) более 75000 тысяч строк. Данные в третьей колонке(артикула) от 500 и до 5000 тысяч. Так что перебор в массиве займёт очень много времени. Я побывал использовать  условное форматирование и менял цвет текста в совпавших ячейках, далее я хотел с помощью автофильтра скрыть все кроме нужных, и используя SpecialCells получить нужные мне данные. Но это тоже долго. Можете подсказать способ по быстрее?

Заранее спасибо.
Как добавить пользовательское события и его обработку в свой класс
 
Андрей VG,Спасибо.

До вашего ответа, я переписал код класса Class1 и TestClass, для этого я использовал конструкторы обеих классов. Макрос конечно запустился, но я получил кучу циклических ссылок на экземпляры друг друга. Теперь стал более понятен принцип.

Ещё раз спасибо за ответ и пример кода.  
Изменено: Tipok - 21.12.2018 14:54:24
Как добавить пользовательское события и его обработку в свой класс
 
цитировать можно, когда это нужно [МОДЕРАТОР]

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

Не могу понять принцип создания и обработки своего события в классе.

Имеется два класса TestClass и Class1. В классе TestClass вызывается некоторое событие, а его обработка должна происходить в классе Class1.
Накидал простой пример.
Код
'TestClass 
'Модуль класса где происходит вся работа и где будет вызвано события
Option Explicit

Public WithEvents msv As Worksheet
Public cls As Class1

Public Event SetOne(typ As Boolean)


Private Sub msv_Activate()
    Debug.Print "Активация листа"

End Sub

Private Sub msv_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Debug.Print "Double click"
End Sub

Private Sub msv_SelectionChange(ByVal Target As Range)
    Debug.Print "SelectionChange"

    RaiseEvent SetOne(True) ' ----> Вызов события
End Sub

Property Set Worksheet(wks As Worksheet)
    Set msv = wks
End Property
Код
' Class1
Option Explicit
Public WithEvents cl As TestClass


Private Sub cl_SetOne(typ As Boolean) '------> обработка события
    Debug.Print "Было вызвано событие"
End 

Ошибок интерпретатор не нашёл. Но обработка события не происходит.
Прошу помощи в этом деле. А если ещё и подробно объясните, то будет просто замечательно.
Добавление массива в коллекцию.
 
Всем спасибо за подсказки. Решил использовать дополнительный массив структур в структуре Type StructFilter

Код
Private Type sFilterData' Структура описывающая поля фильтра
    Field As Integer ' Смещение от начала листа указывающее где нужно создать фильтр
    Criteria_1 As String
    Criteria_2 As String
    
    Operator As Integer
    On As Boolean
    Count As Integer ' Счётчик хранит количество используемых критериев
    
End Type

Private Type StructFilter
    EnableFilter As Boolean 'Значение True - Фильтр был активирован
    NameBook As String 'Имя книги из которой будут сохранены фильтры
    NameSheet As String 'Имя листа из которого будут сохранены фильтры
    RangeFilter As Range ' Диапазон применения фильтра
    
    arrData() As sFilterData
    
End Type
Dim sf As StructFilter

Ещё раз всем спасибо.
Пойду бороться с фильтрами.
Изменено: Tipok - 02.12.2018 12:08:12
Добавление массива в коллекцию.
 
Цитата
JayBhagavan написал:
Структуру полей описываю константами-индексами столбцов, например:
Спасибо за идею.

Так как попытка запихать массив пользовательских типов в коллекцию провалилась, придётся использовать двухмерные массивы.
Вы используете константы, а я подумываю использовать тип Enum.
Добавление массива в коллекцию.
 
Цитата
Hugo написал:
А что, Вы не запомните, что на первой позиции слово, а на второй число? Зачем вообще этот Private Type?
Дело не в памяти, конечно для таких простых структур достаточно запомнить, но когда полей в структуре много - это уже не тривиальная задача.

Private Type - мне нужен для удобства.
Я написал это пример только для наглядности.
Код
Private Type sFilterData
' Структура описывающая поля фильтра
    Criteria_1 As String
    Criteria_2 As String
    Field As Variant
    Operator As Integer
    On As Boolean
    Count As Integer ' Счётчик хранит количество используемых критериев
    
End Type
Я хотел создать массив вот таких структур и добавить в коллекцию.
Изменено: Tipok - 02.12.2018 07:40:50
Добавление массива в коллекцию.
 
Цитата
Ігор Гончаренко написал:
да, ограничения, но обойти можно:с классами нужно заморичиться
Спасибо за ответ.
Про классы я знал, но не хотелось создавать дополнительных модулей в проекте.

Оставлю как последнюю меру.
Добавление массива в коллекцию.
 
Всем доброго времени суток.

Создаю пользовательский тип
Код
Private Type try
    nubm As String
    NameStruct As String
End Type
Создаю пользовательскую коллекцию.
Код
Dim col As Collection
Set col = New Collection
Добавить в коллекцию массив типа Integer я могу, а вот массив пользовательского типа - не получается.
Код
Private Sub Worksheet_Activate()
Dim t As try
Dim x As Integer
Dim m() As try

Dim col As Collection
Set col = New Collection
ReDim m(1 To 5)
For x = 1 To 5 Step 1
    m(x).NameStruct = "Проверка"
    m(x).nubm = x

    
Next
col.Add m
Erase m
    
End Sub

Это ограничение VBA, или я делаю, что-то не так?
Создание и заполнения массива коллекций
 
Андрей VG,Спасибо за ответ. VB.NET будет следующим моим языком для изучения. ;)  
Создание и заполнения массива коллекций
 
Казанский,Благодарю за исчерпывающий ответ. Я подозревал, что это как - то связно с директивой New, теперь стало ясно. Ведь при использовании
директивы New объект создаться только при обращении к нему.
Изменено: Tipok - 01.12.2017 16:50:54
Создание и заполнения массива коллекций
 
Цитата
Андрей VG написал: По существу то, что предложил Алексей - не документированная возможность. Лучше так не делать
???
Создание и заполнения массива коллекций
 
Андрей VG,Значит без циклов не обойтись?

Тогда прошу объяснить, если написать весть код в одном модуле то всё работает.
Код
Dim FilterColl() As New Collection
ReDim FilterColl(1 To 3)
FilterColl(1).Add ("Boo") 
Я ведь передаю аргумент по ссылки, по идее любое изменение аргумента по ссылки приведёт к изменению передаваемого объекта.
В чём подвох?
Изменено: Tipok - 01.12.2017 16:18:00
Создание и заполнения массива коллекций
 
С предыдущем вопросом разобрался. И возник новый.
Он несколько отличается от названия темы. Но дабы не плодить тем спрошу в этой.
Я попробовал передать динамический неспециализированный массив в процедуру для последующего
определение размера и заполнения,но не чего не выходит.
Опять прошу помощи.
Код
Public Sub Main()

 Dim FilterColl() As New Collection 

 Call Prob(FilterColl())
End Sub 

Public Sub Prob(ByRef fColl() as Collection)
 ReDim fColl (1 to 3)
 fColl(1).Add("Boo")
End Sub 
При добавлении нового элемента в коллекцию происходит ошибка.
Где я ошибаюсь? Если можно поделитесь примером.
Изменено: Tipok - 01.12.2017 15:59:09
Создание и заполнения массива коллекций
 
Казанский,Прошу прощения за суету.
Смешно но на форум я написал правильный вариант. Ошибка была у меня в исходнике.
Код
ReDim FilterColl(1 To 3) As Collection
Я пытался изменить тип. Вот он и ругался.

Спасибо за помощь.
Тема закрыта.
Создание и заполнения массива коллекций
 
Казанский, Но этот код не работает
Код
Dim FilterColl() As New Collection
 
Redim FilterColl(1 To 3)
FilterColl(1).Add(Boo)
Где ошибка?
Создание и заполнения массива коллекций
 
Доброго времени суток всем.

Проблема в следующем. Создаю массив коллекций, но не могу его заполнить.
Код
Dim FilterColl() As New Collection

Redim FilterColl(1 To 3)
FilterColl(1).Add("Boo")
Этот код не работает. Пробую по другому
Код
  Dim FilterColl() As Collection

  ReDim FilterColl(1 To 3) As Collection
  Set FilterColl(1) = New Collection
  FilterColl(1).Add ("Boo")
Этот код уже работает.
Но можно ли как - нибудь это сократить. Что нибудь в таком роде:
Код
Dim FilterColl() As New Collection

Redim FilterColl(1 To 3)
FilterColl(1).Add(Boo)
Буду благодарен за любую помощь.
PS. Можно конечно замутить цикл, но всё же хотелось бы знать. Этот код был написан просто для примера.
Ошибка при использовании большого числа Hyperlink
 
Здравствуйте Пытливый.
У меня такая же реализация обработки ошибок как вы предложили.
Такое количество ошибок возможно только если пользователь скопирует туда не корректные значения. Буде показывать ему MsgBox с текстом о некорректном вводе данных.
Изменено: Tipok - 24.11.2017 12:33:32
Ошибка при использовании большого числа Hyperlink
 
Karataev, большое спасибо.
Я даже и не подумал, что Microsoft опубликовала ограничения эксель. Очень полезная инфа.

Попробую ваш пример в действии, посмотрю на сколько будет тормозить.
Ссылки содержать адреса ячеек с ошибками на втором листе. То есть тыклул на ссылку попал на  ячейку с ошибкой.
Если пример будет сильно тормозить, тогда попробую поколдовать с обработкой событий листа.

Ещё раз спасибо.
Ошибка при использовании большого числа Hyperlink
 
Сейчас у меня файл с расширением xlsm - то есть с поддержкой макросов. В нём тоже имеются такие ограничения?
Изменено: Tipok - 24.11.2017 09:22:02
Ошибка при использовании большого числа Hyperlink
 
Всем доброго времени суток.

В моём макросе по задумке должно использоваться большое количество Hyperlink, больше 100000.
Но при добавлении в коллекцию Hyperlinks рабочего листа, где то на 65527 итерации происходит ошибка
Цитата
Run-time error '1004'
Application-defined or object-defined error
Использую Excel 2013 x86
Подскажите это лимит коллекции Hyperlinks или лимит количества Hyperlink на листе. И как можно это побороть

Это тестовый пример который я набрасал на скорую руку.
Код
Set s = Workbooks(NameBook).Worksheets(cGenTable)
Set w = Workbooks(NameBook).Worksheets(cListPairs)
For at = 1 To 100000
w.Hyperlinks.Add w.Cells(at, 1), "", s.Cells(at, 1).Address(True, , xlR1C1, True), , "Boo"
Next at

Заранее благодарю за любую помощь в этом вопросе
Страницы: 1
Наверх