Выберите значение из формы ListBox и Показать значение, связанное - PullRequest
1 голос
/ 12 февраля 2020

У меня есть список предметов и описания в столбце А. Первый предмет находится в 5-й строке. Каждый элемент сопровождается описанием элемента.

Это выглядит примерно так (по-разному, но с той же концепцией):

Apple
Red Fruit
Banana
Yellow Fruit

Я пытаюсь сделать так, чтобы они оба были разделены на 2 массива в зависимости от того, является ли это элементом или описание.

Я сделал это здесь:

Option Explicit
Option Base 1

Sub main()

    Dim rngList As Range
    Dim strNetId As String
    Dim strListArray() As String

    Set rngList = Sheets("data").Range("A1").CurrentRegion

    Call CreateArray(rngList, strListArray())
    Call CreateArray2(rngList, strListArray())

End Sub

Sub CreateArray(rngIn As Range, strArray() As String)

    Dim iCols As Integer
    Dim iRows As Integer
    Dim iRowsH As Integer
    Dim i As Integer
    Dim j As Integer
    Dim Counter As Integer
    Dim Counter2 As Integer
    Dim Count2 As Integer        

    iRows = (rngIn.Rows.Count - 1)
    iCols = 1
    iRowsH = (rngIn.Rows.Count - 1) / 2

    ReDim strArray(iRows, iCols)

    Count2 = 3
    Counter = 1

    Do
        If Count2 Mod 2 <> 0 Then
            strArray(Counter, 1) = rngIn.Cells(Count2 + 2, 1)
            Counter = Counter + 1
        End If
        Count2 = Count2 + 1
    Loop Until Count2 > iRows

End Sub

Sub CreateArray2(rngIn2 As Range, strArray2() As String)

    Dim iCols As Integer
    Dim iRows As Integer
    Dim iRowsH As Integer
    Dim i As Integer
    Dim j As Integer
    Dim Counter As Integer
    Dim Counter2 As Integer
    Dim Count2 As Integer       

    iRows = (rngIn2.Rows.Count - 1)
    iCols = 1
    iRowsH = (rngIn2.Rows.Count - 1) / 2       

    ReDim strArray2(iRows, iCols)

    Count2 = 3
    Counter = 1

    Do
        If Count2 Mod 2 = 0 Then
            strArray2(Counter, 1) = rngIn2.Cells(Count2 + 2, 1)
            Counter = Counter + 1
        End If
        Count2 = Count2 + 1
    Loop Until Count2 > iRows

End Sub

Когда я сталкиваюсь с проблемой - заставить мою форму работать. Я хочу, чтобы вы запустили форму, а затем щелкнули один из элементов, которые будут заполнены в ListBox. Затем в текстовом поле появится соответствующее описание. Вот что у меня есть в коде моей формы, но я получаю сообщение об ошибке, когда вы фактически выбираете элемент из формы:

Option Base 0
Option Explicit
Dim strArray2()


Private Sub btnDone_Click()
    Unload frmNetID
End Sub    

Private Sub lstNetID_Click()
    lblFirstName.Caption = strArray2(lstNetID.ListIndex + 2, 1)
End Sub

Private Sub UserForm_Initialize()

    Dim rngList As Range
    Dim strNetId As String
    Dim strList() As String
    Dim iR As Integer

    With ThisWorkbook.Worksheets("data")
        iR = .Range("A1").CurrentRegion.Rows.Count

        Set rngList = .Range("A1:A" & iR) 'it assumes header row
        Call CreateArray(rngList, strList())            

    End With

    lstNetID.List() = strList()

End Sub

Где я делаю первую ошибку? Я предполагаю, что это как-то связано со строкой кода lblFirstName.Caption.

1 Ответ

0 голосов
/ 12 февраля 2020

Ваш код может быть упрощен и более эффективен, я думаю. Пожалуйста, посмотрите, как необходимые массивы могут быть построены и использованы немного по-другому:

Private Sub testFillArrays()
 Dim sh As Worksheet, arr As Variant, arrN As Variant, arrD As Variant
 Dim n As Long, d As Long, i As Long, arrGlob() As Variant
   Set sh = ActiveSheet 'you will use Sheets("data")

   arr = sh.Range("A1").CurrentRegion.Value2 'base 1 array
   ReDim arrN(0 To UBound(arr, 2), 0 To Int(UBound(arr, 1) / 2)) '(0 based array)
   ReDim arrD(0 To UBound(arr, 2), 0 To Int(UBound(arr, 1) / 2))
   For i = 2 To UBound(arr)
        If i Mod 2 = 0 Then
            arrN(0, n) = arr(i, 1): n = n + 1 ' fruit names array
        Else
            arrD(0, d) = arr(i, 1): d = d + 1 ' fruit colors array
        End If
   Next i
   ReDim Preserve arrN(0 To 1, 0 To n - 1) 'clear the last empty element
   ReDim Preserve arrD(0 To 1, 0 To d - 1)

   'arrN is the array to be load in the list box.
   arrGlob = Array(arrN, arrD) 'define the array of arrays
   i = lstNetID.ListIndex 
   Debug.Print arrGlob(0)(0, i), arrGlob(1)(0, i) 'and press Ctrl + G to see the result...
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...