【问题标题】:Pull latest workbook copy selected workbook and paste in master workbook拉取最新的工作簿复制选定的工作簿并粘贴到主工作簿中
【发布时间】:2016-02-15 18:36:51
【问题描述】:

我正在尝试查看文件夹以按日期提取最新的工作簿,将工作簿作为我的 src 数据打开,从 src 复制选定的工作表和数据,然后粘贴到我的主工作簿。最后关闭 src 工作簿而不保存任何更改。我在应该将文件路径和文件名放在哪里时遇到问题。

Function NewestFileName(ByVal path As String, ByVal FileTemplate As String) As String

Dim FileDateCrnt As Date
Dim FileDateNewest As Date
Dim FileNameCrnt As String
Dim FileNameNewest As String

If Right("G:\AOC\GROUPS1\SAC\TEST", 1) <> "\" Then
path = "G:\AOC\GROUPS1\SAC\TEST" & "\"
End If

FileNameCrnt = Dir$("G:\AOC\GROUPS1\SAC\TEST" & Book1.xlsx)
If FileNameCrnt = "Book1.xlsx" Then
NewestFileName = "Book2.xlsx"
Exit Function
End If

FileNameNewest = FileNameCrnt
FileDateNewest = FileDateTime("G:\AOC\GROUPS1\SAC\TEST" & FileNameCrnt)
Do While True
FileNameCrnt = Dir$
If FileNameCrnt = "" Then Exit Do
FileDateCrnt = FileDateTime(path & FileNameCrnt)
If FileDateCrnt > FileDateNewest Then
  FileNameNewest = FileNameCrnt
  FileDateNewest = FileDateCrnt
End If
Loop

NewestFileName = FileNameNewest

Call ReadDataFromCloseFile

End Function

Sub ReadDataFromCloseFile()
On Error GoTo ErrHandler
Application.ScreenUpdating = False

Dim src As Workbook

Set src = Workbook.Open("G:\AOC\GROUPS1\SAC\TEST.xlsx", True, True)

Dim iTotalRows As Integer
iTotalRows = src.Worksheets("sheet1").Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row)

Dim iCnt As Integer
For iCnt = 1 To iTotalRows
Worksheets("sheet1").Range("B" & iCnt).Formula = src.Worksheets("sheet1").Range("B" & iCnt).Formula
Next iCnt

src.Close False
Set scr = Nothing

ErrHandler:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • “很多草”?!?我想你的意思是“非常感谢”。就像在“muchas gracias”中一样。大声笑

标签: vba excel


【解决方案1】:

第一件事:

如果您有问题或遇到错误,请拼写出来。很难找出你的错误在哪里,不知道它发生在哪一行。

你的功能整体上没有多大意义。为了好好看看它,发表评论会很有帮助。

让我们一步一步看你的代码:

If Right("G:\AOC\GROUPS1\SAC\TEST", 1) <> "\" Then
path = "G:\AOC\GROUPS1\SAC\TEST" & "\"
End If

这个 if 条件总是会触发,因为你放在那里的字符串总是一样的,它总是会错过“\”。 因此,如果您的路径没有改变,那么您可以将其更改为 path = "G:\AOC\GROUPS1\SAC\TEST\"


FileNameCrnt = Dir$("G:\AOC\GROUPS1\SAC\TEST" & Book1.xlsx)
If FileNameCrnt = "Book1.xlsx" Then
NewestFileName = "Book2.xlsx"
Exit Function
End If

我不确定您要在这里做什么。您将 FileNameCrnt 设置为第一行中的字符串(您缺少“\”顺便说一句)。我猜“Book1.xlsx”是你工作簿的真实名称,所以你的字符串应该看起来像这样:"G:\AOC\GROUPS1\SAC\TEST\Book1.xlsx" 或者你可以做这样的事情

fileName = "Book1.xlsx"
FileNameCrnt = Dir$("G:\AOC\GROUPS1\SAC\TEST" & fileName )

下一步:如果上面的行有效,您将(!)总是在那里退出函数。您将 FilenameCrnt 设置为 Book1.xlsx,然后通过 if 子句对其进行检查,检查将始终返回 true,之后您将始终退出。


我明白你的循环,但它也坏了。首先将其更改为:If FileNameCrnt = "" Then Exit Do 为其他内容。您的变量永远不会为空,因此您的循环将始终导致运行时错误。开始更改函数的第一部分,稍后再进行。我想你会更好地了解这一切应该如何运作。尝试自己解决一些问题总是更好。 ;)

编辑:

制作一个关于程序应该如何运行的流程图总是很有帮助的。 比如:

  • 获取我当前的文件名
  • 获取我当前文件的日期
  • 检查是否有较新的文件(日期比我旧的文件 日期)
  • 获取所有文件的日期(遍历所有文件)
  • GET最高日期
  • 比较我当前文件的最高日期
  • 如果有一个日期更高的文件,更新当前文件名到日期更高的文件名

HTH

【讨论】:

  • 好吧,所以一切都搞砸了……哈哈,我把东西拼凑在一起了,哈哈
  • @Marro24 - 我不认为一切都搞砸了。我在理解您的问题时看到的最大问题是您甚至不使用传递给函数的参数(我怀疑您在测试时对变量进行了硬编码并以这种方式发布代码)。如果您可以使用传递的参数使用函数编辑您的帖子,并告诉我们错误发生的确切位置,我们可以更有效地为您提供帮助。
  • 好吧,我看到有人发布的这段代码似乎完全符合我的问题,并试图复制它并直接插入我的路径和文件,但我认为我只是搞砸了他们的代码...... . 我会在我的下面贴出我在触摸之前复制的原始代码。
  • @Marro24,我认为这段代码看起来会小很多。它似乎无处不在。我认为可能需要包含在复制粘贴逻辑中的一件事是在主工作簿中包含一个偏移量(除非您不介意丢失数据)。
  • 我想我会尝试重写一些东西,看看会发生什么,我知道这是一团糟,谢谢大家
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 2012-09-02
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多