Excel 单步执行会产生不同的结果,然后只是运行
我有一段代码,用来分割单元格中的文本。数据是由一个调查程序输出的,该程序没有使用任何有用的定界符,因此不幸的是,将文本转换为列对我没有任何帮助 我写了这段代码,但结果证明在两种情况下结果是不同的Excel 单步执行会产生不同的结果,然后只是运行,excel,vba,Excel,Vba,我有一段代码,用来分割单元格中的文本。数据是由一个调查程序输出的,该程序没有使用任何有用的定界符,因此不幸的是,将文本转换为列对我没有任何帮助 我写了这段代码,但结果证明在两种情况下结果是不同的 我一步一步地运行代码,直到添加第一列,然后让它完成 我从执行宏的菜单运行代码 在第一种情况下,输出是我设计的。在标题为Crop:XXX(包含需要拆分的原始数据)的列之后,每个单独条目都有编号为1到X的列。每行的数据开始拆分到X列,然后移动到有条目为止。像这样: | Crop XXX | 1 |
Crop:XXX
(包含需要拆分的原始数据)的列之后,每个单独条目都有编号为1到X的列。每行的数据开始拆分到X列,然后移动到有条目为止。像这样:
| Crop XXX | 1 | 2 | 3 | 4 |
|-------------|----|----|----|----|
| X1,X2,X3 | X1 | X2 | X3 | |
| X1,X2,X3,X4 | X1 | X2 | X3 | X4 |
在第二种情况下,所有列都编号为1,并且每一新行在前一行的数据之前输入其数据。例如:
| Crop XXX | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
|-------------|----|----|----|----|----|----|----|
| X1,X2,X3 | | | | | X1 | X2 | X3 |
| X1,X2,X3,X4 | X1 | X2 | X3 | X4 | | | |
我用于输入这些列并对其编号的代码如下:
If Not UBound(inarray) = 0 Then
For i = UBound(inarray) To LBound(inarray) Step -1
If ws.Cells(1, col + i).Value = i Then
If i = UBound(inarray) Then
Exit For
End If
col_to_add = col + i + 1
Exit For
Else
addcol = addcol + 1
End If
col_to_add = col + i
Next i
If Not i = UBound(inarray) Then
col1 = ConvertToLetter(col_to_add)
col2 = ConvertToLetter(col_to_add + addcol - 1)
ws.Columns(col1 & ":" & col2).Insert shift:=xlToRight
End If
If Not addcol = 0 Then
For j = 1 To addcol
If col_to_add = col + j Then
If j = 1 Then
ws.Cells(1, col_to_add) = 1
Else
ws.Cells(1, col_to_add + j - 1) = Cells(1, col_to_add + j - 2).Value + 1
End If
Else
ws.Cells(1, col_to_add + j - 1) = Cells(1, col_to_add + j - 2).Value + 1
End If
Next j
End If
For k = UBound(inarray) To LBound(inarray) Step -1
ws.Cells(row, col + k) = inarray(k)
Next k
End If
在本例中,Inarray()
是一个1d数组,第一行包含以下值:
| Inarray() | Value |
|-----------|-------|
| 1 | X1 |
| 2 | X2 |
| 3 | X3 |
ConvertToLetter
具有以下功能:
Function ConvertToLetter(iCol As Integer) As String
Dim vArr
vArr = Split(Cells(1, iCol).Address(True, False), "$")
ConvertToLetter = vArr(0)
End Function
有人能指出场景1和场景2之间出现这种差异的原因吗?通常在对象未完全分类时会发生这种情况,但我想这次我解决了这个问题。这种差异是因为
单元格和范围未完全限定。因此,当您一步一步地进行操作时,您也在选择正确的工作表,而您不会自动选择正确的工作表
每当你有这样的事情:
ws.Cells(1, col_to_add + j - 1) = Cells(1, col_to_add + j - 2).Value + 1
确保始终在单元格()之前编写工作表
,
,就像这里-ws.Cells
。或者在范围之前-ws.range()
。否则它将使用ActiveSheet
或代码所在的工作表(如果不在模块中)
TextToColumns可以完成拆分,DataSeries可以将一系列数字放入第1行
Sub Macro4()
Dim lc As Long
With Worksheets("sheet9")
.Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)).TextToColumns _
Destination:=.Cells(2, "B"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Comma:=True, Tab:=False, Semicolon:=False, Space:=False, Other:=False
lc = .Cells.Find(What:=Chr(42), After:=.Cells(1, 1), LookAt:=xlPart, LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column - 1
.Cells(1, "B") = 1
.Cells(1, "B").Resize(1, lc).DataSeries Rowcol:=xlRows, Type:=xlLinear, _
Date:=xlDay, Step:=1, Stop:=4
End With
End Sub
就我在上面看到的情况来看,您仍然有隐式的activesheet调用。这是一个文本到列操作的大量代码。@Jeeped,请随意提出改进建议;)谢谢你的回答,但不幸的是,我把我的例子降到了最低限度。实际上,X1等也是包含,
的字符串。因此我重写了。我将字符串拆分为整个单词,即子字符串的第一个单词。没有任何东西可以阻止您拆分TextToColumns中的空格。不幸的是,我字符串中唯一的分隔符是单词“句点”,我需要将其保存在单独的子字符串中。