Можно выбрать из списка SAP, не зная, какая строка содержит поле, которое вы хотите использовать.По сути, вы можете шагать по строкам по номеру строки и видеть, равно ли значение текущей строки полю, которое вы хотите отобразить.Поскольку SAP использует для этого несколько процессов, это решение работает только для простых списков.У меня есть решения для списков отображения таблиц.Если вы хотите увидеть это решение, дайте мне знать.
Когда я впервые написал этот код, я каждый раз начинал с нулевой строки и шел к нижней части списка, чтобы найти каждый последующий элемент.Это более поздняя версия, процесс меняет направление поиска с прогнозирования на основе текущей строки, если имя следующего поля находится выше или ниже в алфавитном порядке.
Создание объекта для списка SAP:
Public gridView As Object
Поместите список SAP в gridView и вызовите подпрограмму, чтобы просмотреть элементы в списке.Именованный диапазон «mnHead» - это расположение первого имени поля, требуемого в макете, а остальные следуют в том же столбце.
Set gridView = session.findById("wnd[1]/usr/tabsG_TS_ALV/tabpALV_M_R1/ssubSUB_DYN0510:SAPLSKBH:0620/cntlCONTAINER1_LAYO/shellcont/shell")
Call getFields("mnhead")
Подпрограмма:
Sub getFields(fNames As String)
Dim i, j, k, m, n As Integer
Dim str1, str2, str3, str4, str5 As String
j = 0 ' j is counter for loop - it points at the current desired field name
k = 0 ' k is start for the item to check
m = 1 ' m is counter step 1 for alpha, -1 for anti-alpha
str3 = "0000000000000000" ' padding for later compare
n = gridView.rowcount - 1 ' n = the number of rows in the listbox, it starts at row zero, so take one away
Do While Range(fNames).Offset(j, 0) <> "" ' loop to get all the fields
str2 = Range(fNames).Offset(j, 0) ' put the desired field name in string var str2
For i = k To n Step m ' loop through the rows in the listbox
gridView.currentCellRow = i ' scroll to the row number i
gridView.SetCurrentCell i, "SELTEXT" ' select the item in row i
If gridView.GetCellValue(i, "SELTEXT") = str2 Then ' get the value in row I and see if it's the same as the field name wanted
str1 = str2 ' it's the same so save the heading in temp variable str1
Exit For ' found so exit the loop
End If
Next i
If i >= gridView.rowcount Then ' if we went all the way to the bottom with no match, give a message
MsgBox ("Match not found for " & str2)
Stop
End If
gridView.doubleClickCurrentCell ' double click on the row to send it to the left listbox
str4 = Left(LCase(Left(Replace(str2, " ", ""), 14)) & str3, 15)
str5 = Left(LCase(Left(Replace(Range(fNames).Offset(j + 1, 0), " ", ""), 14)) & str3, 15)
If str4 <= str5 Then ' continue alphabetically the list in next search
If i < 0 Then k = 0 Else k = i ' check to see if we're below the first item and reset to first if we are
m = 1 ' count step is plus one
n = gridView.rowcount - 1 ' endpoint is the end of the alphabet
Else
If i > gridView.rowcount - 1 Then k = gridView.rowcount - 1 Else k = i ' if we're past the end then reset to the end
m = -1 ' count step is minus one - anti-alpha
n = 0 ' endpoint is the beginning
End If
j = j + 1 ' increment j and reloop
Loop