Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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,我在一张纸上有一个专栏 我正试图将其转移到同一工作簿上的另一张工作表中。它必须看起来像下面的图像。值必须出现在第一个ID列之后。 在阅读和观看视频后,我尝试了下面的代码。我进一步尝试识别Sheet2中的最后一行,并将值从Sheet1粘贴到下一行 Sub Transpose() Dim SourceSheet As Worksheet Dim TransferSheet As Worksheet Dim inRange, outRange As Range Dim finalrow As I

我在一张纸上有一个专栏

我正试图将其转移到同一工作簿上的另一张工作表中。它必须看起来像下面的图像。值必须出现在第一个ID列之后。

在阅读和观看视频后,我尝试了下面的代码。我进一步尝试识别Sheet2中的最后一行,并将值从Sheet1粘贴到下一行

Sub Transpose()

Dim SourceSheet As Worksheet
Dim TransferSheet As Worksheet
Dim inRange, outRange As Range
Dim finalrow As Integer
Dim i As Integer

'Assign
Set SourceSheet = Sheets("Sheet1")
Set TransferSheet = Sheets("Sheet2")

SourceSheet.Activate
Set inRange = ActiveSheet.Range("B2:B11")
inRange.Copy

'TRANSFER
TransferSheet.Activate
finalrow = TransferSheet.Cells(Rows.Count, 1).End(xlUp).Row 'find last row

For i = 2 To 11
    outRange = TransferSheet.Range(Cells(ii, finalrow), Cells(ii, finalrow))
    outRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
Next i

End Sub
请试试这个:

   Dim SourceSheet As Worksheet, TransferSheet As Worksheet
   Dim rowVal As Variant, nrCol As Long, ColumnLetter As String
   Set SourceSheet = ActiveWorkbook.Sheets("Sheet1")
   Set TransferSheet = ActiveWorkbook.Sheets("Sheet2")
     rowVal = SourceSheet.Range("B2:B11")
     nrCol = UBound(rowVal)
     ColumnLetter = Split(Cells(1, nrCol + 1).Address, "$")(1)
     TransferSheet.Range("B2:" & ColumnLetter & 2) = Application.WorksheetFunction.Transpose(rowVal)
因此,代码会像您一样声明这两个页面。 然后B:B列中的范围包括在
rowVal
数组中。列数的定义类似于
Ubound(rowVal)
,要粘贴值的工作表的列字母的确定类似于
ColumnLetter
<之所以使用code>nrCol+1,是因为粘贴单元格将位于B:B列(第二列),并且计数不会从第一列开始。
然后,使用
Transpose
函数将数组内容粘贴到
TransferSheet
相应的行中。“范围”列是使用先前确定的
ColumnLetter
..

构建的。下面是我评论中的一个示例

Option Explicit
Public Sub MyTranspose()
    'This assumes column to row transpose
    Dim SourceSheet As Worksheet, TransferSheet As Worksheet
    Dim inRange As Range, inRangeValues() As Variant, outRangeValues() As Variant
    Dim finalRow As Long

    Set SourceSheet = ThisWorkbook.Worksheets("Sheet1") 'Assign reference
    Set TransferSheet = ThisWorkbook.Worksheets("Sheet2")
    Set inRange = SourceSheet.Range("B2:B11")
    inRangeValues() = inRange.Value 'generate 2d array
    outRangeValues = Application.Transpose(inRangeValues)

    With TransferSheet 'Hold reference to parent worksheet
        finalRow = .Cells(Rows.Count, 1).End(xlUp).Row 'find last row
        If inRange.Columns.Count > 1 Then '2d array for output
            .Cells(finalRow + 1, 2).Resize(UBound(outRangeValues, 1), UBound(outRangeValues, 2)) = outRangeValues 'Resize according to output array dimensions
        Else '1D array for output
            .Cells(finalRow + 1, 2).Resize(1, UBound(outRangeValues, 1)) = outRangeValues
            End If
    End With
End Sub
以下是我的评论(还有一点):

使用
Long
而不是
Integer
inRange
需要显式声明为
Range
而不是隐式声明为
Variant
。当
Dim处于范围内时,超出范围作为范围
outRange
是一个
范围
。您需要
调宽范围内为范围,范围外为范围

创建对范围对象的引用时,您需要
设置
,例如
设置范围=TransferSheet.Range(单元格(ii,finalrow),单元格(ii,finalrow))
;这里的
单元格
将引用当前活动的工作表,并且从未声明过
ii
,但您使用的是一个名为
i
-typo的循环变量?除此之外,我不确定
pastespecial
是否也能在那里工作

我会(取决于
inRange
的大小,因为
Transpose
有一个限制,然后会截断或抱怨)读入数组,使用
Transpose
函数并使用
Resize
写出


使用
工作表
集合而不是
工作表
。使用父图纸名称完全限定单元格引用;因为您有这些in变量,所以只需使用相应的变量名。通过这种方式,您不需要
Activesheet
Activate
,因此您的代码不太容易出现错误(明确的工作表引用),而且速度更快(因为不激活工作表)


为子对象指定与现有VBA方法不同的名称(比我使用的更好,但仍然是描述性的。

使用Long而不是Integer,inRange需要显式声明为range,而不是隐式声明为Variant。使用Dim inRange,outRange as range only outRange是一个range。您需要Dim inRange as range,outRange as range。创建对range对象的引用时需要set,例如set outRange=TransferSheet.Range(Cells(ii,finalrow)、Cells(ii,finalrow))和ii从未声明过,但您正在使用一个名为i-typo的循环变量?除此之外,我不确定pastespecial是否也能在那里工作。我会(取决于范围的大小)读入数组使用转置函数并用调整大小写出来完全限定单元格引用与父工作表名称。使用工作表集合而不是工作表。您不需要Activesheet并激活。使用适当的工作表变量限定您的范围。我感谢对问题所做的更改。我将确保我的后续问题ns的格式也是一样的。如果你不介意的话,我希望你能给我看看你第一条评论的例子,这样我也可以根据你的例子来研究。我对你的意思有一个很好的理解,但是为了确保我不会犯错误,也为了我能学习正确的编码,我更喜欢从一个示例代码中学习。非常感谢简单易懂,我想……但如果你认为有必要的话,我会补充一些意见。我欢迎你的任何评论。我也养成了学习基于标准的正确方法的习惯。如果你有更好的建议,请这样做。@赛诺德:我的代码没有解决你的问题吗?你试过了吗?我想相信。它比标准的更有效。我将在另一个应用程序中尝试它。在我的项目中,我需要一些将插入下一个空行的内容。但是,这对我来说是一个很好的学习选择。非常感谢。经过一些轻微的修改,我已经让你的代码适合我的项目。也感谢你的评论和见解。我将学习RN关于你的洞察力,然后在这个项目中继续进行。非常感谢。有第三个案例你需要考虑哪一个是一个单元格作为输入。