Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-打开excel,查找并替换,删除行,另存为csv_Vba_Excel_Sas - Fatal编程技术网

VBA-打开excel,查找并替换,删除行,另存为csv

VBA-打开excel,查找并替换,删除行,另存为csv,vba,excel,sas,Vba,Excel,Sas,我正在尝试用VBA编写一个程序,以便从SAS(一种统计编程软件)远程操作excel文件。我希望该计划能够实现以下目标: 打开指定的excel文件 查找标题行中的所有空格并将其替换为空(例如,“测试名称”变为“测试名称”) 如果行(即A2)中的第一个单元格为空,则删除第二行 将文件另存为csv 我不懂VBA,曾涉猎过一点,了解一些其他编程语言,并试图将其组合起来。我偷了一些代码使1和4工作。我不能让2号和3号去上班。这就是我所拥有的: 我将以下内容放入SAS中以调用vba程序- VBA程序- '1

我正在尝试用VBA编写一个程序,以便从SAS(一种统计编程软件)远程操作excel文件。我希望该计划能够实现以下目标:

  • 打开指定的excel文件
  • 查找标题行中的所有空格并将其替换为空(例如,“测试名称”变为“测试名称”)
  • 如果行(即A2)中的第一个单元格为空,则删除第二行
  • 将文件另存为csv
  • 我不懂VBA,曾涉猎过一点,了解一些其他编程语言,并试图将其组合起来。我偷了一些代码使1和4工作。我不能让2号和3号去上班。这就是我所拥有的:

    我将以下内容放入SAS中以调用vba程序- VBA程序-
    '1-打开指定的excel文件
    如果WScript.Arguments.Count<2,则
    WScript.Echo“错误!请指定源路径和目标。用法:XlsToCsv SourcePath.xls destination.csv”
    Wscript.Quit
    如果结束
    暗色oExcel
    设置oExcel=CreateObject(“Excel.Application”)
    Dim oBook
    设置oBook=oExcel.Workbooks.Open(Wscript.Arguments.Item(0))
    '2-查找并替换
    oBook.工作表(1).范围(“A1:G1”)。选择
    选择。替换内容:=“**”,替换:=”,查看:=xlPart_
    SearchOrder:=xlByRows,MatchCase:=False
    '3-如果为空,则删除第二行
    oBook.Cell(“A2”).特殊单元格(xlCellTypeBlanks).EntireRow.Delete
    '4-另存为csv
    oBook.SaveAs WScript.Arguments.Item(1),6
    好的,关上
    oExcel,退出
    Echo“完成”
    
    如果能为我指明正确的方向,我将不胜感激


    另外,是否有一种方法可以选择第1行中的所有数据作为范围(在第2部分中),而不必指定单元格的设置范围?

    根据您的输入,您需要修复原始代码的语句(2)和(3),并连接第1行中所有单元格的值。可以通过在与第1行和第2行相对应的2个范围对象中的每个单元格中循环来实现这一点。Excel VBA(源代码:)中该操作的常规语法显示在以下示例代码段中:

    Sub FormatRow1()
        For Each c In Worksheets("Sheet1").Range("A1:G1").Cells
            if (c.Value) = {condition} then do something.
        Next
    End Sub
    
    仅供参考:使用
    运算符在Excel VBA中执行字符串连接。此外,您应该使用
    Replace(string1,find,replacement,[start,[count,[compare]]])
    Range(Range).EntireRow.删除
    VBA运算符以完成任务。

    尝试:

    '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
    

    如果这段代码有任何问题,或者您只是想了解它是如何工作的?请具体说明。谢谢。这段代码的第2部分和第3部分不起作用。我根据我所能找到的和我所知道的编程知识将它们拼凑在一起,但它们肯定遗漏了一些东西,因为我遇到了一个错误。你有没有可能让我的代码更具体一些?我没有完全遵循。。。c、 值是指整个单元格内容,对吗?所以对于语句(2),我会有这样的东西:对于工作表(“Sheet1”)中的每个c。范围(“A1:G1”)。下一步单元格替换(c,“,”)。对于语句(3),当我只需要检查一个单元格(第2行A2中的第一个单元格)中的值时,为什么要搜索范围?对不起,我对此缺乏远见。正确:循环适用于语句(2)。对于语句(3),只需检查您提到的关键单元格(“A2”)的值,并应用EntireRow。如果满足条件,则删除。我从未使用我的代码使用过此解决方案(我的知识水平不足以有效地将其付诸实践),但感谢您的帮助!我得到以下错误:“对象不支持此属性或方法:'Cells'”代码:800A01B6。恐怕我还没有足够的知识来解决这个问题。非常感谢!两个快速修复方法:(1)我想在第一行执行查找和替换,因此它应该是“oBook.Worksheets(1.Cells(1,1)…”;(2)我只需要检查第2行的第一个单元格,因为它的其余部分包含数据。在我将.EntireRow从语句的第一部分删除后,一切都很顺利。
    Sub FormatRow1()
        For Each c In Worksheets("Sheet1").Range("A1:G1").Cells
            if (c.Value) = {condition} then do something.
        Next
    End Sub
    
    '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