InStr和InStrRev没有正确返回到Mid的位置

Sub nosaukuma_splits() Dim ws As Worksheet Dim p Set ws = ThisWorkbook.Worksheets("splits_name") RowCount = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = 1 To RowCount vertiba = ws.Cells(i, 2) pzime = InStr(vertiba, " -") ozime = InStrRev(vertiba, "- ") ws.Cells(i, 3) = Mid(vertiba, 1, pzime) Next i For i = 1 To RowCount vertiba = ws.Cells(i, 2) pzime = InStr(vertiba, " -") ozime = InStrRev(vertiba, "- ") ws.Cells(i, 4) = Mid(vertiba, pzime, ozime - pzime) Next i End Sub 

为什么我的代码不在第23行执行? 可能是什么原因?

单元格文本看起来像(1text) - (2text) - (3text)

我需要得到(1text)(2text)在分开的单元格。

使用VBA 拆分function将文本值分隔成一个变体数组,然后将您想要的数组的元素返回到工作表。

 Sub nosaukuma_splits() Dim ws As Worksheet Dim i As Long, rc As Long, vTXTs As Variant Set ws = ThisWorkbook.Worksheets("splits_name") With ws rc = .Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To rc vTXTs = Split(.Cells(i, 2).Value2, " - ") .Cells(i, 3).Resize(1, 2) = Array(vTXTs(0), vTXTs(1)) Next i End With End Sub 

就您的原始代码而言,在确定Mid函数中的起始点和长度时,您无法正确补偿分隔符的长度(例如“ – ”或“ – ”)。

 Sub nosaukuma_splits_pirmais() Dim ws As Worksheet Dim i As Long, rc As Long, pzime As Long, ozime As Long, vertiba As String Set ws = ThisWorkbook.Worksheets("splits_name") rc = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = 1 To rc vertiba = ws.Cells(i, 2) pzime = InStr(1, vertiba, " -") ozime = InStr(pzime, vertiba, "- ") ws.Cells(i, 3) = Trim(Mid(vertiba, 1, pzime)) Next i For i = 1 To rc vertiba = ws.Cells(i, 2) pzime = InStr(1, vertiba, " -") + 2 ozime = InStr(pzime + 1, vertiba, "- ") ws.Cells(i, 4) = Trim(Mid(vertiba, pzime, ozime - pzime)) Next i End Sub 

我已经放弃了InStrRev函数,并使用hte第一个分隔符的位置开始search第二个InStr的位置。

结果中还有一些前导/尾随空格放回到工作表中,所以我添加了一个Trim函数来处理这些问题。

 ozime = InStrRev(vertiba, "- ") 

返回从vertibastring的末尾计算的“ – ”的位置。

您应该从string的开头计算位置,以获得两个破折号之间的子string的长度。

如:ws.Cells(i,4)= Mid(vertiba,pzime,len(vertiba) – ozime – pzime)