本类文章的标签为 ‘Name属性’


VBA中名称的使用

1 颗星2 颗星3 颗星4 颗星5 颗星 (1 人投票, 平均: 4.00 out of 5)
Loading ... Loading ...

我们知道,通过在工作表中定义名称,可以更好地管理工作表数据,方便编写公式和设置表格。同样,在VBA中也可以创建和使用名称,也能利用名称方便地处理工作表中的数据。
在VBA中名称的基本操作
1、创建名称
① 可以使用下面的代码在当前工作簿中创建名称:

ActiveWorkbook.Names.Add Name:="MyName", RefersToR1C1:="=Sheet1!R2C2:R6C4"

或者

ActiveWorkbook.Names.Add Name:="MyName", RefersTo:="=Sheet1!$B$2:$D$6"

代码将当前工作簿中工作表Sheet1的单元格区域B2:D6命名为MyName,该名称为全局名称。
注意,在名称中不能出现空格和单元格引用,并且如果对命名区域使用A1样式的引用,那么最好使用绝对引用,否则所命名的区域将会不确定。
在名称前加上工作表名,将创建局部名称,例如:

ActiveWorkbook.Names.Add Name:="Sheet1!MyName1", RefersTo:="=Sheet1!$B$2:$D$6"

上面的代码在工作表Sheet1中将单元格区域B2:D6命名为MyName1,该名称为局部名称。
也可以通过引用指定的工作表创建局部名称,例如:

Worksheets("sheet2").Names.Add Name:="MyName2", RefersTo:="=Sheet2!$A$1:$B$3"

上面的代码在工作表Sheet2中创建一个局部名称MyName2,代表Sheet2中的单元格区域A1:B3。
② 一种简单的命名方法。例如:

Worksheets("Sheet1").Range("B8:C10").Name = "MyName3"

上面的代码将工作表Sheet1中的单元格区域B8:C10命名为MyName3,该名称为全局名称。

Worksheets("Sheet2").Range("H15:G16").Name = "Sheet2!MyName4"

上面的代码将工作表Sheet2中的单元格区域H15:G16命名为MyName4,该名称为局部名称。
注意,这种方法只能应用于命名单元格区域,不能够用来命名公式、数字等。
③ 在当前工作表中命名局部区域,该区域为其它工作表中的单元格区域。

Worksheets("Sheet1").Range("E6:F8").Name = "Sheet2!MyName5"

或者:

Worksheets("sheet2").Names.Add Name:="MyName5", RefersTo:="=Sheet1!$E$6:$F$8"

上面的代码在工作表Sheet2中命名工作表Sheet1中单元格区域E6:F8为MyName5,该名称为Sheet2中的局部名称。
④ 命名数字。例如:

Names.Add Name:="NameNumber", RefersTo:=666

将数字666命名为NameNumber。
⑤ 命名字符串。例如:

Names.Add Name:="NameString", RefersTo:="TV"

将字符串TV命名为NameString。
⑥ 命名数组。例如:

Dim MyArray(10)
Dim i As Integer
For i = 1 To 10
   MyArray(i) = i
Next i
Names.Add Name:="NameArray", RefersTo:=MyArray

上述代码先对数组赋值,然后指定名称。
⑦ 命名公式。例如:

Names.Add Name:="NameFormlas", RefersTo:="=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),1)"

上面的代码命名了一个公式,可以用来创建动态表格或引用动态的区域。
使用上面的方法命名数字、字符串、数组或公式,在名称中存储经常要使用的值,比将该值存放在单元格中更有优势,它可以避免该值被易外修改并减少了对象的引用。
2、重命名已有的名称

Worksheets("Sheet2").Names("MyName5").Name = "MyName6"

上面的代码将工作表Sheet2中的局部名称MyName5改名为MyName6。但这种方法只能在单元格或单元格区域中进行重命名使用,而不能重命名代表公式、数组和字符串的名称。
3、改变所选区域所命名的名称的引用区域

Worksheets("Sheet1").Names.Add Selection.Name.Name,Sheet1.Range("B3:C4")

上面的代码将原来所选区域的名称的引用区域改为单元格区域B3:C4,即该名称所代表的区域已变为B3:C4,原来命名区域名称被取消。
4、提取命名区域
使用Evaluate方法,例如:

Evaluate("MyName").Interior.ColorIndex = 3

将工作表中名称MyName所代表的单元格区域的背景设置为红色。
5、隐藏名称

Names.Add Name:="HideName", RefersTo:="=$A$1:$C$3", Visible:=False

将隐藏所创建的名称。注意,如果以后创建的名称与所隐藏的名称相同,则被隐藏的名称将被覆盖。
6、删除名称

Names("MyName3").Delete

上面的代码删除当前工作簿中的名称MyName3。
注意,当前工作簿中重命名已有名称和删除名称时,要注意所要操作的名称是全局名称还是局部名称。如果为局部名称,则必须在代码中加上该名称所在工作表的引用。
命名名称注意事项
名称的最大长度为255个字符。

  • 名称可以字母、空格或下划线开头。
  • 名称中不能包含空格、连字线等字符。
  • 避免命名与单元格引用相同的名称,如A1、G11等。
  • 避免在名称中使用Excel的保留字,如:Criteria、Database、Extract、Print_Area、Print_Titles等。

一些示例
[示例1] 检查当前工作簿中某名称是否存在

Sub test()
  Dim str As Boolean
  str = NameExists("myName")
  If str = True Then
    MsgBox "该名称存在于当前工作簿中."
  Else
    MsgBox "该名称不存在."
  End If
End Sub
Function NameExists(FindName As String) As Boolean
  Dim rng As Range
  Dim myName As String
  On Error Resume Next
  myName = ActiveWorkbook.Names(FindName).Name
  If Err.Number = 0 Then NameExists = True
End Function

或者:

Function NameExists(TheName As String) As Boolean
  On Error Resume Next
  NameExists = Len(ThisWorkbook.Names(TheName).Name) <> 0
End Function

[示例2]使工作簿中的所有名称可见

Sub UnHideName()
  Dim Nm As Name
  For Each Nm In Names
    Nm.Visible = True
  Next
End Sub

[示例3]列出当前工作簿中所有名称的相关信息

Sub ShowNames()
  Dim N As Integer
  For N = 1 To ActiveWorkbook.Names.Count
    On Error Resume Next
    Cells(N, 1) = "'" & ActiveWorkbook.Names(N).Name
    Cells(N, 2) = "'" & ActiveWorkbook.Names(N).RefersToRange.Address
    Cells(N, 3) = "'" & ActiveWorkbook.Names(N).ShortcutKey
    Cells(N, 4) = "'" & ActiveWorkbook.Names(N).Visible
  Next
End Sub

[示例4]显示当前单元格所命名的名称

Sub ShowNames_activecell()
  On Error Resume Next
  MsgBox ActiveCell.Name.Name
  Select Case Err.Number
    Case 0
    Case 1004
      MsgBox "单元格" & ActiveCell.Address(4) & “没有命名。”
    Case Else
      MsgBox Err.Number & " -- " & Err.Description
  End Select
End Sub

示例说明:如果要获取指定单元格所定义的名称,可以使用Name属性两次。
[示例5]删除当前工作簿中含有“name”字符的名称

Sub DeleteName()
  Dim Nm As Name
  For Each Nm In ActiveWorkbook.Names
    If Nm.Name Like "*name*" Then
      Nm.Delete
    End If
  Next Nm
End Sub

[示例6] 判断某单元格或单元格区域是否与命名区域部分重叠

Function NameOfParentRange(Rng As Range) As String
  Dim Nm As Name
  For Each Nm In ThisWorkbook.Names
    If Rng.Parent.Name = Nm.RefersToRange.Parent.Name Then
      If Not Application.Intersect(Rng, Nm.RefersToRange) Is Nothing Then
        NameOfParentRange = Nm.Name
        Exit Function
      End If
    End If
  Next Nm
  NameOfParentRange = ""
End Function

示例说明:如果Rng所代表的单元格或单元格区域与命名区域相交叉,则返回命名区域的名称,否则返回空。
名称的高级操作
(下面的内容整理自Chip Pearson的文章)
[增大名称框的尺寸]
在Excel 2003及以前工作表的名称框中(如图1所示),大约只能显示16个字符,当超过它所能容纳的字符时,后面的字符将会被截取,因而不能看到完整的名称,这对前面的字符相同而最后几个字符不相同的名称来说,很不方便,但是在Excel中没有改变名称框尺寸的设置(Excel 2007改进了这一步,可以通过拖拉增加或减小名称框的尺寸),这个问题可以通过调用Windows API来解决。下面的代码通过调用API来增加下拉框的宽度。
在VBE编辑器中插入一个标准模块,并输入以下的代码:

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
    ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long
 
Sub WidenNameBoxDrop2()
    Dim Res As Long
    Const CB_SETDROPPEDWIDTH = &H160
    Const cWidth = 400 '<<<<<<<<<<<<<<<<<<<<<<
    Res = SendMessage( _
            FindWindowEx( _
                FindWindowEx( _
                    FindWindow("XLMAIN", Application.Caption) _
                , 0, "EXCEL;", vbNullString) _
            , 0, "combobox", vbNullString), _
          CB_SETDROPPEDWIDTH, cWidth, 0)
End Sub

示例说明:上述代码运行前后的结果如图1和图2所示。在上面的代码中,可以通过改变常量cWidth(<<<所示的代码行)的值来定义下拉框的宽度。
NameInVBA1 图1:原名称框
NameInVBA2 图2:修改后的名称框
[为名称框定义快捷键]
Excel提供的快捷键中没有名称框的快捷键。但是,您能使用VBA代码设置快捷键,以方便能快速定位到名称框。
在VBE编辑器中,插入一个标准模块,并输入以下代码:

Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
     ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
 
Sub SetFocusNameBox()
    Dim Res As Long
    Res = SetFocus( _
        FindWindowEx( _
            FindWindowEx( _
                FindWindow("XLMAIN", Application.Caption) _
                    , 0, "EXCEL;", vbNullString) _
                    , 0, "combobox", vbNullString))
End Sub

在Excel中,选择菜单“工具——宏——宏”命令,调出“宏”对话框,为刚创建的SetFocusNameBox代码指定快捷键,如Ctrl+Shift+N。那么,以后在该工作簿中,按下Ctrl+Shift+N组合键,即可定位到名称对话框。

相关文章

使用VBA操作文件(6):Folder对象和Folders集合

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

Folder对象
使用Folder对象可以访问指定文件夹的所有属性,并提供了复制、移动和删除文件夹的方法,还可以在文件夹内新建一个文本文件。
Folder对象的重要性在于可以通过它访问Folders集合对象。最常用的方法是提取集合中的一个成员以访问某个对象。然而,由于Drive对象在根文件夹仅给出了Folder对象,因此不得不从Folder对象(表示根文件夹中子文件夹的集合)中提取Folders集合对象。利用Folders集合,可以向下搜索整个文件系统以选择其他Folder对象和其他Folders集合。IsRootFolder参数将告诉当前正在处理的Folder对象是否是Drive的根文件夹。
Attributes属性
返回文件夹的属性。FileAttributes常量(参见下表),一组表示文件夹属性的标志。通过对Attributes返回值和要测试的常量值进行逻辑与(AND)可以确定设置了哪一个标志。例如:

If oFolder.Attributes And ReadOnly Then '文件夹是只读的

表:FileAttributes常量

常数
Alias 64
Archive 32
Compressed 2048
Directory 16
Hidden 2
Normal> 0
ReadOnly 1
System 4
Volume 8


DateCreated属性
返回文件夹的创建日期,Date类型。
DateLastAccessed属性
如果可以从操作系统获得时间信息,则属性表示最近一次访问文件夹的日期,Date类型。
DateLastModified属性
最近一次修改文件夹的日期,Date类型。
Drive属性
返回一个Drive对象,表示该文件夹所在的驱动器名称。
Files属性
返回文件夹中的文件集合,表示当前文件夹中的所有文件。

Sub CountFilesInFolder()
    Dim fs, strFolder, objFolder, colFiles
    strFolder = InputBox("请输入文件夹名称:")
    If Not IsFolderEmpty(strFolder) Then
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set objFolder = fs.GetFolder(strFolder)
        Set colFiles = objFolder.Files
        MsgBox "文件夹中的文件数量为" & strFolder & "=" & colFiles.Count
    End If
End Sub

IsRootFolder属性
IsRootFolder属性判断文件夹是否为根文件夹,如果是则返回True,Boolean类型。
Name属性
返回文件夹的名称,String类型。
ParentFolder属性
返回指定文件夹的父文件夹。如果当前文件夹是它所在驱动器的根文件夹,则该属性无效。
Path属性
返回文件夹的完整路径,String类型。
Size属性
返回文件夹的大小,以字节表示。包含当前文件夹中所有文件、子文件夹及其内容的全部大小,Variant类型。

Function IsFolderEmpty(myFolder)
    Dim fs, objFolder
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set objFolder = fs.GetFolder(myFolder)
    IsFolderEmpty = (objFolder.Size = 0)
End Function

SubFolders属性
返回文件夹中的子文件夹的集合,表示当前文件夹内的所有子文件夹。
Type属性
返回文件夹的类型,例如文件夹或者回收站。该属性并未完全实现,总是返回“File Folder”,String类型。
Copy方法
将当前文件夹及其内容(包括其他文件夹)复制到另一个位置,其语法为:

oFolderObj.Copy Destination[,OverwriteFiles]

其中,oFolderObj代表任何能够返回Folder对象的对象变量。参数Destination必需,表示文件夹复制中的目标路径(可包含文件名),String类型,不能在其中使用通配符。参数OverwriteFiles可选,表示是应该覆盖(True)还是不覆盖(False)已存在的文件和文件夹,Boolean类型。
Copy方法将源文件夹中包含的文件夹、所有子文件夹和文件复制到Destination位置,也就是说,Copy方法是递归的。
Folder.Copy方法与FileSystemObject.CopyFolder方法不同,对于使用路径分隔符还是非路径分隔符结束Destination,在操作上都是相同的。
如果目标路径或者Destination结构中的任何一个文件设置为只读,则不论OverwriteFiles的值如何,Copy方法都将失败。
如果OverwriteFiles设置为False,且Destination结构中包含源文件夹或源文件夹中的任意一个文件,将产生错误“文件已经存在”。
如果在复制多个文件时出现错误,Copy方法立即停止操作,不再复制剩下的未复制的文件。该方法不具有撤销产生错误之前复制操作的返回功能。
如果用户有充分的权限,Destination可为网络路径或共享名。例如:

oFolder.Copy "\\NTSERV1\d$\RootTwo\"

CreateTextFile方法
在指定位置新建一个文件,并返回所创建文件的TextStream对象。其语法为:

oFolderObj.CreateTextFile FileName[,Overwrite[,Unicode]]

其中,oFolderObj代表任何能够返回Folder对象的对象变量。参数FileName必需,表示任何有效的文件名(路径可选),String类型,不允许使用通配符。参数Overwrite可选,一个标志,表示是否覆盖具有相同文件名的已有文件,Boolean类型,默认设置为False。参数Unicode可选,一个标志,表示是用Unicode格式还是ASCⅡ格式写文件,默认设置为False。如果Unicode设置为True,将创建一个Unicode格式的文件,否则创建一个ASCⅡ文本文件。
新建的文本文件只有在进行写操作时才自动打开。如果随后要读这个文件,必须先关闭这个文件,然后以读模式打开该文件。
必须使用Set语句把TextStream对象赋给一个局部对象变量。
Folder对象中的CreateTextFile方法与FileSystemObject对象中的CreateTextFile方法在操作上是一样的。
Delete方法
删除当前文件夹及其所有文件和子文件夹。其语法为:

oFolderObj.Delete [Force]

其中,oFolderObj代表任何能够返回Folder对象的对象变量。参数Force可选,如果设置为True,则忽略文件的只读标志并删除这个文件,Boolean类型,默认设置为False。
如果文件夹中某些文件已经打开,该方法失败并产生一个“Permission Denied”错误。Delete方法删除指定文件夹中的所有内容,包括其他文件夹和它们的内容。
如果参数Force设置为False,且文件夹中的任一文件设置为只读,则该方法失败。
如果在删除多个文件或文件夹时出错,Delete方法立即停止操作,不再删除余下没有删除的文件或文件夹,该方法不具有撤销出错前删除操作的返回功能。
Folder对象的Delete方法与FileSystemObject的DeleteFolder方法不同,后者可以在路径参数中使用通配符,因而能同时删除多个文件夹,而前者只是删除Folder对象所表示的一个文件夹。
执行完Delete方法后,包含Folder对象的Folders集合对象会自动更新。从Folders集合中移除被删除的文件夹,且集合的计数减一。不应再访问已删除的文件夹,应该设置局部对象变量为Nothing,例如下面的代码所示:

Set ofsSubFolder=ofsSubFolders.Item("roottwo")
MsgBox ofsSubFolders.Count
ofsSubFolder.Delete False
MsgBox ofsSubFolders.Count
Set ofsSubFolder=Nothing

Move方法
将文件夹结构从某个位置移动到另一个位置。其语法为:

oFolderObj.Move destination

其中,oFolderObj代表任何能够返回Folder对象的对象变量。参数destination必需,指定文件夹移动操作中目标位置的路径,String类型,不能使用通配符,可以为绝对路径或相对路径。
在移动文件夹时,如果其中的某些文件已经打开,则将产生一个错误。
如果在移动操作的过程中出错,Move方法将立即停止操作,且不再移动剩下的文件和文件夹。
要保证该方法能够完成,可以在调用它之前使用FileSystemObject的FolderExists和GetAbsolutePath方法。
Folder.Delete方法和FileSystemObject的MoveFolder方法不同,后者可以在路径参数中使用通配符,所以能够同时移动多个文件夹,而前者只是删除Folder对象表示的一个文件夹及其内容。
执行完Move方法后,包含Folder对象的Folders集合对象会立即自动更新:从集合中移除刚被删除的文件夹,集合计数减一。不应该再访问同一Folders集合对象中已经删除的文件夹。
如果用户有足够的权限,目标路径可以是网络路径或共享名,例如:

Move "\NTSERV1\d$\RootTwo\"

Folders集合
Folders集合对象是Folder对象的容器。通常我们希望从对象所在的集合访问某个对象。例如,我们可能希望从Folders集合对象访问一个Folder对象。然而,情况也可以反过来,我们可以从一个Folder对象的实例访问Folders集合对象。这是因为从Drive对象创建实例的第一个Folder对象是一个Root Folder(根文件夹)对象,从该对象可以实例化一个子文件夹集合。然后又能够实例化其他Folder对象和子文件夹对象,这样就能操作整个驱动器的文件系统。
Item属性
从Folders集合对象检索一个特定的Folder对象,可以通过提供的准确的文件夹名来访问某个文件夹,而不需要知道它的路径。但是,不能通过顺序号来访问该文件夹对象,例如下面的语句返回一个表示roottwo文件夹的Folder对象:

Set ofsSubFolder=ofsSubFolders.Item("roottwo")

Count属性
Folders集合包含的Folder对象的数目,Long类型。
Add方法
新建一个文件夹。其语法为:

oFoldersCollObj.Add newfoldername

其中,oFolderCollObj代表任何能够返回Folders集合对象的对象变量。参数newfoldername必需,指定新文件夹的名称,String类型。
新文件夹的位置由Folders集合对象所在的父文件夹决定。例如,如果从一个Folders集合对象调用Add方法,且这个Folders集合对象是根文件夹对象的一个子文件夹集合,则该方法将在根文件夹下创建新的文件夹(即向根Folder对象的子文件夹集合添加新的文件夹),例如:

Dim oFileSys As New FileSystemObject
Dim oRoot As Folder,oChild As Folder
Dim oRootFolders As Folders
Set oRoot=oFileSys.Drives("C").RootFolder
Set oRootFolders=oRoot.SubFolders
Set oChild=oRootFolders.Add("Downloads")

在newfoldername中不能使用路径标识符,只能使用新文件夹的名称。

相关文章

使用VBA操作文件(5):File对象和Files集合

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

File对象表示某种类型的磁盘文件,允许访问指定文件的所有属性并移向文件系统的上一级访问文件驻留的系统。创建File对象的进程,例如不用打开文件就可以将File对象的Item属性的引用赋给局部对象变量。
File对象是File System对象模型的一部分。
Attributes属性
返回文件的属性,FileAttribute常量。
DateCreated属性
返回文件的创建日期,Date类型。
DateLastAccessed属性
返回文件最后访问的日期,Date类型。
DateLastModified属性
返回文件最后修改的日期,Date类型。
Drive属性
返回表示文件所在驱动器的Drive对象,后面带有冒号。
Name属性
返回文件名称,String类型。
ParentFolder属性
返回文件的父文件夹,即文件所在的文件夹,Folder对象。
Path属性
返回文件的完整路径,包括驱动器名或网络路径/共享名,String类型。
Size属性
返回以字节表示的文件大小,Variant类型。
Type属性
返回文件类型,即包含注册类型描述的字符串。即显示在Windows资源管理器类型列中的文件类型字符串,例如配置设置、应用程序、快捷方式等。如果文件没有扩展名,则类型为“File”;如果文件类型没有注册,则类型显示为扩展名和“File”。
Copy方法
将指定的文件从某位置复制到另一个位置,其语法为:

oFileObj.Copy Destination[,OverwriteFiles]

其中,oFileObj代表任何能够返回File对象的对象变量。参数Destination必需,指定被复制文件的路径和可选的文件名,String类型。参数OverwriteFiles可选,Boolean类型,如果可以覆盖一个已经存在的文件,则OverwriteFiles的值为True,否则为False。
注意,在Destination中不能使用通配符。
如果参数Destination将文件路径设置为只读,则无论参数Overwrite的设置如何,Copy方法都将失败。如果OverwriteFiles为False,而在Destination中又存在该文件,则会产生运行时错误“文件已经存在”。如果用户有足够的权限,则Destination可以是一个网络路径或共享名。例如:

Copy "\\NTSERV1\RootTest"

Delete方法
删除当前文件,其语法为:

oFileObj.Delete [Force]

其中,oFileObj代表任何能够返回File对象的对象变量。参数Force可选,Boolean类型,如果设置为True,则忽略文件的只读标志(如果已设置只读属性的话)并删除该文件。参数Force的默认设置为False。如果参数Force设置为False而文件为只读,则Delete方法将失败。
如果要删除的文件已打开,则Delete方法将失败并产生一个“Permission Denied”错误。
File对象的Delete方法和FileSystemObject对象的Delete方法不同,后者允许路径参数中有通配符,因而能同时删除多个文件,而前者只能删除oFileObj参数指定的一个文件。
执行Delete方法后,包含oFileObj的Files集合对象会自动更新,被删除的文件从集合中移除且集合的计数减一。不能再次访问已删除的文件,而应该将oFileObj设置为Nothing。
Move方法
将文件从一个文件夹移动到另一个文件夹。其语法为:

oFileObj.Move destination

其中,oFileObj代表任何能够返回File对象的对象变量。参数destination必需,String类型,指定要移动的文件所在位置的路径。
在参数destination中不能使用通配符,但可以是绝对路径也可以是相对路径。
要保证Move方法成功执行,可在调用前使用FileSystemObject对象的FileExits方法和GetAbsolutePath方法。
File对象的Move方法和FileSystemObject对象的MoveFile方法不同,后者允许路径参数中有通配符,因而能够同时移动多个文件,而前者只能移动参数oFileObj指定的一个文件。
执行Move方法后,包含oFileObj的Files集合对象会自动更新,从集合中删除被移动的文件且使集合的计数减一。不能在原来的Folder集合对象中再次访问已移动的文件。
如果用户有足够的权限,则Destination可以是一个网络路径或共享名。例如:

oFile.Move "\\NTSERV1\d$\RootTwo\myfile.doc"

OpenAsTextStream方法
打开被引用的文本文件以进行文件的读或写操作,返回一个TextStream对象。其语法为:

oFileObj.OpenAsTextStream ([IOMode[,Format]])

其中,oFileObj代表任何能够返回File对象的对象变量。参数IOMode可选,为下表1中所列的IOMode常量,指定打开文件的模式,默认设置为ForReading(1)。参数Format可选,为下表2所列的Tristate常量,指定打开文件的格式为ASCⅡ格式或Unicode格式,默认设置为ASCⅡ(False)。
表1: IOMode常量

常量 含义
ForAppending 8 以追加模式打开文件,即保护文件的当前内容并在文件的末尾写入新的数据。
ForReading 1 以只读模式打开文件,不能对以只读模式打开的文件进行写操作。
ForWriting 2 以写模式打开文件,文件原来的所有内容都被新的数据覆盖。


表2:Tristate常量

常量 含义
TristateUseDefault -2 以系统缺省格式打开文件
TristateTrue -1 以Unicode格式打开文件
TristateFalse 0 以ASCⅡ格式打开文件


如果另外一个进程已经打开了该文件,则OpenAsTextStream方法失败并产生错误“权限被否定”。

Files集合对象是File System对象模型中的对象之一。
Files集合是任何Folder对象的File属性所返回的File对象的容器(即Folder.Files)。Files集合包含文件夹中的所有文件。使用Files集合的Item属性可以获得对某个File对象的引用,必须使用准确的文件名(包含文件的扩展名)作为参数。可使用For Each … Next语句迭代集合中的所有文件。
Count属性
返回集合中的File对象的数目,Long类型。
Item属性
使用文件名(包括扩展名)作为参数,返回具有该文件名的文件对应的File对象。各个File对象不能通过它们在集合中的序号位置来访问。Item属性是Files集合对象的默认属性。
示例:使用Item属性获取autoexec.bat File对象

Sub GetFileObject()
    Dim ofsFileSys As New FileSystemObject
    Dim ofsFiles As Files
    Dim ofsFile As File
    Set ofsFiles = ofsFileSys.Drives("C").RootFolder.Files
    Set ofsFile = ofsFiles.Item("autoexec.bat")
    MsgBox ofsFile.DateCreated & vbCrLf & _
           ofsFile.DateLastModified & vbCrLf & _
           ofsFile.DateLastAccessed
    Set ofsFile = Nothing
    Set ofsFiles = Nothing
    Set ofsFileSys = Nothing
End Sub

相关文章