Попытка использовать match & Index с указанными диапазонами. Не распознает RefreshDrNumbers в коде.
Я использую функцию Case для указания диапазонов.
Не удается заставить функции Case, Match & Index соединиться или поговорить друг с другом?
Другой форум, о котором я спрашивал,
https://www.mrexcel.com/board/threads/add-ranges-to-match-and-index-functions.1162701/
Private Sub Jobcard_Demands_Click()
If Jobcard_Demands = ("Drawing No`s Update") Then
Dim matchRange As Range
Dim ODict As Object
Dim PartsListLastRow As Long, DestLastRow As Long
Dim LookupRange As Range
Dim i As Integer
Dim wsSource As Worksheet, wsDest As Worksheet
Set wsSource = ThisWorkbook.Worksheets("Parts List")
Set wsDest = ThisWorkbook.Worksheets("Job Card Master")
PartsListLastRow = wsSource.Range("A" & Rows.Count).End(xlUp).Row
DestLastRow = wsDest.Range("A" & Rows.Count).End(xlUp).Row
'This holds the lookup range (including both the lookup key
'column and the value column)
Set matchRange = wsSource.Range("E1:F" & PartsListLastRow)
'Get a dictionary of all the lookup values. The function, as
'defined below, takes the range as well as the relative column
'of the keys and values. In our case, the first column of our
'range has the keys, and the second has the values
Set ODict = GetDictionary(matchRange, 5, 6)
'Below, define the lookup range. In your specific code, this
'varies based on the combobox value, but I think you'll be able
'to figure out how to define it (I'm just hardcoding mine
Set LookupRange = wsDest.Range("A1:A" & DestLastRow)
'Loop over the lookup range
For i = 1 To DestLastRow
'Since the GetPartInfo function handles cases where there isn't a match
' (it returns a blank string), you don't have to use an if/else statement
wsDest.Range("B" & i).Value = GetPartInfo(ODict, wsDest.Range("E" & i).Value)
Next i
End If
End Sub
Private Function GetDictionary(rng As Range, keyCol As Long, valCol As Long) As Object
Dim sht As Worksheet
Dim rCell As Range
Dim ODict As Object
Set sht = rng.Parent
Set ODict = CreateObject("Scripting.Dictionary")
For Each rCell In rng.Columns(keyCol).Cells
If Not ODict.Exists(rCell.Offset(, keyCol - 1).Value) Then
ODict.Add rCell.Offset(, keyCol - 1).Value, rCell.Offset(, valCol - 1).Value
End If
Next rCell
Set GetDictionary = ODict
End Function
'This is just a helper function to de-clutter the main subroutine. Returns an
' empty string in cases where the part doesn't exist in the dictionary
Private Function GetPartInfo(ByRef ODict As Object, sKey As String)
Dim Output As String
Output = ""
If ODict.Exists(sKey) Then
Output = ODict(sKey)
End If
GetPartInfo = Output
End Function
Set matchRange
? Выдает ошибку? Можете ли вы пройтись по коду, чтобы увидеть, есть ли конкретная девиантная запись, которая вызывает проблему? 24.02.2021PartsListLastRow
в случае сбоя кода? 24.02.2021, you should actually be using
Set ODict = GetDictionary(matchRange, 1, 2)`. То, как я настроил функцию для загрузки словаря, принимает относительные столбцы в пределах диапазона. Поскольку наш диапазон — E1:F1252, мы хотим, чтобы ключевой столбец был первым в этом диапазоне, а значения — вторым столбцом этого диапазона. Я думаю, вы ввели их как 5-й и 6-й столбцы рабочего листа. Попробуйте это и посмотрите, получится ли. 24.02.2021Job Card Master
и ищет соответствующие значения в столбце E вParts List
. Это на самом деле то, что вы хотите? Я попытался вручную найти названия отдельных частей с одного листа на другой, и случайная выборка, которую я искал, на самом деле не была найдена. У нас есть несоответствующие столбцы? У нас недопонимание? 25.02.2021