转:如何选择 Excel 中的数据列,然后将数据粘贴到文本文件中?

来源:互联网 发布:数据库管理系统语言 编辑:程序博客网 时间:2024/05/03 12:54

从网上找到的一篇关于选择Excel中指定列然后保存到文本文件的文章,正好解了燃眉之急。收录如此,供日后再看!

---------------------------------------------------------------------------------------------

问:
您好,脚本专家!如何选择 Excel 中的数据列,然后将数据粘贴到文本文件中?

 

-- RR

答:
你好,RR。您知道,如果您与大多数人一样,那么每当听到“脚本专家”这个词,您一定会想到两件事:优雅和技艺高超。尽管我们赢得很高的声望,但脚本专家在内心深处只是一些品位简单的人。当然,我们象任何人一样喜欢鱼子酱(或者说,如果我们中有人真的在狼吞虎咽地吃这东西,我们可能也会这样),但最重要的是我们只想找到解决问题的办法。如果人们发现我们所做的既简单又优雅,那就再好不过了。但我们强调实用,而不图外表。

 

我们因何有此一说呢?只因为看起来您的问题应该有既简单又优雅的解决方案。可是,我们根本不知道既简单又优雅的解决方案会是什么样。但是 - 这样是不可以的!- 脚本专家不能承认关于脚本还有我们不知道的事情。因此,为了掩盖我们内心最深处和最怕曝光的秘密,我们决定提供更像蛮干的方法来完成您要做的事情,只不过我们称之为“手工粗活”,而不是蛮干。如果幸运的话,没有人会比我们更聪明。

 

换句话说,我们不是装腔作势,我们恭敬地为您奉上这个手工粗制的脚本,并且专门是为您 RR 而构建的:

 

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:/Scripts/Test.xls")
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Activate

i = 1

Do While True
    strValue = objWorksheet.Cells(i,3)
    If strValue = "" Then
        Exit Do
    End If
    strText = strText & strValue & vbCrLf
    i = i + 1
Loop

 

objExcel.Quit

 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:/Scripts/ExcelData.txt")

 

objFile.Write strText
objFile.Close

 

当您运行此脚本时会发生两件事情:您将获取在电子表格 Test.xls 列 C 中找到的所有数据,然后将数据保存到名为 ExcelData.txt 的文本文件中。这并非仅仅是复制和粘贴,但最终结果一样,并且没其他人会比这更聪明了。

 

哦,除非他们读过此专栏。因此,只要不让其他人阅读此专栏,您就胜利在望了。

 

如果有人正在阅读此专栏,将发现脚本开头是一段令人望而生畏的代码块,该代码块实际上只是创建一个可视的 Excel 实例,打开工作簿 C:/Scripts/Test.xls,然后使 Sheet 1 成为活动工作表:

 

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:/Scripts/Test.xls")
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Activate

 

完成这些以后,我们即准备好解决实质的问题。

 

起初,我们将值 1 赋给计数器变量 i。将使用此变量跟踪电子表格的当前行。我们将值 1 赋给该变量是因为实际电子表格中的数据从第 1 行开始(即,没有标题行)。如果数据从第 3 行开始应该怎么办呢?没问题:只需将值 3 赋给 i。

 

注意:我们很有必要在此处指出我们假定电子表格中的所有数据是连续的,而这只是在第 3 列中没有空白行的别致说法。如果第 3 列中确实有空白行,则可能需要用 UsedRange 属性确定电子表格中的末尾行,然后用 For Next 循环从第 1 行循环到末尾行。有关 UsedRange 属性的更多信息,请参阅此 Office Space 文章。
 

接下来是下面的 Do While 循环:

 

Do While True
    strValue = objWorksheet.Cells(i,3)
    If strValue = "" Then
        Exit Do
    End If
    strText = strText & strValue & vbCrLf
    i = i + 1
Loop

 

我们在这执行的是读取电子表格第 3 列的第 1 行、然后第 2 行,之后是第 3 行等等。我们如何知道何时停止呢?好的,对于每个单元格,我们使用下面这行代码将单元格的值存储在变量 strValue 中:

 

strValue = objWorksheet.Cells(i,3)

 

如果 strValue 等于空字符串 (“”),我们认为已到达数据的结尾;考虑到这一点,我们使用 Exit Do 命令退出循环。以下三行代码就用来解决这个问题:

 

If strValue = "" Then
    Exit Do
End If

 

但请稍候,您说:如果单元格的值不等于空字符串怎么办?嗯,在这种情况下,我们将该值和一个回车换行符 (vbCrLf) 添加到字符串 strText 中:

 

strText = strText & strValue & vbCrLf

 

我们在此只使用 strText 记录我们在电子表格列 C 中找到的数据:每次我们访问新单元格时,我们就将相应数据追加到 strText 的值中。(注意,总是将 strText 的当前值与新值和回车换行符赋给 strText。)

 

在遍历列 C 中的所有单元格后,我们使用 Quit 方法关闭 Excel。至此我们完成了一半的工作:我们已检索了 Excel 中指定列的所有数据。现在,我们只需将这些数据放到文本文件中。

 

虽然存在一些很好但有点费解的方法也许能将数据粘贴到文本文件中,但是只将数据作为文本文件保存似乎更容易些。以下代码就用来解决这个问题:

 

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:/Scripts/ExcelData.txt")

objFile.Write strText
objFile.Close

 

我们在此创建一个名为 C:/Scripts/ExcelData.txt 的新文件,然后用 Write 方法将 strText 的值写入该文件。如果我们想将这些数据添加到已有的文本文件该怎么办呢?没问题;在这种情况下,我们将使用如下代码:

 

Const ForAppending = 8

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("C:/Scripts/ExcelData.txt", ForAppending, True)

objFile.Write strText
objFile.Close

 

注意:有关将数据写入新文本文件或将追加到现有文本文件的更多信息,请参考 Microsoft Windows 2000 脚本指南中的这部分内容。
 

至此您已实现了您的目的:拥有了脚本专家亲手精心制作的全新脚本,脚本专家是不相信生冷、没有人情味的大量生产的脚本。

 

当然,除非您使用 Scriptomatic 来大量生成它们。但那是另一回事情。

(本文来源:http://www.microsoft.com/china/technet/community/scriptcenter/resources/hey060424.mspx)

原创粉丝点击