如何使用VBA仅对包含数据的特定单元格进行编号格式

如何使用VBA仅对包含数据的特定单元格进行编号格式,vba,excel,Vba,Excel,以下代码从csv文件中读取行并重新格式化行标题。我希望我能清楚地表达这一点,但我想将单元格的格式设置为标题下方两行的小数,其中vct\u FEMAP\u Results()函数返回一个值 示例: ID "CSys ID" "Set ID" Plate Top VM Stress Plate Bot VM Stress ------ ----------- ---------- ----------------------- ----------------

以下代码从csv文件中读取行并重新格式化行标题。我希望我能清楚地表达这一点,但我想将单元格的格式设置为标题下方两行的小数,其中
vct\u FEMAP\u 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
我试图在不影响列标题
ID
CSys ID
Set 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
Sub-cmdOpen\u Click()
Dim wrdArray()作为字符串,txtstrm作为文本流,行作为字符串
Dim wrd作为变量,myWrd作为字符串
暗淡的颜色和长的颜色一样,冷的颜色和长的颜色一样
不算长
变暗行长,临时行长
Dim str作为字符串,regex作为RegExp
将匹配项设置为匹配集合,将lineMatch设置为匹配项,将wrdMatch设置为匹配项
尺寸i等于长,j等于长,x等于长
Dim strPath作为字符串,strLine作为字符串
Set regex=New RegExp
regex.Pattern=“\d+”
regex.Global=True
'删除筛选器并添加自定义筛选器
调用Application.FileDialog(msoFileDialogOpen).Filters.Clear
调用Application.FileDialog(msoFileDialogOpen.Filters.Add(“文本文件”,“*.txt”)
调用Application.FileDialog(msoFileDialogOpen.Filters.Add(“Dat文件”,“*.Dat”)
调用Application.FileDialog(msoFileDialogOpen.Filters.Add(“逗号分隔文件”,“*.csv”)
'仅允许用户选择一个文件
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect=False
'使文件对话框对用户可见
intChoice=Application.FileDialog(msoFileDialogOpen.Show)
'确定用户所做的选择
如果选择0,那么
'获取用户选择的文件路径
strPath=Application.FileDialog(msoFileDialogOpen)。选择editems(1)
如果结束
'------------------------------------------------------------
如果strPath为“”,则
设置txtstrm=FSO.OpenTextFile(strPath)
其他的
出口接头
如果结束
行=1
直到txtstrm.AtEndOfStream
line=txtstrm.ReadLine
x=1
col=1
计数=0
wrdArray()=拆分(行“,”)
对于wrdArray()中的每个wrd
计数=计数+1
myWrd=wrd
ActiveSheet.Cells(行、列)=wrd
col=col+1
下一个世界
如果(行=1),则
如果i=0,则计数为-1
Set matches=regex.Execute(wrdArray(i))
对于匹配中的每个wrdMatch
如果是wrdMatch,那么
ActiveSheet.Cells(1,i+1)=vct\u FEMAP\u结果(wrdMatch.Value)
x=x+1
如果结束
下一个
接下来我
如果结束
行=行+1
环
txtstrm.关闭
对于i=1到第1行
对于j=x到列-1
ActiveSheet.Cells(i,j).NumberFormat=“0.00”
下一个j
接下来我
端接头

您的代码正在格式化所有列,因为您正在使用此位在列中循环:

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”,并且总是显式引用特定的工作表,因此我总是确定代码的目标工作表。然而,当您使用活动工作表(或单元格或工作簿)时,活动工作表可能会更改,有时会以意外的方式更改

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

我希望这有帮助

我画excel电子表格的尝试失败了。如果你不能破译,也许我可以上传一个bmp。欢迎来到!(请不要以图像形式显示任何数据!u)创建表格的一种方法是将电子表格应用程序中的数据复制并粘贴到。(将“输出样式”设置为
ASCII Compact
),复制呈现的表格并粘贴到问题中。它们突出显示了这一点,并按CTRL+G键。显然,上面编辑的版本是可破译的。谢谢更容易阅读!:-)。。。但我很好奇,为什么你要像这样逐个单元格地打开
.csv
而不是使用内置方法,也许是一行代码。您也可以通过编程或手动方式将数字格式应用于列,但一旦关闭文件,它就会消失,因为
CSV
文件不存储任何类型的格式
CSV(逗号分隔的值)文件只不过是一个在值之间带有逗号的文本文件。这有点复杂(至少对我来说),因为FEMAP输出向量看起来像这样:“7021..板顶Y法向应力”。数字7021是FEMAP输出向量,始终对应于“板顶Y法向应力”。所以我首先找到向量号,调用一个函数来找到输出向量标题,然后用数据填充电子表格。最终,我希望能够操纵每个数据集编写的列。我一直在手动(反复)完成这一切,并试图让生活变得更轻松。:)谢谢你的回复。问题在于,需要格式化的列将取决于所选的FEMAP输出。我希望能够根据数据文件动态设置范围的格式。通过将j上的范围从“x到col-1”设置,我认为格式将从感兴趣的列开始。知道我做错了什么吗?我意识到了错误。我使用“x”作为开始,但是每次通过循环时“x”都会被重新分配到1,并且重新分配发生在do循环中。容易修复!非常感谢。