列“ P”(“ P6:P3000”)保存一个值,例如“ EMPLOYEE_CONTRACT_STATUS_Closed”。我试图将“ Closed”(也可能是“ Open”)部分从单元格中拉出到列“ Q”中,或仅将现有列“ P”值替换为定界符(“ _”)之后的最后一个文本。 ..“ EMPLOYEE_CONTRACT_STATUS_Closed”->“ Closed”或“ Open”。这将创建以下步骤:
下面是我到目前为止所拥有的->创建列并调用函数代码以在最后一个定界符之后提取最后一个文本的代码...这是自动化过程的一部分,因此目标是不要触摸或操纵任何 单元格值。我知道可能有一个子流程来执行此操作,但是我无法弄清楚并继续抓挠我的头。这是我第一次在论坛上,而且对于有人提供固定代码但又解释其背后的语法将非常有用,因为我对VBA很有经验,但从未参加过此过程。感谢^ _ ^
&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
我的功能是从显示的值中提取最后一个文本:
Function RightWord(r As Range) As Variant
Dim s As String
s = Trim(r.Value)
RightWord = Mid(s, InStrRev(s, "_") + 1)
End Function
我还没有遇到错误,只是不知道如何将其拼凑起来,假设我可能可以通过一个子过程全部运行,但是我脑子里放屁了。
答案 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
开始了代码,因此在With
和End With
之间,您会发现一些以点开头的行引用了此工作表。然后在Q列之前插入一列,并将所需范围P6至P和最后一行存储到数组中(数组速度更快)
之后循环,该数组包含两列(一列用于原始数据,另一列用于所需的输出)。使用InSstr
函数确保下划线的存在,如果存在,则将基于下划线的拆分输出的最后部分存储到第二列中。
最后将数组填充到工作表中。
希望解释对您有帮助。