首页 > 解决方案 > 把一个函数变成一个子进程——STUCK

问题描述

列“P”(“P6:P3000”)保存一个值,如“EMPLOYEE_CONTRACT_STATUS_Closed”。我正在尝试将“已关闭”(也可能是“打开”)部分从单元格中拉出到“Q”列中,或者只是用分隔符(“_”)之后的最后一个文本替换现有的“P”列值。 ..“EMPLOYEE_CONTRACT_STATUS_Closed”->“关闭”或“打开”。这将创建以下步骤:

  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
    

我还没有遇到错误,只是不知道如何把它拼凑起来,假设我可能可以通过一个子进程运行这一切,但我有一个巨大的大脑放屁。

标签: excelvba

解决方案


试试这个代码

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

我通过处理工作表来开始代码,EIBMaintainEmployeeContractsW31WithEnd With注意到一些行以点开头,它指的是这个工作表。然后在 Q 列之前插入一列并将所需的范围从 P6 到 P 和最后一行存储到一个数组中(数组更快)然后循环包含两列的数组(一列用于原始数据,另一列用于所需的输出)。使用函数确保存在下划线,InSstr然后如果存在,则根据下划线将拆分输出的最后一部分存储到第二列中。最后将数组填充到工作表中。希望解释对你有帮助。


推荐阅读