【问题标题】:Move file with name causes error 5, invalid procedure call or argument移动带有名称的文件导致错误 5,无效的过程调用或参数
【发布时间】:2017-07-11 11:02:05
【问题描述】:

我的硬盘驱动器本身似乎有些问题。表现得很奇怪。有些文件出现重复,我删除了重复。几分钟后,我刷新了目录,它们又回来了。再次刷新,它们就消失了。文件在一台计算机上可见,但在另一台计算机上不可见。我会尝试解决它,看看问题出在哪里。感谢您迄今为止的所有帮助,这可能不仅仅是一个问题。

我已使用此代码重命名文件并将其从网络驱动器上的一个位置移动到另一个位置。

视频文件被命名为 00001、00002 等。由于计数器重置,我需要将文件重命名为可以在硬盘驱动器上运行的文件。

所以所有文件都重命名为<date> <time>.MTS

这段代码以前可以工作,但现在由于某种原因它停止工作了。

Sub MoveFiles()
    Dim r As Integer
    r = 2 'first line of files
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Do Until IsEmpty(Cells(r, "A")) Or IsEmpty(Cells(r, "B"))
        dirPath = Cells(r, "C") + "\" + Cells(r, "B")
        If objFSO.FileExists(dirPath) Then
            ' file exist output error message
            MsgBox ("Filen finns redan!!! " + Cells(r, "A") + "   " + Cells(r, "B"))
        Else
            FromName = ActiveWorkbook.Path + "\" + Cells(r, "A")
            ToName = Cells(r, "C") + "\" + Cells(r, "B")

            ' none of the methods below work.
            Name FromName As ToName
            Name ActiveWorkbook.Path + "\" + Cells(r, "A") As Cells(r, "C") + "\" + Cells(r, "B")
        End If
        r = r + 1
    Loop



End Sub

由于代码不会创建 ToName 存在的错误消息,因此它不是“重复”问题。
如果我运行以下代码

If objFSO.FileExists(ActiveWorkbook.Path + "\" + Cells(r, "A")) Then
    MsgBox "test"
End If

我收到消息框,这意味着 FromName 文件存在。

因此,简而言之,文件存在并且它将成为的文件名不存在。路径(目录)也存在,因为它们是在较早的 sub() 中创建的。我已经仔细检查过了。那么可能是什么问题呢?
我完全迷失在这里。

编辑;工作簿图片已添加:

【问题讨论】:

  • 尝试检查目标文件夹Cells(r, "C")
  • 指向非网络驱动器时问题是否仍然存在?
  • @paulbica 它就在那里。目录存在。
  • @CodyG。稍后会尝试,谢谢提示
  • 看来我的硬盘本身有些问题。表现得很奇怪。有些文件出现重复,我删除了重复。几分钟后,我刷新了目录,它们又回来了。再次刷新,它们就消失了。文件在一台计算机上可见,但在另一台计算机上不可见。我会尝试解决它,看看问题出在哪里。

标签: excel vba


【解决方案1】:

应该这样做(未测试 - YMMV):

Option Explicit

Sub MoveFiles()
    Dim rownum As Long
    rownum = 2 'first line of files
    Dim objFSO As Object        ' Required because of Option Explicit
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Dim FromName as String
    Dim ToName as String

    Do Until IsEmpty(Cells(rownum, "A")) Or IsEmpty(Cells(rownum, "B")) or rownum > 1048576
        ToName = CStr(Cells(rownum, "C")) + "\" + CStr(Cells(rownum, "B"))
        If objFSO.FileExists(ToName) Then
            ' file exist output error message
            MsgBox ("Filen finns redan!!! " + Cells(rownum, "A") + "   " + Cells(rownum, "B"))
        Else
            FromName = ActiveWorkbook.Path + "\" + CStr(Cells(rownum, "A"))

            ' none of the methods below work.
            '' Name FromName As ToName
            '' Name ActiveWorkbook.Path + "\" + Cells(rownum, "A") As Cells(rownum, "C") + "\" + Cells(rownum, "B")

            objFSO.MoveFile FromName, ToName

        End If
        rownum = rownum + 1
    Loop

End Sub

发生了一些变化:

  • Option Explicit:始终在每个 VBA 文件的顶部使用它。
  • 切勿使用Integer — 改用Long
  • 使用Option Explicit,您必须对每个变量都有Dim 语句。这可以防止您由于变量名称中的拼写错误而意外创建新变量。
  • Do 循环中,包括对rownum 的完整性检查,这样您就不会尝试访问不存在的行。
  • 只分配一次ToName,并保存其值。
  • 使用FileSystemObject.MoveFile 重命名。
  • 使用CStr() 确保您从Cells() 获得的值是String。这将降低因意外输入数据而导致令人不快的意外的风险。

This question 并非完全相同,但也可能包含一些有用的信息。

【讨论】:

  • 我还没有时间测试代码,但只是一些关于你注意到的东西的 cmets。行号永远不会超过 250,所以整数很好。计数是我的摄像机存储卡上的文件数。当然,我可以制作一秒钟的视频并获得很高的计数,但这不太可能。我知道 Option Explicit 但我选择不使用它。当我在编码过程中只想尝试一些东西时,我讨厌这些警告信息。 ToName 只设置一次,唯一的区别是你在知道文件是否已经存在之前设置它。真的没有区别。其他东西,优点
  • 将尝试一下。很奇怪,它突然停止工作了。
  • @Andreas 直接使用Cells()(不使用CStr() 等)如果其中一个单元格的Excel 格式发生更改,可能会导致意外失败。我不知道这里是不是这样,但我肯定见过它咬人。
  • 看来我的硬盘本身有些问题。表现得很奇怪。有些文件出现重复,我删除了重复。几分钟后,我刷新了目录,它们又回来了。再次刷新,它们就消失了。文件在一台计算机上可见,但在另一台计算机上不可见。我会尝试解决它,看看问题出在哪里。
  • @Andreas 我非常感谢!如果您在整理好硬件后还有其他代码问题,请@我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多