Страница: 1 | 2 | 3 |
|
Вопрос: Как пофильтровать в памяти?
|
Добавлено: 16.10.08 14:50
|
|
Автор вопроса: quest
|
Собственно надо взять с первой колонки все уникальные значения, но...
Есть фрагмент кода, который все что есть в этой колонке заносит в массив:
KolCells = .Cells(1, 1).End(xlDown).Row
KolID = KolCells
ReDim ID(KolCells)
For ICells = 1 To KolCells
ID(ICells) = .Cells(ICells, 1)
Но в этой колонке много повторяющихся значений, а мне надо чтобы занесло только уникальные. Кто может помочь?
Ответить
|
Номер ответа: 6 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #6
|
Добавлено: 16.10.08 17:58
|
Я бы через коллекцию сделал. Имхо, меньше мороки и красиво.
Option Explicit
Option Base 1
Sub SelectUniqueValues()
Dim theRange As Range
Dim uniqueValues As New Collection
Dim i As Integer
Dim theArray()
Dim item As Variant
'запоминаем диапазон
Set theRange = Range("A1", Range("A1" . End(xlDown).Address)
With theRange
'игнорируем ошибку при добавлении повторяющегося значения
On Error Resume Next
For i = 1 To .Rows.Count
uniqueValues.Add .Cells(i, 1).Value, .Cells(i, 1).Value
Next i
On Error GoTo 0
End With
'перекидываем значения коллекции в массив
ReDim Preserve theArray(uniqueValues.Count)
i = 1
For Each item In uniqueValues
theArray(i) = item
i = i + 1
Next item
End Sub
Ответить
|
Номер ответа: 13 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #13
|
Добавлено: 17.10.08 15:30
|
Зачем Вам Application.Run? В Вашем основном макросе напишите вот так
Option Explicit
Option Base 1
Sub SelectUniqueValues()
Dim theRange As Range
Dim uniqueValues As New Collection
Dim i As Integer
Dim theArray()
Dim item As Variant
'запоминаем диапазон ИЗ ДРУГОЙ КНИГИ
Set theRange = Workbooks. Open("C:\xls\16.xls" .Worksheets(1).Range("A1" .Range("A1", Range("A1" . End(xlDown).Address)
With theRange
'игнорируем ошибку при добавлении повторяющегося значения
On Error Resume Next
For i = 1 To .Rows.Count
uniqueValues.Add .Cells(i, 1).Value, .Cells(i, 1).Value
Next i
On Error GoTo 0
End With
'перекидываем значения коллекции в массив
ReDim Preserve theArray(uniqueValues.Count)
i = 1
For Each item In uniqueValues
theArray(i) = item
i = i + 1
Next item
End Sub
Ответить
|
Номер ответа: 14 Автор ответа: quest
Вопросов: 5 Ответов: 34
|
Профиль | | #14
|
Добавлено: 17.10.08 16:31
|
Пишет Invald ns de procedure.
Весь мой код выглядит вот так:
- Private Sub CommandButton1_Click()
-
- Dim MyPath As String
- Dim MyFileName As String
- Dim MyFileName_ As String
- Dim ID() As Integer
- Dim KolID As Integer
- Dim KolCells As Integer
- Dim KolRows As Integer
- Dim ICells As Integer, JCells As Integer, ICellsID
- Dim WorkMas() As String
- Dim MasStat() As Integer
- Dim Counter As Integer
- Counter = 0
- MyPath_ = "C:\bd\"
- MyPath = "C:\xls\"
- MyFile = Application.GetOpenFilename("(*.xls),*.xls")
- MyFileName = MyFile
- Workbooks.Open(MyFileName).Activate
- With ActiveWorkbook.ActiveSheet
-
-
-
- KolCells = .Cells(1, 1).End(xlDown).Row
- KolID = KolCells
- ReDim ID(KolCells)
- For ICells = 1 To KolCells
- ID(ICells) = .Cells(ICells, 1)
-
- Next ICells
-
-
-
- End With
- ActiveWindow.Close
-
- MyFileName_ = "BD.xls"
- Workbooks.Open(MyPath_ & "\" & MyFileName_).Activate
- With ActiveWorkbook.ActiveSheet
- KolCells = .Cells(1, 1).End(xlDown).Row
- KolRows = .Cells(1, 1).End(xlToRight).Column
- ReDim WorkMas(KolCells, KolRows)
- For ICells = 1 To KolCells
- For ICellsID = 1 To KolID
- If .Cells(ICells, 1) = ID(ICellsID) Then
- Counter = Counter + 1
- For JCells = 1 To KolRows
- WorkMas(Counter, JCells) = .Cells(ICells, JCells)
-
-
- Next JCells
- End If
- Next ICellsID
- Next ICells
- End With
- ActiveWindow.Close
-
-
- ReDim MasStat("20")
- For ICells = 1 To Counter
- For JCells = 1 To KolRows
-
- If WorkMas(ICells, JCells) = "Значение1" Then MasStat(1) = MasStat(1) + 1
- If WorkMas(ICells, JCells) = "Значение2" Then MasStat(2) = MasStat(2) + 1
- Cells(ICells, JCells) = WorkMas(ICells, JCells)
-
- Next JCells
- Next ICells
-
- End Sub
И как это сюда вставить, чтобы работало? - Я слишком чайник.
Ответить
|
Номер ответа: 15 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #15
|
Добавлено: 17.10.08 17:32
|
- Private Sub CommandButton1_Click()
-
- Dim MyPath As String
- Dim MyFileName As String
- Dim MyFileName_ As String
- Dim ID() As Integer
- Dim KolID As Integer
- Dim KolCells As Integer
- Dim KolRows As Integer
- Dim ICells As Integer, JCells As Integer, ICellsID
- Dim WorkMas() As String
- Dim MasStat() As Integer
- Dim Counter As Integer
- Dim theRange As Range
- Dim uniqueValues As New Collection
- Dim i As Integer
- Dim theArray()
- Dim item As Variant
- Counter = 0
- MyPath_ = "C:\bd\"
- MyPath = "C:\xls\"
- MyFile = Application.GetOpenFilename("(*.xls),*.xls")
- MyFileName = MyFile
- Workbooks.Open(MyFileName).Activate
- With ActiveWorkbook.ActiveSheet
-
-
- Set theRange = .Range("A1", .Range("A1").End(xlDown).Address)
-
- On Error Resume Next
- For i = 1 To theRange.Rows.Count
- uniqueValues.Add theRange.Cells(i, 1).Value, theRange.Cells(i, 1).Value
- Next i
- On Error GoTo 0
-
-
- ReDim Preserve theArray(uniqueValues.Count)
- i = 1
- For Each item In uniqueValues
- theArray(i) = item
- i = i + 1
- Next item
-
- End With
- ActiveWindow.Close
-
- MyFileName_ = "BD.xls"
- Workbooks.Open(MyPath_ & "\" & MyFileName_).Activate
- With ActiveWorkbook.ActiveSheet
- KolCells = .Cells(1, 1).End(xlDown).Row
- KolRows = .Cells(1, 1).End(xlToRight).Column
- ReDim WorkMas(KolCells, KolRows)
- For ICells = 1 To KolCells
- For ICellsID = 1 To KolID
- If .Cells(ICells, 1) = ID(ICellsID) Then
- Counter = Counter + 1
- For JCells = 1 To KolRows
- WorkMas(Counter, JCells) = .Cells(ICells, JCells)
-
-
- Next JCells
- End If
- Next ICellsID
- Next ICells
- End With
- ActiveWindow.Close
-
-
- ReDim MasStat("20")
- For ICells = 1 To Counter
- For JCells = 1 To KolRows
-
- If WorkMas(ICells, JCells) = "Значение1" Then MasStat(1) = MasStat(1) + 1
- If WorkMas(ICells, JCells) = "Значение2" Then MasStat(2) = MasStat(2) + 1
- Cells(ICells, JCells) = WorkMas(ICells, JCells)
-
- Next JCells
- Next ICells
-
- End Sub
З.Ы. Когда скопируете это в VBE, из-за особенностей "форума" в начале каждой строки появится символ #. Воспользуйтесь стандартным Replace'ом для устранения этой неполадки (комбинация Ctrl + H). Вообще, организация форума оставляет желать лучшего.
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму