Vba 如何不使用特殊转置从列复制到行?
此循环用于将值从一张图纸的列复制到另一张图纸的列:Vba 如何不使用特殊转置从列复制到行?,vba,excel,Vba,Excel,此循环用于将值从一张图纸的列复制到另一张图纸的列: Dim ExposureDataInput As Worksheet Dim ManualSimulation As Worksheet Set EDI = Sheets("ExposureDataInput") Set MS = Sheets("ManualSimulation") Dim i As Integer Dim n As Integer For i = 2 To EDI.Range(&
Dim ExposureDataInput As Worksheet
Dim ManualSimulation As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set MS = Sheets("ManualSimulation")
Dim i As Integer
Dim n As Integer
For i = 2 To EDI.Range("B" & Rows.Count).End(xlUp).Row
If EDI.Range("B" & i).Value > 0 Then
n = MS.Range("A" & Rows.Count).End(xlUp).Row + 1
MS.Range("A" & n).Value = EDI.Cells(i, 1).Value
n = MS.Range("B" & Rows.Count).End(xlUp).Row + 1
MS.Range("B" & n).Value = EDI.Cells(i, 2).Value
n = MS.Range("C" & Rows.Count).End(xlUp).Row + 1
MS.Range("C" & n).Value = EDI.Cells(i, 4).Value
n = MS.Range("D" & Rows.Count).End(xlUp).Row + 1
MS.Range("D" & n).Value = EDI.Cells(i, 6).Value
n = MS.Range("E" & Rows.Count).End(xlUp).Row + 1
MS.Range("E" & n).Value = EDI.Cells(i, 8).Value
n = MS.Range("F" & Rows.Count).End(xlUp).Row + 1
MS.Range("F" & n).Value = EDI.Cells(i, 10).Value
n = MS.Range("G" & Rows.Count).End(xlUp).Row + 1
MS.Range("G" & n).Value = EDI.Cells(i, 12).Value
End If
Next i
我试着用同样的原理把一张纸上的列A:A换成另一张纸上的行:
Dim ExposureDataInput As Worksheet
Dim HistoricalDataandExcessReturns As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set HDaER = ThisWorkbook.Worksheets("HistoricalDataandExcessReturns")
Dim k As Integer
Dim y As Integer
For k = 2 To EDI.Range("B" & Rows.Count).End(xlUp).Row
If EDI.Range("B" & k).Value > 0 Then
y = HDaER.Range(Columns.Count & 1).End(xlToLeft).Column + 1
HDaER.Range(y & 1).Value = EDI.Cells(1, k).Value
y = HDaER.Range(Columns.Count & 2).End(xlToLeft).Column + 1
HDaER.Range(y & 2).Value = EDI.Cells(2, k).Value
End If
Next k
列对列中的i
起作用。当我尝试在列中使用k
作为行时,它会给我
运行时错误“1004”
如何将一列复制到一行?我认为问题在于您获取最后一列的方式,请查看下面我的答案: 第一个子段可以写成:
Dim ExposureDataInput As Worksheet
Dim ManualSimulation As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set MS = Sheets("ManualSimulation")
Dim i As Long
Dim n As Long
For i = 2 To EDI.Range("B" & EDI.Rows.Count).End(xlUp).Row
If EDI.Range("B" & i).Value > 0 Then
n = MS.Cells(MS.Rows.Count, "A").End(xlUp).Row + 1
'get the next free row without data on Column A
MS.Range("A" & n).Value = EDI.Cells(i, 1).Value
MS.Range("B" & n).Value = EDI.Cells(i, 2).Value
MS.Range("C" & n).Value = EDI.Cells(i, 4).Value
MS.Range("D" & n).Value = EDI.Cells(i, 6).Value
MS.Range("E" & n).Value = EDI.Cells(i, 8).Value
MS.Range("F" & n).Value = EDI.Cells(i, 10).Value
MS.Range("G" & n).Value = EDI.Cells(i, 12).Value
End If
Next i
Dim ExposureDataInput As Worksheet
Dim HistoricalDataandExcessReturns As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set HDaER = ThisWorkbook.Worksheets("HistoricalDataandExcessReturns")
Dim k As Long
Dim y As Long
For k = 1 To EDI.Cells(EDI.Rows.Count, "B").End(xlUp).Row
If EDI.Range("B" & k).Value > 0 Then
y = HDaER.Cells(1, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of column on row 1
HDaER.Cells(1, y).Value = EDI.Cells(k, 1).Value
y = HDaER.Cells(2, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of columns on row 2?
HDaER.Cells(2, y).Value = EDI.Cells(k, 2).Value
End If
Next k
第二部分可以写成:
Dim ExposureDataInput As Worksheet
Dim ManualSimulation As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set MS = Sheets("ManualSimulation")
Dim i As Long
Dim n As Long
For i = 2 To EDI.Range("B" & EDI.Rows.Count).End(xlUp).Row
If EDI.Range("B" & i).Value > 0 Then
n = MS.Cells(MS.Rows.Count, "A").End(xlUp).Row + 1
'get the next free row without data on Column A
MS.Range("A" & n).Value = EDI.Cells(i, 1).Value
MS.Range("B" & n).Value = EDI.Cells(i, 2).Value
MS.Range("C" & n).Value = EDI.Cells(i, 4).Value
MS.Range("D" & n).Value = EDI.Cells(i, 6).Value
MS.Range("E" & n).Value = EDI.Cells(i, 8).Value
MS.Range("F" & n).Value = EDI.Cells(i, 10).Value
MS.Range("G" & n).Value = EDI.Cells(i, 12).Value
End If
Next i
Dim ExposureDataInput As Worksheet
Dim HistoricalDataandExcessReturns As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set HDaER = ThisWorkbook.Worksheets("HistoricalDataandExcessReturns")
Dim k As Long
Dim y As Long
For k = 1 To EDI.Cells(EDI.Rows.Count, "B").End(xlUp).Row
If EDI.Range("B" & k).Value > 0 Then
y = HDaER.Cells(1, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of column on row 1
HDaER.Cells(1, y).Value = EDI.Cells(k, 1).Value
y = HDaER.Cells(2, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of columns on row 2?
HDaER.Cells(2, y).Value = EDI.Cells(k, 2).Value
End If
Next k
我相信问题在于你试图获得最后一篇专栏文章的方式,请看下面我的答案: 第一个子段可以写成:
Dim ExposureDataInput As Worksheet
Dim ManualSimulation As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set MS = Sheets("ManualSimulation")
Dim i As Long
Dim n As Long
For i = 2 To EDI.Range("B" & EDI.Rows.Count).End(xlUp).Row
If EDI.Range("B" & i).Value > 0 Then
n = MS.Cells(MS.Rows.Count, "A").End(xlUp).Row + 1
'get the next free row without data on Column A
MS.Range("A" & n).Value = EDI.Cells(i, 1).Value
MS.Range("B" & n).Value = EDI.Cells(i, 2).Value
MS.Range("C" & n).Value = EDI.Cells(i, 4).Value
MS.Range("D" & n).Value = EDI.Cells(i, 6).Value
MS.Range("E" & n).Value = EDI.Cells(i, 8).Value
MS.Range("F" & n).Value = EDI.Cells(i, 10).Value
MS.Range("G" & n).Value = EDI.Cells(i, 12).Value
End If
Next i
Dim ExposureDataInput As Worksheet
Dim HistoricalDataandExcessReturns As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set HDaER = ThisWorkbook.Worksheets("HistoricalDataandExcessReturns")
Dim k As Long
Dim y As Long
For k = 1 To EDI.Cells(EDI.Rows.Count, "B").End(xlUp).Row
If EDI.Range("B" & k).Value > 0 Then
y = HDaER.Cells(1, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of column on row 1
HDaER.Cells(1, y).Value = EDI.Cells(k, 1).Value
y = HDaER.Cells(2, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of columns on row 2?
HDaER.Cells(2, y).Value = EDI.Cells(k, 2).Value
End If
Next k
第二部分可以写成:
Dim ExposureDataInput As Worksheet
Dim ManualSimulation As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set MS = Sheets("ManualSimulation")
Dim i As Long
Dim n As Long
For i = 2 To EDI.Range("B" & EDI.Rows.Count).End(xlUp).Row
If EDI.Range("B" & i).Value > 0 Then
n = MS.Cells(MS.Rows.Count, "A").End(xlUp).Row + 1
'get the next free row without data on Column A
MS.Range("A" & n).Value = EDI.Cells(i, 1).Value
MS.Range("B" & n).Value = EDI.Cells(i, 2).Value
MS.Range("C" & n).Value = EDI.Cells(i, 4).Value
MS.Range("D" & n).Value = EDI.Cells(i, 6).Value
MS.Range("E" & n).Value = EDI.Cells(i, 8).Value
MS.Range("F" & n).Value = EDI.Cells(i, 10).Value
MS.Range("G" & n).Value = EDI.Cells(i, 12).Value
End If
Next i
Dim ExposureDataInput As Worksheet
Dim HistoricalDataandExcessReturns As Worksheet
Set EDI = Sheets("ExposureDataInput")
Set HDaER = ThisWorkbook.Worksheets("HistoricalDataandExcessReturns")
Dim k As Long
Dim y As Long
For k = 1 To EDI.Cells(EDI.Rows.Count, "B").End(xlUp).Row
If EDI.Range("B" & k).Value > 0 Then
y = HDaER.Cells(1, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of column on row 1
HDaER.Cells(1, y).Value = EDI.Cells(k, 1).Value
y = HDaER.Cells(2, HDaER.Columns.Count).End(xlToLeft).Column + 1
'count the number of columns on row 2?
HDaER.Cells(2, y).Value = EDI.Cells(k, 2).Value
End If
Next k
实际上,您应该得到的错误是
6
-Overflow
请尝试以下代码:
Sub TestMe()
Dim a As Integer
a = Rows.Count
End Sub
您将得到一个溢出错误,因为整数是从-32768
到32767
,Excel中的行数超过100万。这些列是16384
,因此它们足以容纳整数
将整数
替换为长
,然后重试。实际上,您应该得到的错误是6
-溢出
请尝试以下代码:
Sub TestMe()
Dim a As Integer
a = Rows.Count
End Sub
您将得到一个溢出错误,因为整数是从-32768
到32767
,Excel中的行数超过100万。这些列是16384
,因此它们足以容纳整数
将整数
替换为长
,然后重试。检查y的值,它可能不是您期望的值。您在第二个子表中声明的工作表在哪里?在第一个子程序中,您设置了EDI=Sheets(“ExposureDataInput”)
,但在第二个子程序中,我看不到任何类似的内容…@Xabier,我刚刚更正了这一点。您应该将k和y声明为Long而不是Integer,因为Excel中的单元格多于整数所能处理的单元格数。。。和i和n一样,@Vincent G,我试图复制包含文本的格式为“General”的单元格。它在列与列之间工作,但不在列与行之间工作。检查y的值,它可能不是您期望的值。您在第二个子表中的何处声明了工作表?在第一个子程序中,您设置了EDI=Sheets(“ExposureDataInput”)
,但在第二个子程序中,我看不到任何类似的内容…@Xabier,我刚刚更正了这一点。您应该将k和y声明为Long而不是Integer,因为Excel中的单元格多于整数所能处理的单元格数。。。和i和n一样,@Vincent G,我试图复制包含文本的格式为“General”的单元格。它在列与列之间工作,但不在列与行之间工作。您是否检查了最后一列第1行和第2行,如HDaER.Cells(2,y)。Value=EDI.Cells(2,k)。Value
表示如果列B上的EDI值大于0,则写入最后一列。。。我不太确定你想做什么…@I.Я。纽布更新了我的答案,请再试一次,我相信它现在应该会像你预期的那样工作。:)它应该将值从A列传递到第1行,从B列传递到第2行,我还更新了我的答案以复制标题。如果有帮助的话,请你把我的回答记下来作为回答好吗?谢谢:)@I.Я.Newb主要是范围(y&2)
这不是一个可接受的范围,所以我将其修改为单元格(2,y)
,意思是第2行,第y列。对于EDI.Cells(k,2)
你有k和2,反过来…@I.Я.Newb有时很容易犯这样的错误,因为范围(“A2”),你有一个A是列,2是行,而使用单元格(2,1),2是行,1是列,所以范围(“A2”)=单元格(2,1)你检查过你的最后一列第1行和第2行了吗,asHDaER.Cells(2,y).Value=EDI.Cells(2,k).Value
表示如果列B上的EDI值大于0,则写入最后一列。。。我不太确定你想做什么…@I.Я。纽布更新了我的答案,请再试一次,我相信它现在应该会像你预期的那样工作。:)它应该将值从A列传递到第1行,从B列传递到第2行,我还更新了我的答案以复制标题。如果有帮助的话,请你把我的回答记下来作为回答好吗?谢谢:)@I.Я.Newb主要是范围(y&2)
这不是一个可接受的范围,所以我将其修改为单元格(2,y)
,意思是第2行,第y列。对于EDI.Cells(k,2)
你有k和2,反过来…@I.Я.Newb有时很容易犯这个错误,因为范围(“A2”),你有一个是列,2是行,而使用单元格(2,1),2是行,1是列,所以范围(“A2”)=单元格(2,1)我在某一点上遇到了这个错误,我更换了Ìnteger
wLong
。我感谢您的努力。虽然,@Xabier提供了一个解决方案,但在改进代码的第一部分时,您的回答非常周到和迅速。也许它会为另一个问题提供解决方案。但是,如果您对问题的答案或上述评论有任何补充,请随意添加,而您的评论的高价值肯定会以适当的堆栈溢出方式获得奖励。感谢您的时间和努力。我曾经遇到过这个错误,我更换了Ìnteger
wLong
。我感谢您的努力。虽然,@Xabier提供了一个解决方案,但在改进代码的第一部分时,您的回答非常周到和迅速。也许它会为另一个问题提供解决方案。但是,如果您对问题的答案或上述评论有任何补充,请随意添加,而您的评论的高价值肯定会以适当的堆栈溢出方式获得奖励。谢谢你的时间和努力。