VBA代码扫描导入的文本文件

时间:2014-12-20 02:04:38

标签: excel vba parsing excel-vba

我正在编写一些VBA代码来从大型Excel工作表中收集一些特定数据。工作表包含导入的文本文件。每隔几千行左右,列B,C,D读取"总计"," Nodal","位移"。然后在光束中的各个节点处使用各种值来跟随值表。这些表中大约有70-90个,大约有50,000行信息​​。文本文件格式不能比它更好。我有一个函数可以放入公式中找到1个值。它看起来像这样:

{=index(B1:D68604,Match(1,(B1:B68604 = "Total")*(C1:C68604 = "Nodal")*(D1:D68604 = "displacements"),0)+WhichNode+1,3)}

..." whichnode"是我关心的那一点。我想在VBA中用2个弹出的框来写这个问题"有多少个节点"和"你关心哪个节点?"因此,代码将扫描整个文档,获取我关心的位移值(每当" Total"" Nodal"" displacements"出现在B,C列中, D,我想说我希望第29个节点的位移 - 该值总是30行,与包含字符串"位移")的单元格相同。我无法弄清楚如何编写脚本以便它将扫描整个excel文件并从我想要的特定单元格中获取数据。任何指导都会有所帮助!

**回应一些评论。节点数量根据用于运行测试程序的参数而变化 - 程序测试光束的强度,直到它失败,具体取决于某些输入参数。对于每个时间阶段,大约有58个节点。所以我通常关心每次噬菌体的第29个节点(光束的中间) - 通常是60-80,它取决于光束断裂需要多长时间。我主要希望能够告诉程序要查看哪个节点。通常我关心的是29日,但有时我想要第2或第57(靠近光束的端点)。这有意义吗?

Total   Nodal   displacements   
Node    u           v         theta
1   -3.62E-10   -2.97E-09   -3.96E-03
2   -1.28E-01   -2.21E+00   -3.97E-03
3   -2.51E-01   -4.41E+00   -3.96E-03
4   -3.69E-01   -6.61E+00   -3.95E-03
5   -4.82E-01   -8.81E+00   -3.94E-03
6   -6.45E-01   -1.21E+01   -3.90E-03

这样的表在excel表中出现了很多次 - 无论何时输入新的时间段。

有64个节点,但我通常关心第29个节点(有时我想要其他节点,这就是为什么我希望能够告诉VBA代码搜索特定的节点。我希望它能够抓住&# 34; v"我关心的任何节点的值,并把它带到另一张表中,这样我就可以专注于每个时间段的每个节点的值,而不是扫描数千行得到我需要的每一个值。

基本上我想要一个会说的代码 如果cell(i,B)=" Total"和单元格(i,C)="节点"和单元格(i,D)="位移"然后 将单元格(i + 1 + SpecificNode,D)复制到标题为" v节点i"的值的列中的另一个shet;或类似的东西......这有意义吗?

谢谢你的家伙'帮助!

1 个答案:

答案 0 :(得分:0)

如果没有一些样本数据和预期结果,就会有一些猜测来设想你所描述的内容。在我提出的解决方案中,您没有提及您实际想要对数据节点做什么,所以我只是简单地报告范围的地址到D列。

Sub Get_a_Node()
    Dim fr As Long, lr As Long, iNODES As Long, iPICKNODE As Long
    With Sheets("Sheet4")
        lr = .Cells(Rows.Count, 4).End(xlUp).Row
        iNODES = WorksheetFunction.CountIfs(.Columns(2), "Total", .Columns(3), "Nodal", .Columns(4), "displacements")
        iPICKNODE = Application.InputBox(Title:="Select a Valid Node", prompt:="Pick a Node between 1 and " & iNODES, _
          Default:=1, Type:=1)
        If iPICKNODE > 0 And iPICKNODE <= iNODES Then
            'You could loop until you get to the nth occurrence or use a worksheet formula like the following.
            '=SMALL(INDEX(ROW(A:A)+((Sheet4!B:B<>"Total")+(Sheet4!C:C<>"Nodal")+(Sheet4!D:D<>"displacements"))*1E+99,,),1)
            fr = Application.Evaluate("SMALL(INDEX(ROW(1:" & lr & ")+(('" & .Name & "'!B1:B" & lr & "<>""Total"")+" & _
              "('" & .Name & "'!C1:C" & lr & "<>""Nodal"")+('" & .Name & "'!D1:D" & lr & "<>""displacements""))*1E+99,,)," & iPICKNODE & ")")
            MsgBox "you picked Node " & iPICKNODE & " at " & .Cells(fr, 1).Resize(iPICKNODE + 1, 4).Address(0, 0)
        End If
    End With
End Sub

这似乎解决了您查找和报告第n个数据节点的直接问题。事后由你做的事情将取决于你。