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
最后一列命令间歇覆盖现有单元格vba_Vba_Excel - Fatal编程技术网

最后一列命令间歇覆盖现有单元格vba

最后一列命令间歇覆盖现有单元格vba,vba,excel,Vba,Excel,我正在开发一个程序,在这个程序中,我需要将多个工作表中的数据复制并重新组织到一个主工作表中。每张纸一行。从G列到R列,我需要设置一个if语句,这样,如果工作表上的值大于0,它将被复制/粘贴到其行中的下一个可用列。为了进行测试,我去掉了if语句,所以我总是得到一个结果。我遇到的问题是,在数据的第一行上,“B”列被覆盖,后续行按预期工作。你知道为什么会这样吗 Sub CopyRangeFromMultiWorksheets() Dim sh As Worksheet Dim

我正在开发一个程序,在这个程序中,我需要将多个工作表中的数据复制并重新组织到一个主工作表中。每张纸一行。从G列到R列,我需要设置一个if语句,这样,如果工作表上的值大于0,它将被复制/粘贴到其行中的下一个可用列。为了进行测试,我去掉了if语句,所以我总是得到一个结果。我遇到的问题是,在数据的第一行上,“B”列被覆盖,后续行按预期工作。你知道为什么会这样吗

    Sub CopyRangeFromMultiWorksheets()
    Dim sh As Worksheet
    Dim DestSh As Worksheet
    Dim LastR As Long
    Dim LastC As Long

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    'Delete the sheet "Master" if it exist
    Application.DisplayAlerts = False
    On Error Resume Next
    ActiveWorkbook.Worksheets("Master").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    'Add a worksheet with the name "Master"
    Set DestSh = ActiveWorkbook.Worksheets.Add
    DestSh.Name = "Master"

    'loop through all worksheets and copy the data to the DestSh
    For Each sh In ActiveWorkbook.Worksheets
        If sh.Name <> DestSh.Name Then

            'Find the last row with data on the DestSh
            With ActiveSheet
            LastR = .Cells(.Rows.Count, "a").End(xlUp).Row
            End With

            With ActiveSheet
            LastC = .Cells(LastR, .Columns.Count).End(xlToLeft).Column
            End With                

            sh.Range("B2").Copy
            DestSh.Cells(LastR + 1, "A").PasteSpecial xlPasteValues   'customer'
            DestSh.Cells(LastR + 1, "B").Value = ("Glass")            'Product"
            DestSh.Cells(LastR + 1, "C").Value = sh.Name              'Color Name
            sh.Range("H32").Copy
            DestSh.Cells(LastR + 1, "D").PasteSpecial xlPasteValues   'based on QTY'
            DestSh.Cells(LastR + 1, "E").Value = ("Liters")           'based on Units'
            DestSh.Cells(LastR + 1, "F").Value = ("Clear")           'Base'

            sh.Range("F13").Copy
            DestSh.Cells(LastR + 1, LastC + 1).PasteSpecial xlPasteValues   'THIS IS THE LINE GIVING ME TROUBLE'

        End If
    Next

ExitTheSub:

    Application.Goto DestSh.Cells(1)

    'AutoFit the column width in the DestSh sheet
    DestSh.Columns.AutoFit

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub
多工作表()的子副本范围
将sh设置为工作表
将DestSh设置为工作表
暗淡的最后一样长
长的
应用
.ScreenUpdate=False
.EnableEvents=False
以
'删除工作表“主控”如果存在
Application.DisplayAlerts=False
出错时继续下一步
活动工作簿。工作表(“主”)。删除
错误转到0
Application.DisplayAlerts=True
'添加名为“Master”的工作表'
设置DestSh=ActiveWorkbook.Worksheets.Add
DestSh.Name=“Master”
'循环浏览所有工作表并将数据复制到DestSh
对于ActiveWorkbook.工作表中的每个sh
如果sh.Name DestSh.Name那么
'查找DestSh上包含数据的最后一行
使用ActiveSheet
LastR=.Cells(.Rows.Count,“a”).End(xlUp).Row
以
使用ActiveSheet
LastC=.Cells(LastR、.Columns.Count).End(xlToLeft).Column
以
sh.Range(“B2”)。副本
DestSh.单元格(LastR+1,“A”).paste特殊XLPaste值“客户”
设计单元(LastR+1,“B”)。值=(“玻璃”)产品
DestSh.Cells(LastR+1,“C”).Value=sh.Name'颜色名称
sh.Range(“H32”)。副本
删除单元格(LastR+1,“D”)。粘贴特殊XLPaste值“基于数量”
设计单元(LastR+1,“E”)。值=(“升”)“基于单位”
DestSh.Cells(LastR+1,“F”).Value=(“Clear”)“Base”
sh.Range(“F13”)。副本
DestSh.Cells(LastR+1,LastC+1).paste特殊XLPaste值“这是给我带来麻烦的那行”
如果结束
下一个
退出主题:
应用程序。转到DestSh。单元格(1)
'自动调整DestSh工作表中的列宽
DestSh.Columns.AutoFit
应用
.ScreenUpdate=True
.EnableEvents=True
以
端接头

尝试用
DestSh
替换
ActiveSheet
,可能这就是问题的原因:

'Find the last row with data on the DestSh
With DestSh
    LastR = .Cells(.Rows.Count, "a").End(xlUp).Row
End With

With DestSh
    LastC = .Cells(LastR, .Columns.Count).End(xlToLeft).Column
End With

在您的情况下,
LastC=.Cells(LastR,.Columns.Count).End(xlToLeft).Column
不返回父工作表中的最后一列,而是返回行
LastR
中的最后一列。对于真正的最后一列,请尝试以下操作:

LastC = LastRow(DestSh)

Function LastRow(sh As Worksheet)
    On Error Resume Next
    LastRow = sh.Cells.Find(What:="*", _
                            After:=sh.Range("A1"), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Row
    On Error GoTo 0
End Function

这是值得一读的-

你能不能也放一些屏幕截图?代码实际上看起来还不错。我怀疑问题出在你的
ActiveSheet
上。如果你的
ActiveSheet
是新添加的“Master”表,你会在第一个实例中将值添加到B列,因为当你得到该列的计数时,这是在您在工作表中添加任何数据之前,因此在此阶段,您的计数将为1。一旦开始添加数据,您将获得正确的列计数。在您在工作表中添加值后,尝试获取列和行计数。此外,根据@vityta建议,我强烈建议不要使用
ActiveSheet
。始终保持质量吹嘘你的sheets@Zac我尝试了Vityata的建议,但我得到了相同的结果。我的建议与Vityata的不同。我建议您在添加行中的值后获得列计数。我引用Vityata的答案的唯一原因是因为我不喜欢使用
ActiveSheet
。这会给您带来麻烦问题是,您不是在寻找最后一列,而是在寻找最后一行的最后一列。这是非常不同的。谢谢,但它仍然在覆盖。我正在向op添加一个屏幕截图。现在,我已将包含最后一个c定义的“With statement”替换为您刚刚发布的代码,并且我得到了“error 424 object required”“调试指向该块。谢谢您的帮助。顺便说一句@hithenameisbj-请仔细查看代码,其中有一些
.rng
,未定义。一般来说,请参阅编辑。这在lastc的定义下为我提供了一个“预期结束子”。如果我试图在不改变代码的情况下再次运行,我会得到指向“for Each sh in”的“for control variable ready in use”。此时,我正在考虑设置一个固定的粘贴位置,让它使用if语句为单元格指定“0”值,并使用单独的代码删除0。@hithenameisbj-应将
LastC=LastRow(DestSh)
放在代码中
LastC=.cells(LastR,.Columns.Count).End(xlToLeft).Column
的位置。然后,在代码的最后一个
End子部分
之后,在Error Resume Next LastRow=sh.Cells上编写
函数LastRow(sh作为工作表)。查找(What:=“*”,…等