Как мне передать аргумент из подпрограммы в функцию в VBA?

#vba #function #subroutine

#vba #функция #подпрограмма

Вопрос:

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

подпрограмма ищет значение в ячейке «G x«

  • если он находит значение
    • передать значение в функцию, чтобы удалить буквы, преобразовать в число, передать обратно в подпрограмму, чтобы поместить в ячейку «A x«
  • если нет значения
    • передать значение «C x» в функцию и т. Д.

Это перебирает числовые ячейки, которые у меня есть на рабочем листе, в зависимости от количества строк, заполненных в отдельном столбце.

Функция отлично работает сама по себе на рабочем листе, но когда я передаю ей значение из столбца подпрограммы A, заполняется номером строки ie. A37=37, A8=8. Я не думаю, что я правильно передаю аргумент функции, но я не уверен. Вот код для подпрограммы и функции:

     Sub final_ticket_number()
    Dim rw As Integer
    Dim i As Integer

    'header label
    Range("A1").Value = "Final Ticket #"

    'set number of rows for loop
    With Worksheets(1)
        rw = .Range("B2").End(xlDown).Row
    End With

    'check col G for empty, use col C as backup
    For i = 2 To rw
        If Not IsEmpty(Cells(i, "G")) Then
            'strip out letters in col G, place in col A
            Cells(i, "A").Value = getNumeric("G" amp; i)
        Else
            'strip out letters in col C, place in col A
            Cells(i, "A").Value = getNumeric("C" amp; i)
        End If
    Next i
    
    End Sub

    Function getNumeric(cellRef As String) As Long 'remove letters from ticket numbers
    Dim stringLength As Integer
    Dim i As Byte
    Dim Result As String
    stringLength = Len(cellRef)

    'loops through each character in a cell to evaluate if number or not
    For i = 1 To stringLength
        If IsNumeric(Mid(cellRef, i, 1)) Then
            Result = Result amp; Mid(cellRef, i, 1)
        End If
    Next i

    'convert remaining characters to number
    getNumeric = CLng(Result)

    End Function
  

Чего мне не хватает?

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

1. Ваша функция никогда не преобразует переданную строку в диапазон. Вам нужно обернуть его в range . На самом деле лучше передать диапазон.

2. Спасибо, это сработало. Простое исправление, которое я не могу поверить, что не видел.

Ответ №1:

Насколько я понимаю, единственное, что неправильно, это ваш Len (cellRef), здесь вы передаете только диапазон, а не его значение. Посмотрите, как я это сделал, мне пришлось указать электронную таблицу, сделать то же самое, что будет работать.

Используйте debug.print, чтобы просмотреть выходные данные переменных. Напишите в коде «debug.print XvariableX», и при немедленной проверке (Ctrl G) вы увидите значение, присвоенное переменной. удачи.

 Sub final_ticket_number()
Dim rw As Integer
Dim i As Integer

Range("A1").Value = "Final Ticket #"

With Worksheets(1)
    rw = .Range("B2").End(xlDown).Row
End With

For i = 2 To rw
    If Not IsEmpty(Cells(i, "G")) Then
        Cells(i, "A").Value = getNumeric("G" amp; i)
    Else
        Cells(i, "A").Value = getNumeric("C" amp; i)
    End If
Next i
End Sub

Function getNumeric(cellRef As String) As Long 'remove letters from ticket numbers
Dim stringLength As Integer
Dim i As Byte
Dim Result As String

Dim Wrs As String
Wrk = ActiveWorkbook.Name
Workbooks(Wrk).Activate
Wrs = ActiveSheet.Name
stringLength = Len(Workbooks(Wrk).Worksheets(Wrs).Range(cellRef))

For i = 1 To stringLength
    If IsNumeric(Mid(Workbooks(Wrk).Worksheets(Wrs).Range(cellRef), i, 1)) Then
        Result = Result amp; Mid(Workbooks(Wrk).Worksheets(Wrs).Range(cellRef), i, 1)
    End If
Next i

getNumeric = CLng(Result)
End Function
  

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

1. Это тоже сработало, но комментарий выше был более чистым решением. Спасибо за помощь. В конце моего подраздела я передал диапазон функции следующим образом: =getNumeric(Worksheets(Wrs) . Диапазон («G» amp; i))

2. «комментарий выше был более чистым решением», (это * обнаружение ошибок), решение было тем, что я опубликовал. отлично, удачи, рассчитывайте на нас.