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
Vba 如何不使用特殊转置从列复制到行?_Vba_Excel - Fatal编程技术网

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行了吗,as
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”),你有一个是列,2是行,而使用单元格(2,1),2是行,1是列,所以范围(“A2”)=单元格(2,1)我在某一点上遇到了这个错误,我更换了
Ìnteger
w
Long
。我感谢您的努力。虽然,@Xabier提供了一个解决方案,但在改进代码的第一部分时,您的回答非常周到和迅速。也许它会为另一个问题提供解决方案。但是,如果您对问题的答案或上述评论有任何补充,请随意添加,而您的评论的高价值肯定会以适当的堆栈溢出方式获得奖励。感谢您的时间和努力。我曾经遇到过这个错误,我更换了
Ìnteger
w
Long
。我感谢您的努力。虽然,@Xabier提供了一个解决方案,但在改进代码的第一部分时,您的回答非常周到和迅速。也许它会为另一个问题提供解决方案。但是,如果您对问题的答案或上述评论有任何补充,请随意添加,而您的评论的高价值肯定会以适当的堆栈溢出方式获得奖励。谢谢你的时间和努力。