Получить информацию из словаря и установить ее в ячейке в Excel-VBA - PullRequest
0 голосов
/ 30 марта 2019

я впервые использую Excel-VBA и столкнулся с небольшой проблемой. Я создал словарь [ключ, значение, значение], и я хочу установить значение для различных ячеек. К настоящему времени я сделал это:

Sub CodisFactura()

Fulla1 = Sheets("Ac2 i Factura").Select
Fulla1.Activate

'''''''''

primeraFactura = 5
ultimaFactura = 30

numeroFactura = 5
numColumnaProva = 15

'''''''''



Dim diccCodis As Object
Set diccCodis = CreateObject("Scripting.Dictionary")

With diccCodis
    .CompareMode = vbTextCompare
    .Add "1", Array("RX004", "Resta d'ecografies convencionals")
    .Add "2", Array("RA00414", "Ecografía  de cuello")
    .Add "3", Array("RA00415", "Ecografía de torax")


    Do While numeroFactura >= primeraFactura And numeroFactura < ultimaFactura

        Cells(numeroFactura, numColumnaProva).Value = codiSeleccionat

        keysDicc = diccCodis.Keys

        codiProva = keysDicc(codiSeleccionat)(0)
        nomProva = diccCodis.Item(codiSeleccionat)(1)

        Cells(numeroFactura, 7).Value = codiProva
        Cells(numeroFactura, 12).Value = nomProva

        numeroFactura = numeroFactura + 1

    Loop

    End With

У меня "две ошибки" в этих двух строках:

codiProva = keysDicc(codiSeleccionat)(0) nomProva = diccCodis.Item(codiSeleccionat)(1)

, что является ошибкой несоответствия типов: https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/type-mismatch-error-13

как я могу это сделать? Я делаю что-то не так во всем коде?

1 Ответ

0 голосов
/ 30 марта 2019

Несколько проблем с вашим кодом.

  • Cells(numeroFactura, numColumnaProva).Value = codiSeleccionat назад. Вы хотите, чтобы codiSeleccionat получало значение из ячейки, а не наоборот, как указано.

  • codiProva = keysDicc(codiSeleccionat)(0) Я подозреваю, что вашим объектом должен быть словарь, а не массив ключей для словаря

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

Приведенный ниже код показывает один из способов решения этих проблем:

Dim diccCodis As Object
Set diccCodis = CreateObject("Scripting.Dictionary")

With diccCodis
    .CompareMode = vbTextCompare
    .Add 1, Array("RX004", "Resta d'ecografies convencionals")
    .Add 2, Array("RA00414", "Ecograf?a  de cuello")
    .Add 3, Array("RA00415", "Ecograf?a de torax")


    Do While numeroFactura >= primeraFactura And numeroFactura < ultimaFactura

        codiSeleccionat = Cells(numeroFactura, numColumnaProva).Value

        keysDicc = diccCodis.Keys

        codiProva = diccCodis(codiSeleccionat)(0)
        nomProva = diccCodis.Item(codiSeleccionat)(1)

        Cells(numeroFactura, 7).Value = codiProva
        Cells(numeroFactura, 12).Value = nomProva

        numeroFactura = numeroFactura + 1

    Loop

    End With

Вам будет лучше всегда объявлять все свои переменные. Это может поймать ошибки и, возможно, сделать вещи менее запутанными. Я не понимаю, почему MS делает НЕ требующим объявление переменной по умолчанию. Выберите Tools/Options/Editor и отметьте Require Variable Declaration. Это поместит Option Explicit в начале любого нового модуля. Чтобы исправить этот модуль, введите его вручную в начале.

Учитывая ваш код, ниже приведен скриншот с результатами. Конечно, ваш код не выполняет никакой проверки ошибок на наличие пробелов или неправильных записей в столбце O, и вы должны добавить код для его обработки, иначе он будет некорректно остановлен.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...