使用VBScript自动化Excel以处理Nagios日志

时间:2013-06-02 08:20:29

标签: excel excel-vba vbscript vba

我正在使用VBScript从Nagios XI中提取LOG文件。我已经自动化了一个脚本,它将使用IE.Aplication navigate,选择正确的参数(过滤)并导出为CSV(Excel可用)。那已经完成了!

现在我想过滤更多(Nagios无法做到的)。我有多个CPU日志,我想删除所有行包含这个单词。我在VBA中发现了很多脚本,但在我的情况下我覆盖每个文件的问题都是我使用的vba脚本(在另一个Excel中)。我需要将其更改为从应用程序的“外部”(意味着来自主脚本)

Sub CellColor(rng As Range)
  For Each row In rng.Rows
    For Each cell In row.Cells
      If cell.Value = ActiveCell.Value Then  '--- The Condition of the function
        cell.Style = "Bad"                   '--- Changing the "Style" atribbute
      Else
        cell.Style = "Good"                  '--- Changing the "Style" atribbute
      End If
    Next cell
  Next row
End Sub

任何人都可以建议如何转换它吗?

1 个答案:

答案 0 :(得分:0)

可以使用相应的COM对象通过VBScript自动执行Excel:

Set xl = CreateObject("Excel.Application")
xl.Visible = True

Set wb = xl.Workbooks.Open("C:\path\to\your.xls")
Set ws = wb.Sheets(1)

Set rng = ws.Range("B3:E5")

For Each row In rng
  For Each cell In row.Cells
    If cell.Value = xl.ActiveCell.Value
      cell.Style = "Bad"
    Else
      cell.Style = "Good"
    End If
  Next
Next

wb.Save
wb.Close

xl.Quit

但是,由于Range对象也具有Cells属性,因此可以将循环简化为:

For Each row In rng.Cells
  If cell.Value = xl.ActiveCell.Value
    cell.Style = "Bad"
  Else
    cell.Style = "Good"
  End If
Next

请注意,无论哪种方式必须使用xl.ActiveCell.Value而不仅仅是ActiveCell.Value,因为在VBScript中没有隐式使用Application对象({{ VBA中的1}}是ActiveCell.Value)的缩写。

有关VBScript与VBA之间差异的详细信息,请参阅here

上面代码中的范围只是一个例子。如果要处理工作表中的整个使用范围,请将其替换为

Application.ActiveCell.Value

如果任何单元格包含单词“CPU”,则删除行可以执行以下操作:

Set rng = ws.UsedRange

在Excel中打开行之前,您也可以从CSV中删除这些行:

For Each cell In rng.Cells
  If InStr(cell.Value, "CPU") > 0 Then cell.EntireRow.Delete
Next

批处理文件可能是实现此目的的更简单方法:

Set fso = CreateObject("Scripting.FileSystemObject")

filename = "C:\path\to\your.csv"

Set inFile  = fso.OpenTextFile(filename)
Set outFile = fso.OpenTextFile(filename & ".tmp", 2)

Do Until inFile.AtEndOfTextStream
  line = inFile.ReadLine
  if InStr(line, "CPU") = 0 Then outFile.WriteLine line
Loop

inFile.Close
outFile.Close

fso.DeleteFile filename, True
fso.MoveFile filename & ".tmp", filename