将功能转换为子流程-STUCK

时间:2019-07-12 12:46:23

标签: excel vba

列“ P”(“ P6:P3000”)保存一个值,例如“ EMPLOYEE_CONTRACT_STATUS_Closed”。我试图将“ Closed”(也可能是“ Open”)部分从单元格中拉出到列“ Q”中,或仅将现有列“ P”值替换为定界符(“ _”)之后的最后一个文本。 ..“ EMPLOYEE_CONTRACT_STATUS_Closed”->“ Closed”或“ Open”。这将创建以下步骤:

  1. 创建新列Q
  2. 在列标题中插入新值
  3. 在“ P”中执行功能以替换值或转储到“ Q”列(“ Q6:Q3000”)

下面是我到目前为止所拥有的->创建列并调用函数代码以在最后一个定界符之后提取最后一个文本的代码...这是自动化过程的一部分,因此目标是不要触摸或操纵任何 单元格值。我知道可能有一个子流程来执行此操作,但是我无法弄清楚并继续抓挠我的头。这是我第一次在论坛上,而且对于有人提供固定代码但又解释其背后的语法将非常有用,因为我对VBA很有经验,但从未参加过此过程。感谢^ _ ^

  1. &2.创建新列并更改标题名称:

    Sub ContractStatus_Change()
        Application.ScreenUpdating = False
        Workbooks("DIV_EIB_Tool.xlsm").Worksheets("EIBMaintainEmployeeContractsW31").Range("Q5") _
            .EntireColumn.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
        Worksheets("EIBMaintainEmployeeContractsW31").Range("Q5").Value = "Contract Status"
        Worksheets("EIBMaintainEmployeeContractsW31").Range("Q6:Q3000").NumberFormat = "General"
        Application.ScreenUpdating = True
    End Sub
    
  1. 我的功能是从显示的值中提取最后一个文本:

    Function RightWord(r As Range) As Variant
        Dim s As String
        s = Trim(r.Value)
        RightWord = Mid(s, InStrRev(s, "_") + 1)
    End Function
    

我还没有遇到错误,只是不知道如何将其拼凑起来,假设我可能可以通过一个子过程全部运行,但是我脑子里放屁了。

1 个答案:

答案 0 :(得分:1)

尝试此代码

Sub Test()
Dim a, i&

With Worksheets("EIBMaintainEmployeeContractsW31")
    .Columns("Q").Insert
    a = .Range("P6:P" & .Cells(Rows.Count, "P").End(xlUp).Row).Resize(, 2).Value

    For i = LBound(a) To UBound(a)
        If InStr(a(i, 1), "_") Then
            a(i, 2) = Split(a(i, 1), "_")(UBound(Split(a(i, 1), "_")))
        End If
    Next i

    With .Range("Q5")
        .Value = "Contract Status"
        .Offset(1, -1).Resize(UBound(a, 1), UBound(a, 2)).Value = a
    End With
End With
End Sub

我通过处理工作表EIBMaintainEmployeeContractsW31开始了代码,因此在WithEnd With之间,您会发现一些以点开头的行引用了此工作表。然后在Q列之前插入一列,并将所需范围P6至P和最后一行存储到数组中(数组速度更快) 之后循环,该数组包含两列(一列用于原始数据,另一列用于所需的输出)。使用InSstr函数确保下划线的存在,如果存在,则将基于下划线的拆分输出的最后部分存储到第二列中。 最后将数组填充到工作表中。 希望解释对您有帮助。