如何使用VBA

时间:2018-06-28 22:03:32

标签: vba excel-vba excel

以下代码从csv文件读取行并重新格式化行标题。我希望可以清楚地说明这一点,但是我想将单元格的格式设置为标题下方的行中的两位小数,其中vct_FEMAP_Results()函数返回一个值。


示例:

   ID    "CSys ID"   "Set ID"     Plate Top VM Stress     Plate Bot VM Stress  
 ------ ----------- ---------- ----------------------- ---------------------- 
  4591         0         20              229.9488               244.8103  
  4592         0         20              323.5026               315.1129

我正在尝试格式化包含小数的单元格,而不影响列标题IDCSys IDSet ID中的数据。下面的代码将所有列的格式设置为 2个小数。不知道为什么。

Sub cmdOpen_Click()
    Dim wrdArray() As String, txtstrm As TextStream, line As String
    Dim wrd As Variant, myWrd As String
    Dim col As Long, colCount As Long
    Dim count As Long
    Dim row As Long, temp As Long

    Dim str As String, regex As RegExp
    Dim matches As MatchCollection, lineMatch As match, wrdMatch As match
    Dim i As Long, j As Long, x As Long
    Dim strPath As String, strLine As String

    Set regex = New RegExp
    regex.Pattern = "\d+"
    regex.Global = True

    'Remove Filters and Add Custom Filters
    Call Application.FileDialog(msoFileDialogOpen).Filters.Clear
    Call Application.FileDialog(msoFileDialogOpen).Filters.Add("Text Files", "*.txt")
    Call Application.FileDialog(msoFileDialogOpen).Filters.Add("Dat Files", "*.dat")
    Call Application.FileDialog(msoFileDialogOpen).Filters.Add("Comma Delimited Files", "*.csv")

    'only allow the user to select one file
    Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False

    'make the file dialog visible to the user
    intChoice = Application.FileDialog(msoFileDialogOpen).Show

    'determine what choice the user made
    If intChoice <> 0 Then

    'get the file path selected by the user
    strPath = Application.FileDialog(msoFileDialogOpen).SelectedItems(1)

    End If
'------------------------------------------------------------

     If strPath <> "" Then
        Set txtstrm = FSO.OpenTextFile(strPath)
    Else
        Exit Sub
    End If

    row = 1
    Do Until txtstrm.AtEndOfStream
      line = txtstrm.ReadLine

      x = 1
      col = 1
      count = 0

      wrdArray() = Split(line, ",")

      For Each wrd In wrdArray()
        count = count + 1
        myWrd = wrd

        ActiveSheet.Cells(row, col) = wrd
        col = col + 1
      Next wrd

      If (row = 1) Then
        For i = 0 To count - 1
            Set matches = regex.Execute(wrdArray(i))
            For Each wrdMatch In matches
                If wrdMatch Then
                    ActiveSheet.Cells(1, i + 1) = vct_FEMAP_Results(wrdMatch.Value)
                    x = x + 1
                End If
            Next
        Next i
      End If

    row = row + 1
    Loop

    txtstrm.Close

    For i = 1 To row - 1
        For j = x To col - 1
            ActiveSheet.Cells(i, j).NumberFormat = "0.00"
        Next j
    Next i

End Sub

1 个答案:

答案 0 :(得分:0)

您的代码正在格式化所有列,因为您使用以下位循环遍历了列:

For i = 1 To row - 1
    For j = x To col - 1
        ActiveSheet.Cells(i, j).NumberFormat = "0.00"
    Next j
Next i

如果您已经知道需要格式化哪些列,请按照以下步骤操作:

ActiveSheet.Range("d:d, e:e").EntireColumn.NumberFormat = "0.00"

根据示例数据,这将仅重新格式化D和E列。如果需要其他列,请更改d和e。

我实际上更喜欢避免使用“ ActiveSheet”,并且始终显式地引用特定的工作表,因此,我始终确定我的代码针对的是哪个工作表。而当您使用ActiveSheet(或单元格或工作簿)时,活动工作表可能会更改,有时会以意外的方式发生。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Range("d:d, e:e").EntireColumn.NumberFormat = "0.00"

希望对您有帮助!