Как объединить подстроки для определения целочисленной переменной?

#vba #ms-access

#vba #ms-access

Вопрос:

Я пытаюсь объединить две подстроки в одну, которая определяет целочисленную переменную.

Пример:

 Dim ACTGPA as Integer
Dim ACTGPB as Integer 
Dim ACPrio as Integer

ACTGPA = 5
ACTGPB = 10
 

После большого количества кода у меня есть цикл, который выбирает значение из набора записей, содержащего числовой столбец с именем «TGP_A» или «TGP_B».

 Set rs4 = db.OpenRecordset("SELECT * FROM tbl_Syllabus WHERE Mis_Name = '" amp; strMisName amp; "'")
Dim item As Variant
For Each item In rs4.Fields
    If item.Name = "TGP_A" Or item.Name = "TGP_B" Then
        If Nz(rs4(item.Name).Value, "") > 0 Then
            If strACCon1 = "" Then
                strACCon1 = item.Name         
            End If
        End If
    End If
Next item
 

Я хочу установить для значения ACPrio значение ACTGPA или ACTGPB, в зависимости от того, какое имя элемента выбрано в цикле.

Используя replace, я удаляю _ из имени элемента, чтобы определить ACTGPA (или B).

Я получаю

«Ошибка 13, несоответствие типов»

в следующей строке. Вероятно, потому, что он думает, что я пытаюсь установить ACPrio (целое число) на что-то, что является строкой, но я пытаюсь записать целое число ACTGPA (или ACTGPB).

 ACPrio = "AC" amp; Replace(strACCon1, "_", "")
 

Должно быть таким же, как это:

 ACPrio = ACTGPA 'eg. settings the ACPrio value to that of ACTGPA (or ACTGPB), which is 5 (or 10).
 

Комментарии:

1. Вы не можете назначить имя переменной, вычисленное из строки. Я бы предложил использовать коллекцию для хранения значений и, таким образом, сделать их доступными по имени во время выполнения. Сейчас я подготовлю для вас ответ с примером.

Ответ №1:

Вы не можете использовать строку для ссылки на переменную (или ее значение) по имени.

Но вы можете добавить необходимые значения в коллекцию с их именем, а затем получить к ним доступ позже по имени, как в этом примере:

 Public Sub Sample()
    Dim ACTGPA As Integer
    Dim ACTGPB As Integer
    Dim ACPrio As Integer

    ACTGPA = 5
    ACTGPB = 10

    ' Prepare the collection by adding the values with their name:
    Dim col As Collection
    Set col = New Collection
    col.Add 5, "ACTGPA"
    col.Add 10, "ACTGPB"

    Dim strACCon1 As String

    ' Set for testing to "TGP_A":
    strACCon1 = "TGP_A"

    ACPrio = col("AC" amp; Replace(strACCon1, "_", ""))
    Debug.Print ACPrio

    ' Set for testing to "TGP_B":
    strACCon1 = "TGP_B"

    ACPrio = col("AC" amp; Replace(strACCon1, "_", ""))
    Debug.Print ACPrio
End Sub
 

Вывод

 5
10
 

И, может быть, вы можете опустить переменные ACTGPA и ACTGPB вообще сейчас, если это соответствует вашей концепции и общему коду.