Sub test()
Dim wb As Workbook, ws As Worksheet, cl As Range, lastRow&, x&
Dim dic As Object, dkey
Set wb = ActiveWorkbook
Set ws = wb.ActiveSheet
Set dic = CreateObject("Scripting.Dictionary")
dic.comparemode = vbTextCompare
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
For Each cl In ws.Range("B1:B" & lastRow)
If Not dic.exists(cl.Value) Then
dic.Add cl.Value, ws.Cells(cl.Row, "A").Value
Else
dic(cl.Value) = dic(cl.Value) & " " & ws.Cells(cl.Row, "A").Value
End If
Next cl
Set ws = wb.Sheets.Add
x = 1
For Each dkey In dic
ws.Cells(x, "A").Value = dkey
ws.Cells(x, "B").Value = dic(dkey)
x = x + 1
Next dkey
ws.Columns("A:B").AutoFit
End Sub
MonsterBeer написал: Макрос реализован в надстройке, а как мне закинуть данные справочника на этот лист, а потом еще и обратится к нему?
Создайте файл xlsx например (СправочникЗамен.xlsx), внесите в него список замен, сохраните его в формате хlam, добавьте надстройку, затем как в коде ниже.
Код
Sub test()
Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")
Dim cl As Range
Dic.CompareMode = vbTextCompare
With Workbooks("СправочникЗамен.xlam").Sheets("Лист1")
For Each cl In .[A1:A8]
Dic.Add cl.Value, cl.Offset(, 1).Value
Next cl
End With
For Each cl In Selection
If Dic.exists(cl.Value) Then cl.Value = Dic(cl.Value)
Next cl
Set Dic = Nothing
End Sub
MonsterBeer написал: Есть мысли как упростить код?
Код
Sub test()
Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")
Dim cl As Range
Dic.CompareMode = vbTextCompare
Dic.Add "DAX", "ФИО1"
Dic.Add "DAZ", "ФИО2"
Dic.Add "DBI", "ФИО2"
Dic.Add "DDB", "ФИО3"
Dic.Add "DDC", "ФИО2"
Dic.Add "DDF", "ФИО3"
Dic.Add "DDG", "ФИО"
Dic.Add "DDH", "ФИО3"
For Each cl In Selection
If Dic.exists(cl.Value) Then cl.Value = Dic(cl.Value)
Next cl
Set Dic = Nothing
End Sub
запрос ваш не так, с базами тоже работаю не первый год, но что вы хотели сделать так и не понял, пока вы не выложили нормальный запрос, раз пошла такая пьянка ... вот вам еще решение
Код
Query = _
" SELECT ПЕРВАЯ.ID, ПЕРВАЯ.NAME, ПЕРВАЯ.SITY, ПЕРВАЯ.OLD, ПЕРВАЯ.УК, " & _
" ( SELECT COUNT(*) " & _
" FROM ВТОРАЯ " & _
" WHERE ВТОРАЯ.Name = ПЕРВАЯ.Name " & _
" AND ВТОРАЯ.SITY = ПЕРВАЯ.SITY " & _
" AND ВТОРАЯ.ID = ПЕРВАЯ.ID " & _
" AND ВТОРАЯ.OLD = ПЕРВАЯ.OLD ) AS ПРОВЕРКА " & _
" FROM ПЕРВАЯ " & _
" WHERE ПЕРВАЯ.ID = 15000 "
вроде тестировал, результат тот же что у формул, добавил проверку на ошибку на всяк случай (если не найдено значение, то ячейка empty)
Код
Sub test()
Dim n%, z%, oCell As Range
On Error Resume Next
For Each oCell In ActiveSheet.Range("B2:M6")
n = Sheets("Лист1").Range("A1:M1").Find(Cells(1, oCell.Column)).Column
z = Sheets("Лист1").Range("A1:A6").Find(Cells(oCell.Row, 1)).Row
If Err.Number = 0 Then
oCell.Value = Sheets("Лист1").Cells(z, n).Value
Else
Err.Clear: oCell.Value = Empty
End If
Next
End Sub
как я понял, человеку просто нужен lookup, только вот с столбец заранее не известен, поэтому столбец, с которого нужно вернуть данные, определялся через match
Sub test()
Dim n%, z%, oCell As Range
On Error Resume Next
For Each oCell In ActiveSheet.Range("B2:M6")
n = Sheets("Лист1").Range("A1:M1").Find(Cells(1, oCell.Column)).Column
z = Sheets("Лист1").Range("A1:A6").Find(Cells(oCell.Row, 1)).Row
oCell.Value = Sheets("Лист1").Cells(z, n).Value
Next
End Sub
другой вариант, использовать worksheetfunction.vlookup и WorksheetFunction.Match (соотвественно ВПР и ПОИСКПОЗ)
Sub FindDuplicates()
Dim oCell As Range, oCell2 As Range, sRange$
sRange = "A3:F48"
For Each oCell In wsImport.Range(sRange)
If Not IsEmpty(oCell.Value) Then
For Each oCell2 In wsImport.Range(sRange)
If oCell.Address <> oCell2.Address And _
oCell.Interior.Color <> vbBlue And _
oCell.Value = oCell2.Value Then
oCell.Interior.Color = vbGreen
oCell2.Interior.Color = vbBlue
End If
Next
End If
Next
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo error_handler
If Not Intersect(Target, Range("$C$2:$BO$26")) Is Nothing Then
If IsNumeric(ActiveCell.Value) Then
Cells(28, 6).Value = Cells(28, 5).Value * ActiveCell.Value
Else
Cells(28, 6).Value = "???"
End If
End If
error_handler:
Application.EnableEvents = True
End Sub
создать переменную типа string, циклом забрать в нее данные с диапазона и влупить в in
Код
Dim SQL$, oCell As Range
For Each oCell In Sheets("ëèñò1").Range("A1:A10")
SQL = SQL & "'" & oCell.Value & "',"
Next
SQL = Left(SQL, Len(SQL) - 1)
' чего то там
where u.locatn in (" & SQL & ");"