Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 单步执行会产生不同的结果,然后只是运行_Excel_Vba - Fatal编程技术网

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中的空格。不幸的是,我字符串中唯一的分隔符是单词“句点”,我需要将其保存在单独的子字符串中。