#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. «комментарий выше был более чистым решением», (это * обнаружение ошибок), решение было тем, что я опубликовал. отлично, удачи, рассчитывайте на нас.