Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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 单击按钮后使用宏将数据保存到另一个excel工作簿_Vba_Excel - Fatal编程技术网

Vba 单击按钮后使用宏将数据保存到另一个excel工作簿

Vba 单击按钮后使用宏将数据保存到另一个excel工作簿,vba,excel,Vba,Excel,我有两本工作簿:main.xlsm(主工作簿)和backup.xlsx(备份)。现在,我想要的是在单击使用宏的按钮后将备份副本保存到backup.xlsx。我有下面的代码,但我不知道为什么它不起作用 Sub ToggleEvents(blnState As Boolean) With Application .DisplayAlerts = blnState .EnableEvents = blnState .ScreenUpdating

我有两本工作簿:main.xlsm(主工作簿)和backup.xlsx(备份)。现在,我想要的是在单击使用宏的按钮后将备份副本保存到backup.xlsx。我有下面的代码,但我不知道为什么它不起作用

Sub ToggleEvents(blnState As Boolean)
    With Application
        .DisplayAlerts = blnState
        .EnableEvents = blnState
        .ScreenUpdating = blnState
        If blnState Then .CutCopyMode = False
        If blnState Then .StatusBar = False
    End With
End Sub

Function WbOpen(wbName As String) As Boolean
    On Error Resume Next
    WbOpen = Len(Workbooks(wbName).Name)
End Function

Sub Transfer()
Dim c As Integer
Dim Ws1 As Worksheet, Ws2 As Worksheet

Dim wkb As Workbook
Dim FilePath As String, FileName As String
Dim blnOpened As Boolean

'the next two refer to the destination file path and filename
FilePath = "C:\Newfolder\"
FileName = "backup.xlsx"

Call ToggleEvents(False)
    If WbOpen(FileName) = True Then
    Set Ws2 = Workbooks("backup.xlsx").Sheets("RAW")
    blnOpened = False
    Else
        If Right(FilePath, 1) <> Application.PathSeparator Then
            FilePath = FilePath & Application.PathSeparator
        End If
        Set wkb = Workbooks.Open(FilePath & FileName, , , , "backup.xlsx")
        Set Ws2 = Workbooks("backup.xlsx").Sheets("RAW")


        blnOpened = True
    End If

    Set Ws1 = ThisWorkbook.Sheets("ProdTracker")

c = 2
Do While Ws2.Range("A" & c) <> ""
    c = c + 1
    Loop
    Ws2.Range("A" & c) = Ws1.Range("AA2")
    Ws2.Range("B" & c) = Ws1.Range("AA3")
    Ws2.Range("C" & c) = Ws1.Range("AA42")
    Ws2.Range("D" & c) = Ws1.Range("AA4")
    Ws2.Range("E" & c) = Ws1.Range("AA5")
    Ws2.Range("F" & c) = Ws1.Range("AA6")
    Ws2.Range("G" & c) = Ws1.Range("AA7")
    Ws2.Range("H" & c) = Ws1.Range("AA8")
    Ws2.Range("I" & c) = Ws1.Range("AA9")
    Ws2.Range("J" & c) = Ws1.Range("AA10")
    Ws2.Range("K" & c) = Ws1.Range("AA11")
    Ws2.Range("L" & c) = Ws1.Range("AA12")
    Ws2.Range("M" & c) = Ws1.Range("AA13")
    Ws2.Range("N" & c) = Ws1.Range("AA14")
    Ws2.Range("O" & c) = Ws1.Range("AA15")
    Ws2.Range("P" & c) = Ws1.Range("AA16")
    Ws2.Range("Q" & c) = Ws1.Range("AA17")
    Ws2.Range("R" & c) = Ws1.Range("AA18")
    Ws2.Range("S" & c) = Ws1.Range("AA19")
    Ws2.Range("T" & c) = Ws1.Range("AA20")
    Ws2.Range("U" & c) = Ws1.Range("AA21")
    Ws2.Range("V" & c) = Ws1.Range("AA22")
    Ws2.Range("W" & c) = Ws1.Range("AA23")
    Ws2.Range("X" & c) = Ws1.Range("AA24")
    Ws2.Range("Y" & c) = Ws1.Range("AA25")
    Ws2.Range("Z" & c) = Ws1.Range("AA26")
    Ws2.Range("AA" & c) = Ws1.Range("AA27")
    Ws2.Range("AB" & c) = Ws1.Range("AA28")
    Ws2.Range("AC" & c) = Ws1.Range("AA29")
    Ws2.Range("AD" & c) = Ws1.Range("AA30")
    Ws2.Range("AE" & c) = Ws1.Range("AA31")
    Ws2.Range("AF" & c) = Ws1.Range("AA32")
    Ws2.Range("AG" & c) = Ws1.Range("AA33")
    Ws2.Range("AH" & c) = Ws1.Range("AA34")
    Ws2.Range("AI" & c) = Ws1.Range("AA35")
    Ws2.Range("AJ" & c) = Ws1.Range("AA36")
    Ws2.Range("AK" & c) = Ws1.Range("AA37")
    Ws2.Range("AL" & c) = Ws1.Range("AA38")
    Ws2.Range("AM" & c) = Ws1.Range("AA39")
    Ws2.Range("AN" & c) = Ws1.Range("AA40")
    Ws2.Range("AO" & c) = Ws1.Range("AA41")
    Ws2.Range("AP" & c) = Ws1.Range("AA43")
    Ws2.Range("AQ" & c) = Ws1.Range("AA44")
    Ws2.Range("AR" & c) = Ws1.Range("AA45")
    Ws2.Range("AS" & c) = Ws1.Range("AA46")
    Ws2.Range("AT" & c) = Ws1.Range("AA47")
    Ws2.Range("AU" & c) = Ws1.Range("AA48")
    Ws2.Range("AV" & c) = Ws1.Range("AA49")
    Ws2.Range("AW" & c) = Ws1.Range("AA50")
    Ws2.Range("AX" & c) = Ws1.Range("AA51")
    Ws2.Range("AY" & c) = Ws1.Range("AA52")


        If blnOpened = True Then
        wkb.Close SaveChanges:=True
        End If
End Sub
子切换事件(blnState为布尔值)
应用
.DisplayAlerts=blnState
.EnableEvents=blnState
.ScreenUpdate=blnState
如果为blnState,则.CutCopyMode=False
如果为blnState,则.StatusBar=False
以
端接头
函数WbOpen(wbName为字符串)为布尔值
出错时继续下一步
WbOpen=Len(工作簿(wbName).Name)
端函数
转帐
作为整数的Dim c
将Ws1标注为工作表,将Ws2标注为工作表
将wkb设置为工作簿
将文件路径设置为字符串,文件名设置为字符串
变暗bln为布尔值
'下两个是指目标文件路径和文件名
FilePath=“C:\Newfolder\”
FileName=“backup.xlsx”
调用切换事件(False)
如果WbOpen(FileName)=True,则
设置Ws2=工作簿(“backup.xlsx”).工作表(“原始”)
blnopend=False
其他的
如果正确(FilePath,1)Application.PathSeparator,则
FilePath=FilePath&Application.PathSeparator
如果结束
设置wkb=Workbooks.Open(文件路径和文件名,,“backup.xlsx”)
设置Ws2=工作簿(“backup.xlsx”).工作表(“原始”)
blnOpened=True
如果结束
设置Ws1=ThisWorkbook.Sheets(“ProdTracker”)
c=2
当Ws2.Range(“A”和c)”时执行此操作
c=c+1
环
Ws2.Range(“A”和c)=Ws1.Range(“AA2”)
Ws2.范围(“B”和c)=Ws1.范围(“AA3”)
Ws2.Range(“C”和C)=Ws1.Range(“AA42”)
Ws2.范围(“D”和c)=Ws1.范围(“AA4”)
Ws2.范围(“E”&c)=Ws1.范围(“AA5”)
Ws2.范围(“F”&c)=Ws1.范围(“AA6”)
Ws2.范围(“G”和c)=Ws1.范围(“AA7”)
Ws2.范围(“H”和c)=Ws1.范围(“AA8”)
Ws2.Range(“I”和c)=Ws1.Range(“AA9”)
Ws2.范围(“J”和c)=Ws1.范围(“AA10”)
Ws2.范围(“K”&c)=Ws1.范围(“AA11”)
Ws2.范围(“L”和c)=Ws1.范围(“AA12”)
Ws2.范围(“M”和c)=Ws1.范围(“AA13”)
Ws2.Range(“N”和c)=Ws1.Range(“AA14”)
Ws2.范围(“O”&c)=Ws1.范围(“AA15”)
Ws2.范围(“P”&c)=Ws1.范围(“AA16”)
Ws2.范围(“Q”&c)=Ws1.范围(“AA17”)
Ws2.范围(“R”&c)=Ws1.范围(“AA18”)
Ws2.范围(“S”和c)=Ws1.范围(“AA19”)
Ws2.范围(“T”和c)=Ws1.范围(“AA20”)
Ws2.范围(“U”和c)=Ws1.范围(“AA21”)
Ws2.范围(“V”&c)=Ws1.范围(“AA22”)
Ws2.范围(“W”&c)=Ws1.范围(“AA23”)
Ws2.范围(“X”&c)=Ws1.范围(“AA24”)
Ws2.范围(“Y”和c)=Ws1.范围(“AA25”)
Ws2.范围(“Z”&c)=Ws1.范围(“AA26”)
Ws2.范围(“AA”&c)=Ws1.范围(“AA27”)
Ws2.范围(“AB”&c)=Ws1.范围(“AA28”)
Ws2.范围(“AC”&c)=Ws1.范围(“AA29”)
Ws2.范围(“AD”&c)=Ws1.范围(“AA30”)
Ws2.范围(“AE”&c)=Ws1.范围(“AA31”)
Ws2.范围(“AF”&c)=Ws1.范围(“AA32”)
Ws2.范围(“AG”&c)=Ws1.范围(“AA33”)
Ws2.范围(“AH”&c)=Ws1.范围(“AA34”)
Ws2.范围(“AI”&c)=Ws1.范围(“AA35”)
Ws2.范围(“AJ”&c)=Ws1.范围(“AA36”)
Ws2.范围(“AK”&c)=Ws1.范围(“AA37”)
Ws2.范围(“AL”&c)=Ws1.范围(“AA38”)
Ws2.范围(“AM”&c)=Ws1.范围(“AA39”)
Ws2.Range(“AN”&c)=Ws1.Range(“AA40”)
Ws2.范围(“AO”&c)=Ws1.范围(“AA41”)
Ws2.范围(“AP”&c)=Ws1.范围(“AA43”)
Ws2.范围(“AQ”&c)=Ws1.范围(“AA44”)
Ws2.范围(“AR”&c)=Ws1.范围(“AA45”)
Ws2.Range(“AS”&c)=Ws1.Range(“AA46”)
Ws2.Range(“AT”&c)=Ws1.Range(“AA47”)
Ws2.范围(“AU”&c)=Ws1.范围(“AA48”)
Ws2.范围(“AV”&c)=Ws1.范围(“AA49”)
Ws2.范围(“AW”&c)=Ws1.范围(“AA50”)
Ws2.Range(“AX”&c)=Ws1.Range(“AA51”)
Ws2.范围(“AY”&c)=Ws1.范围(“AA52”)
如果blnopend=True,则
wkb.Close SaveChanges:=真
如果结束
端接头

在循环中,您将数据分配给ws2工作簿,然后保存/关闭wkb。我认为将wkb添加到循环中可以完成此工作。

您能给我们一些线索吗?可能是哪一行崩溃了,错误消息,或者(如果它运行了,但没有达到您的预期)没有发生的事情是您期望发生的,或者正在发生的事情是您不期望发生的。它只是没有做任何事情,单击按钮时不会显示任何错误。顺便说一下,宏被嵌入到按钮中,这应该可以正常工作。我的代码是否有任何错误?转到VBA“即时窗口”并输入
?Application.EnableEvents
。它是返回
True
还是返回
False
?@YowE3K它说的是True。在
子传输
行之后放置一个
MsgBox“Hello”
(我假设您的按钮正在调用
传输
子例程)并查看单击按钮时是否显示
MsgBox
ws2
工作表
对象,OP已将其设置为引用
wkb
中的一个特定工作表,该工作表是
工作簿
对象。因此,保存
wkb
引用的工作簿就是保存该工作簿中的所有工作表,包括
ws2
引用的工作表。