Excel VBA将许多列转换为两列-我做错了什么?
嗨,我对vba不是很熟悉。但我提出了以下方法,将一个包含多个列的电子表格转换为两个列。示例显示了包含多个项目的名称。我需要一行,每个项目的名称 您可以看到每行的长度可以更改。我知道有多少行。我制作了以下脚本,但似乎无法使其正常工作。请提供任何关于如何修复的建议都非常有用 这就是我所拥有的: 名称1 |项目1 |项目2 |项目3 |项目4 名称2 |项目5 |项目3 |项目19 这就是我需要的: 名称1 |项目1 名称1 |项目2 名称1 |项目3 名称1 |项目4 名称2 |项目5 名称2 |项目3 名称2 |项目19Excel 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 |项
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(…):循环
我遇到的问题是在另一个工作表中粘贴值并更改活动工作表。选择要粘贴值的空单元格后,循环结束。避免使用。选择和。激活,除非是故意的。使用指定的范围/工作表变量