Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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 VBA将许多列转换为两列-我做错了什么?_Excel_Vba - Fatal编程技术网

Excel VBA将许多列转换为两列-我做错了什么?

Excel VBA将许多列转换为两列-我做错了什么?,excel,vba,Excel,Vba,嗨,我对vba不是很熟悉。但我提出了以下方法,将一个包含多个列的电子表格转换为两个列。示例显示了包含多个项目的名称。我需要一行,每个项目的名称 您可以看到每行的长度可以更改。我知道有多少行。我制作了以下脚本,但似乎无法使其正常工作。请提供任何关于如何修复的建议都非常有用 这就是我所拥有的: 名称1 |项目1 |项目2 |项目3 |项目4 名称2 |项目5 |项目3 |项目19 这就是我需要的: 名称1 |项目1 名称1 |项目2 名称1 |项目3 名称1 |项目4 名称2 |项目5 名称2 |项

嗨,我对vba不是很熟悉。但我提出了以下方法,将一个包含多个列的电子表格转换为两个列。示例显示了包含多个项目的名称。我需要一行,每个项目的名称

您可以看到每行的长度可以更改。我知道有多少行。我制作了以下脚本,但似乎无法使其正常工作。请提供任何关于如何修复的建议都非常有用

这就是我所拥有的:

名称1 |项目1 |项目2 |项目3 |项目4

名称2 |项目5 |项目3 |项目19

这就是我需要的:

名称1 |项目1

名称1 |项目2

名称1 |项目3

名称1 |项目4

名称2 |项目5

名称2 |项目3

名称2 |项目19

Sub-moveToRows()
Dim名称作为字符串,项作为字符串,
调暗r为双精度,c为双精度,r2为双精度,l为双精度
图纸(“图纸1”)。选择
r=1
c=1
r2=1
当r<5000时,进行试验
单元格(r,c)。选择
name=ActiveCell.Value
l=ActiveRow.Length

当c时,我能用建议的IsEmpty解决这个问题。更改了输出位置,如变量oRow中所示

Sub moveToRows()
Dim name As String, item As String
Dim r As Double, oRow As Double
Range("A1").Select
oRow = 5000

For r = 1 To ActiveCell.End(xlDown).Row
    Cells(r, 2).Select
    name = ActiveCell.Offset(0, -1).Value
    If IsEmpty(ActiveCell) Then
        Cells(oRow, 1).Value = name
        oRow = oRow + 1
    End If

    Do Until IsEmpty(Selection)
        item = ActiveCell.Value
        Cells(oRow, 1).Value = name
        Cells(oRow, 2).Value = item
        ActiveCell.Offset(0, 1).Select
        oRow = oRow + 1
        item = ""
    Loop

Next

End Sub

我能按建议用IsEmpty解决这个问题。更改了输出位置,如变量oRow中所示

Sub moveToRows()
Dim name As String, item As String
Dim r As Double, oRow As Double
Range("A1").Select
oRow = 5000

For r = 1 To ActiveCell.End(xlDown).Row
    Cells(r, 2).Select
    name = ActiveCell.Offset(0, -1).Value
    If IsEmpty(ActiveCell) Then
        Cells(oRow, 1).Value = name
        oRow = oRow + 1
    End If

    Do Until IsEmpty(Selection)
        item = ActiveCell.Value
        Cells(oRow, 1).Value = name
        Cells(oRow, 2).Value = item
        ActiveCell.Offset(0, 1).Select
        oRow = oRow + 1
        item = ""
    Loop

Next

End Sub

此解决方案速度更快,因为:

  • 它一直读取,直到找到第一个空单元格
  • 不使用“选择”,这通常是缓慢的
  • 给你:

    Sub moveToRows()
    Dim name As String, item As String
    
    Dim shin As Worksheet
    Dim shout As Worksheet
    
    ' Edit the sheet names here if needed
    Set shin = ActiveWorkbook.Sheets("Sheet1")
    Set shout = ActiveWorkbook.Sheets("Sheet2")
    
    Dim r As Double, c As Double, r2 As Double, l As Double
    
    r = 1
    r2 = 1
    
    Do
        c = 1
        name = shin.Cells(r, c)
        If name = "" Then Exit Do
    
        Do
            c = c + 1
            item = shin.Cells(r, c)
            If item = "" Then Exit Do
    
            shout.Cells(r2, 1).Value = name
            shout.Cells(r2, 2).Value = item
    
            r2 = r2 + 1
        Loop
    
        r = r + 1
    Loop
    
    End Sub
    

    此解决方案速度更快,因为:

  • 它一直读取,直到找到第一个空单元格
  • 不使用“选择”,这通常是缓慢的
  • 给你:

    Sub moveToRows()
    Dim name As String, item As String
    
    Dim shin As Worksheet
    Dim shout As Worksheet
    
    ' Edit the sheet names here if needed
    Set shin = ActiveWorkbook.Sheets("Sheet1")
    Set shout = ActiveWorkbook.Sheets("Sheet2")
    
    Dim r As Double, c As Double, r2 As Double, l As Double
    
    r = 1
    r2 = 1
    
    Do
        c = 1
        name = shin.Cells(r, c)
        If name = "" Then Exit Do
    
        Do
            c = c + 1
            item = shin.Cells(r, c)
            If item = "" Then Exit Do
    
            shout.Cells(r2, 1).Value = name
            shout.Cells(r2, 2).Value = item
    
            r2 = r2 + 1
        Loop
    
        r = r + 1
    Loop
    
    End Sub
    

    您应该使用
    IsEmpty(range)
    而不是固定的行和列计数器。使用
    Do直到IsEmpty(…):循环
    我遇到的问题是在另一个工作表中粘贴值并更改活动工作表。选择要粘贴值的空单元格后,循环结束。避免使用
    。选择
    。激活
    ,除非是故意的。使用指定的范围/工作表变量您应该使用
    IsEmpty(范围)
    而不是固定的行和列计数器。使用
    Do直到IsEmpty(…):循环
    我遇到的问题是在另一个工作表中粘贴值并更改活动工作表。选择要粘贴值的空单元格后,循环结束。避免使用
    。选择
    。激活
    ,除非是故意的。使用指定的范围/工作表变量