L oop несколько функций разделения - PullRequest
1 голос
/ 20 июня 2020

Я новичок в VBA, поэтому заранее благодарим вас за терпение. Я написал подпрограмму, которая принимает номер детали (PN) в диапазоне C2 и выполняет три разные функции split и left для заполнения столбцов слева и справа от PN извлеченными частями строки PN. Вот скриншот столбцов и то, что он заполняет.

Вот мой код на данный момент:

Sub PN_Autotfill1()
Dim PN As Range
Dim SCPort_Type As Range
Dim SCPort_Size As Range
Dim Start_FittingSize As Range
Dim PN_String As String
Dim PN_1 As Variant
Dim PN_2 As Variant
Dim PN_3 As Variant

Set PN = Range("C2")
Set SCPort_Type = PN.Offset(, -2)
Set SCPort_Size = PN.Offset(, -1)
Set Start_FittingSize = PN.Offset(, 1)
PN_String = PN.Value
If InStr(PN_String, "Flange") > 0 Then
    'Splits PN into SC Port Type
    PN_1 = Split(PN_String, "#")(1)
    PN_2 = Left(PN_1, 2)
    SCPort_Type.Value = "#" & PN_2 & "Flange"
    
    'Splits PN into SC Port Size, Start, and End Fitting
    PN_3 = Split(PN_1, "-")(1)
    SCPort_Size = PN_3
    Start_FittingSize = PN_3
End If
End Sub

Теперь я хочу сделать al oop который применяет эти функции к каждой ячейке, содержащей PN в столбце C. Я нашел несколько хороших примеров на Stackoverflow и веб-сайте учебника VBA , которые создают циклы для одной функции разделения, но не для нескольких функций разделения. Похоже, в игру вступят два цикла For: LastRow = Cells(Rows.Count, "C").End(xlUp).Row с For a = 2 To LastRow и For i = 1 To UBound(Unsure what goes here). Есть ли у кого-нибудь советы или пример кода, как go об этом? Заранее благодарим вас за любую помощь!

Вот код с интегрированным ответом Jamheadart:

Sub PN_Autotfill_Functions(PN As Range)
Dim SCPort_Type_Size As Range
Dim Start_FittingSize As Range
Dim PN_String As String
Dim LastRow As Single
Dim PN_1 As Variant
Dim PN_2 As Variant
Dim PN_3 As Variant

Set SCPort_Type_Size = PN.Offset(, -1)
Set Start_FittingSize = PN.Offset(, 1)
PN_String = PN.Value

LastRow = Cells(Rows.Count, "C").End(xlUp).Row

    If InStr(PN_String, "Flange") > 0 Then
        'Splits PN into SC Port Type and Size, then combines results
        PN_1 = Split(PN_String, "#")(1)
        PN_2 = Left(PN_1, 2)
        PN_3 = Split(PN_1, "-")(1)
        SCPort_Type_Size.Value = "#" & PN_2 & " Flange" & ", -" & PN_3
    
        'Fills in Start and End Fitting Size based on previous Split of PN
        Start_FittingSize = PN_3
    End If
End Sub

Sub PN_Autofill_Loop()
Dim a As Long
Dim PN As Range

Set PN = ActiveCell
    For a = 2 To 11
        PN_Autotfill_Functions Range("C" & a)
    Next a
End Sub

1 Ответ

1 голос
/ 20 июня 2020

Вам не нужно несколько циклов, вам просто нужно запустить sub в al oop - и каждый раз, когда вы его запускаете, он будет принимать в диапазоне (например, C2)

Итак, измените первую строку вашей подпрограммы на это:

Sub PN_Autotfill1(PN as Range)

И избавьтесь от этих двух строк:

Dim PN As Range
Set PN = Range("C2")

Это означает, что PN теперь параметр для подпрограммы, вместо того, чтобы быть определенным в самой подпрограмме.

Затем вы можете вызвать его для нескольких диапазонов, например:

Sub Testing()
PN_Autotfill1 Range("C2")
PN_Autotfill1 Range("C4")
PN_Autotfill1 Range("C7")
End Sub

И, наконец, если вы хотите l oop, скажем, через десять строк вы можете вызвать его в al oop с другой подпрограммой:

Sub LoopingExample
Dim i As Long
For i = 2 to 11
    PN_Autotfill1 Range("C" & i)
Next i
End Sub

Стоит отметить, что такая легкость возможна только потому, что ваш исходный код построен достаточно хорошо (например, он использует Offset вместо жестко заданных диапазонов и c.)

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