【问题标题】:Write macro that will open a specific file path that is linked inside of an excel to then copy and paste back into the excel where the macro is stored编写宏,该宏将打开链接到 excel 内部的特定文件路径,然后复制并粘贴回存储宏的 excel 中
【发布时间】:2020-09-16 00:54:58
【问题描述】:

因此,此宏的目标是打开特定文件,然后从该文件复制并粘贴回存储宏的原始工作簿中。

值得注意的项目使这个宏有点独特:

工作簿 A (wbDestination) - 一个多工作表 excel,其中将存储宏以及将粘贴工作簿 B 上的信息。工作簿 B 的文件路径的位置将每月更改,因此我创建了一个函数在这个工作簿A中,宏将能够成功定位文件路径,以满足文件路径位置的每月变化。我需要将工作簿 B 中的源数据粘贴到工作簿 A 上的“Sheet2”中。工作簿 B 的文件路径位置位于工作簿 A 中名为“宏”的工作表的单元格 C2 中。

工作簿 B (wbSourceData) - 一个多工作表 Excel,其中将保留我需要复制并粘贴到工作簿 A 中的源数据。我将复制的源数据位于第二个工作表上。

Sub CopyPaste()

    Dim wbSourceData As Workbook
    Dim wbDestination As Workbook
    Dim wsSourceData As Worksheet
    Dim wsDestination As Worksheet
    Dim strFName As String
    

    Set wbDestination = ThisWorkbook
    Set wsDestination = wbDestination.Sheets("Sheet2")
    
    strFName = wbDestination.Worksheets("Macros").Range("C2").Value
    
    Set wbSourceData = Workbooks.Open(strFName)
    Set wsSourceData = wbSourceData.Worksheets(2)
    
    
    wsSourceData.Range("A2").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
    wsDestination.Select
        Range("A4").Select
        Selection.PasteSpecial Paste:=xlPasteValues
    
    wbSourceData.Close SaveChanges:=False
    
End Sub

还有一些需要注意的地方。我成功地在这个函数中打开了工作簿 B,但是当我尝试复制数据时宏死了。我在“运行时错误'1004':范围类的选择方法失败”中遇到的错误。我还想在工作簿 A 上使用范围选择函数 xlToRight(两次)和 xlDown,因为此源数据的行数会每月变化,这是获取整个范围的最佳方式。我需要将工作簿 B 中的源数据作为粘贴值粘贴回工作簿 A。

我是 VBA 的初学者,所以无论需要什么来修复这个宏都可以请 ELI5,谢谢!我真的很感激!

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    设置非常好。我喜欢你在命名时所采取的谨慎态度。这很有帮助。但是当涉及到复制/粘贴时,您没有阅读他们说“您无需选择任何内容”的章节。这是该部分代码的改进版本。

    With wsSourceData
        ' last used cell in row 2 looking from right to left
        Cl = .Cells(2, .Columns.Count).End(xlToLeft).Column
        ' last used row in column A looking from bottom up
        Rl = .Cells(.Rows.Count, "A").End(xlUp).Row
        Set Rng = .Range(.Cells(2, "A"), .Cells(Rl, Cl))
    End With
    Rng.Copy Destination:=wsDestination.Range("A4")
    

    如您所见,工作是指定Range。当然,Selection 对象一个范围。 Excel 使用它向后台传达用户在屏幕上单击的内容。它不太适合其他任何东西,因此在使用时用于代替范围。因此,如果它是您需要的范围,请直接选择范围。

    xlToRight 查找右侧 上的下一个空单元格。 xlToLeft 查找第一个使用的单元格来自右侧。您的代码跳过一个空白单元格以找到结尾。从上到下或从上到下看也是一样。我希望右边不再有填充单元格,实际上,您想要排除或自上而下排除。如果是这样,则必须使用您使用的代码找到变量 RlCl。设置范围将通过设置不同的相同变量来完成。

    这是我添加到您已有的声明中的声明。

    Dim Rng             As Range
    Dim Cl              As Long                 ' last used column
    Dim Rl              As Long                 ' last used row
    

    【讨论】:

    • 感谢您的回复,非常感谢!所以我在我写的前五个下面添加了这三个声明。我通过复制和粘贴我编写的代码完全清除了。从 wsSourceData.Range("A2").Select 到 Selection.PasteSpecial Paste:=xlPasteValues 。我用您编写的代码替换了该代码。我没有收到任何错误,这很好,但我没有得到我想要的结果,因为信息没有粘贴到我的 wsDestination。
    • 我想澄清一下,我直接复制并粘贴了您的代码。从您的笔记中,我认为您是在要求我对您编写的代码进行一些编辑以指定我的范围。我可以告诉你我将要抓取的范围将始终来自 A - N 列,因此是 1 - 15 列。但是,每个月的行数都会有所不同。可能值得注意的是,源数据具有我不想复制的列标题,因此我希望宏从第二行开始复制。
    • 经过审查,我发现应该正确指定目标范围,我将答案中的那一行更改为Rng.Copy Destination:=wsDestination.Range("A4")。您似乎没有分析您得到的确切错误。如果目的地的选择是问题,上面应该解决它。如果是源范围的选择,在Set Rng = 下面加上Debug.Print Rng.Address,看看有什么问题。有提示将使错误易于发现和修复。
    • 这是错误的目的地。修复了它!我无法告诉你我有多感激你!
    • 嘿,我知道这是不久前的事了,但有什么方法可以让您知道如何粘贴为值。我遇到了一些麻烦,因为当源数据被粘贴到目标时,宏正在继承源数据的格式。然后我必须将目标上的格式重做为以前的格式。所以我的想法是以某种方式稍微改变宏,以便将源数据作为值粘贴到目标?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多