【问题标题】:VBA - open excel, find and replace, delete row, save as csvVBA - 打开excel,查找和替换,删除行,另存为csv
【发布时间】:2013-05-09 19:02:00
【问题描述】:

我正在尝试用 VBA 编写一个程序,以便我可以从 SAS(一种统计编程软件)远程操作一个 excel 文件。我希望程序完成以下任务:

  1. 打开指定的excel文件
  2. 查找标题行中的所有空白并将其替换为空(例如,“测试名称”变为“测试名称”)
  3. 如果行中的第一个单元格(即 A2)为空白,则删除第二行
  4. 将文件另存为 csv

我不了解 VBA,只是稍微涉足过它,了解一些其他编程语言,并尝试将其拼凑起来。我偷了一些代码来使 1 和 4 工作。我不能让 2 和 3 工作。这就是我所拥有的:

我在SAS里面放了以下调用vba程序-

x 'cd C:\Location';/*change to location of VBS file*/
x "vbsprogram.vbs inputfile.xls outputfile.csv";

VBA 程序 -

'1 - Open the specified excel file
if WScript.Arguments.Count < 2 Then
    WScript.Echo "Error! Please specify the source path and the destination. Usage: XlsToCsv SourcePath.xls Destination.csv"
    Wscript.Quit
End If
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))

'2 - Find and Replace
oBook.Worksheets(1).Range("A1:G1").Select
    Selection.Replace What:="* *", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False

'3 - Delete second row if blank
oBook.Cell("A2").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

'4 - Save as csv
oBook.SaveAs WScript.Arguments.Item(1), 6
oBook.Close False
oExcel.Quit
WScript.Echo "Done"

任何为我指明正确方向的帮助将不胜感激。

另外,有没有办法选择第 1 行中的所有数据作为范围(在第 2 部分中),而不必指定一组单元格?

【问题讨论】:

  • 如果这段代码有任何问题,或者你只是在寻找它如何工作的解释?请具体。谢谢。
  • 此代码的第 2 部分和第 3 部分不起作用。我根据我能找到的和我对编程的了解将它们拼凑在一起,但它们肯定缺少一些东西,因为我遇到了一个错误。

标签: vba excel sas


【解决方案1】:

试试:

'2:   - Find and Replace
oBook.Worksheets(1).Cells(2,1).EntireRow.Replace " ", ""

'3 - Delete second row if blank
If oExcel.CountA(oBook.Worksheets(1).Cells(2,1).EntireRow) = 0 Then
  oBook.Worksheets(1).Cells(2,1).EntireRow.Delete
End If

【讨论】:

  • 我收到以下错误:“对象不支持此属性或方法:'Cells'”代码:800A01B6。恐怕我知道的还不够多,无法开始解决这个问题。
  • 谢谢一百万!两个快速修复:(1)我想在第一行进行查找和替换,所以它应该是“oBook.Worksheets(1).Cells(1,1)...”; (2) 我只需要检查第 2 行中的第一个单元格,因为它的其余部分包含数据。在我从语句的第一部分中删除 .EntireRow 后,一切正常。
【解决方案2】:

根据您的输入,您需要修复原始代码的语句 (2) 和 (3),并将第 1 行中所有单元格的值连接起来。您可以通过循环遍历 2 个 Range 对象中的每个单元格来实现此目的对应于第 1 行和第 2 行。Excel VBA 中该操作的一般语法(来源:http://msdn.microsoft.com/en-us/library/office/aa221353%28v=office.11%29.aspx)显示在以下示例代码 sn-p 中:

Sub FormatRow1()
    For Each c In Worksheets("Sheet1").Range("A1:G1").Cells
        if (c.Value) = {condition} then do something.
    Next
End Sub

仅供参考:Excel VBA 中的字符串连接使用&amp; 运算符执行。此外,您应该使用Replace ( string1, find, replacement, [start, [count, [compare]]] )Range(range).EntireRow.Delete VBA 运算符来完成任务。

【讨论】:

  • 你有没有机会让我的代码更具体?我没有完全遵循... c.Value 指的是整个单元格内容,对吗?因此,对于语句 (2),我是否会有类似以下内容的内容: For Each c In Worksheets("Sheet1").Range("A1:G1").Cells Replace (c, " ", "") Next。对于语句 (3),为什么我只需要检查一个单元格(第 2 行中的第一个单元格,A2)中的值时要搜索一个范围?对不起,我对此缺乏远见。
  • 正确:循环适用于语句 (2)。对于语句 (3),只需检查您提到的关键单元格的值(“A2”)并在满足条件时应用 EntireRow.Delete。
  • 我从来没有得到这个解决方案来处理我的代码(我没有足够的知识来有效地将它付诸实践),但感谢您的帮助!
猜你喜欢
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 2018-01-18
  • 2020-12-26
相关资源
最近更新 更多