Сравните значение пользовательского ввода со словарем в VBA - PullRequest
0 голосов
/ 22 января 2019

Мой макрос должен выполнить некоторые вычисления для строк и импортировать данные, где пользователь вводит идентификатор. Главное, что он работает с указанным идентификатором, потому что некоторые данные требуют обновления / двойной проверки, поэтому запуск всего исходного файла не идеален.

Мой код в основном просит пользователя ввести идентификатор в качестве «критерия», а затем его сравнивают со словарем, который я создал и содержит все данные из источника, проблема в том, что использование dict.Item на самом деле не сравнивает идентификаторы, хотя он корректно работает на каждой строке в листе назначения.

'dictionary filler
For indexsrsrow = 2 To indexsrslastrow
    dict.Add CStr(srcWorksheet.Range("A" & indexsrsrow).Value), indexsrsrow 
Next indexsrsrow

dim criteria as string
criteria = inputbox("enter id")
For indexdstrow = 2 To indexlastdstrow
    'IF ID EXIST AND ITEM = CRITERIA AND C COLUMN IS EMPTY
    If dict.Exist(criteria) And destinerow.Cells(indexdstrow, "C") = "" Then

    'STUFF HAPPENS HERE

    End If
Next indexdstrow
Set dict = Nothing

Есть ли другой способ сравнить элементы словаря с указанным пользовательским вводом ?. Заранее спасибо.

1 Ответ

0 голосов
/ 22 января 2019

@ SiddharthRout Kinda, например, я являюсь пользователем, и мне нужно обновить запись (строку) с идентификатором 123, поэтому я запускаю макрос, он запрашивает у меня идентификатор, который мне нужно обновить, я ввожу 123 и когдаЯ нажимаю ввод, в коде он должен получить идентификатор в исходной книге, взять данные и вставить их в целевую книгу, где идентификатор 123. Надеюсь, это прояснится.-

Я прокомментировал код, поэтому у вас не должно возникнуть проблем с его пониманием.Дайте мне знать, если вы этого хотите?Если нет, то оставьте свой запрос, и я его посмотрю, когда проснусь.

Option Explicit

Sub Sample()
    Dim srcWorksheet As Worksheet, destinerow As Worksheet
    Dim dict As New Dictionary
    Dim lRow As Long, i As Long

    '~~> Set your source and destination worksheets
    Set srcWorksheet = Sheet1
    Set destinerow = Sheet2

    '~~> Add items to dict from Source worksheet
    With srcWorksheet
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 2 To lRow
            dict.Add CStr(.Range("A" & i).Value), i
        Next i
    End With

    '~~> Ask user for the criteria
    Dim criteria As String
    criteria = InputBox("enter id")

    '~~> If user presses cancel or item doesn't
    '~~> exists in dictionary then exit sub
    If criteria = "" Then Exit Sub
    If Not dict.Exists(criteria) Then Exit Sub

    Dim rngToCopy As Range, aCell As Range

    '~~> Find the id in source so we can identify the
    '~~> range to copy
    With srcWorksheet
        Set aCell = .Range("A1:A" & lRow).Find(What:=criteria, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

        If Not aCell Is Nothing Then
            '~~> I am ssuming the data that you want to copy
            '~~> is in Col B. If not then change as applicable
            Set rngToCopy = .Range("B" & aCell.Row)
        End If
    End With

    Set aCell = Nothing

    '~~> Find the id in destinations so we can identify the
    '~~> range where we need to copy
    With destinerow
        Set aCell = .Columns(1).Find(What:=criteria, LookIn:=xlValues, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)

        If Not aCell Is Nothing Then
            '~~> I am ssuming the data WHERE you want to copy
            '~~> is in Col C. If not then change as applicable
            rngToCopy.Copy .Range("C" & aCell.Row)
        End If
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...