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

用于扫描导入的文本文件的VBA代码,vba,parsing,excel,Vba,Parsing,Excel,我正在编写一个小的VBA代码,从一个大的excel表格中收集一些特定的数据。该工作表包含一个导入的文本文件。每隔几千行左右,列B、C、D读取总的、节点的位移。随后是一个值表,其中包含梁中各个节点处的各种值。大约50000行信息中有70-90个这样的表。文本文件的格式不能比它更好。我要把一个函数放入一个公式中,以找到其中的一个值。看起来是这样的: {=index(B1:D68604,Match(1,(B1:B68604 = "Total")*(C1:C68604 = "Nodal")*(D1:D6

我正在编写一个小的VBA代码,从一个大的excel表格中收集一些特定的数据。该工作表包含一个导入的文本文件。每隔几千行左右,列B、C、D读取总的、节点的位移。随后是一个值表,其中包含梁中各个节点处的各种值。大约50000行信息中有70-90个这样的表。文本文件的格式不能比它更好。我要把一个函数放入一个公式中,以找到其中的一个值。看起来是这样的:

{=index(B1:D68604,Match(1,(B1:B68604 = "Total")*(C1:C68604 = "Nodal")*(D1:D68604 = "displacements"),0)+WhichNode+1,3)}
。。。whichnode就是我关心的点。我想在VBA中写这篇文章,其中有两个框会弹出,询问有多少个节点,以及您关心哪个节点?因此,代码将扫描整个文档,获取我关心的位移值,无论何时总节点位移出现在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代码搜索特定的节点。我想让它获取我关心的任何节点的v值,并将其放到另一张表中,这样我就可以在每个时间阶段专注于每个节点的v值,而不是扫描数千行以获得我需要的每个值

本质上我想要一个代码 如果celli,B=总位移,celli,C=节点位移,celli,D=位移 将单元格i+1+SpecificNode,D复制到另一个shet中,该shet位于标题为“节点i的v值”的列中,或者类似的内容。。。这有意义吗

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

谢谢你们的帮助

如果没有一些样本数据和预期的结果,就有一些猜测来设想您所描述的内容。您没有提到一旦找到数据节点,您实际上想对它做什么,所以在我建议的解决方案中,我只是报告范围的地址,直到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个数据节点的直接问题。事后如何处理将取决于您。

为什么您要问用户有多少节点,而这些节点应该可以通过简单的工作表函数报告回来。CountIfsColumns2,Total,Columns3,Node,Columns4,displacements?我总是懒于写段落。你能用最简单的形式说明你的数据和预期结果吗?