【发布时间】:2023-04-08 01:28:01
【问题描述】:
所以,
我有一组字符串 (Connector_String),其中包含显示所有可能连接的字符串(代表类似网络的节点连接)。 Connector_String 具有以下格式(我认为这会对我有所帮助,但如果需要我可以更改它):
- 以
"-"开头和结尾 - 连接的节点(始终为 2)表示为
String1*String2 -
"*"之前的节点表示方向。所以,对于上面那个,方向是String1-->String2 - 由
"-"分隔的连接节点
例如,
-RANDIAC*RANDACBD-RANDV*RANDIF-...-RANDA*RANDACAC-
这意味着RANDIAC 与RANDACBD 等连接。还要注意RANDIAC 可以与另一个节点连接。
我正在尝试列出给定起点和终点的节点之间的所有可能路径。为此,我有两个字符串,其中包括所有起始节点 (Start_String) 和结束节点 (End_String)。格式如下:
-RAND26RD-RAND06RD-...-RAND12RD-
我开始编写for 循环代码来遍历Connector_String,但我很快意识到我必须多次编写相同的循环(我不知道如何定义多少次)。然后我写了一个Do While 循环代码(我第一次使用它)最终根本没有运行(我不明白为什么)。然后,我尝试用我在Sub 上使用的相同for 循环编写Function,然后在Sub 和“功能”中运行Function(希望它会做同样的工作作为Do While 循环)。
我的代码都没有工作,但我正在添加我的最后一次尝试,因为建议将它放在问题上(尽管我怀疑有经验的人是否会阅读它,因为它写得不好 - 加上没有工作)。
Public Function Str_Search(a As String) As String
Dim i As Long
Debug.Print "Func " & a
If InStr(End_Str, Split(a, "-")(UBound(Split(a, "-")))) > 0 Then
Str_Search = a
Exit Function
End If
For i = 1 To UBound(Split(Connector_String, "-")) - 1
If Split(a, "-")(UBound(Split(a, "-"))) = Split(Split(Connector_String, "-")(i), "*")(0) Then
a = a & "-" & Split(Split(Connector_String, "-")(i), "*")(1)
Str_Search (a)
End If
Next i
End Function
Sub test_V4()
Dim a As String
Dim i As Long
a = ""
For i = 1 To UBound(Split(Connector_String, "-")) - 1
If InStr(Start_String, Split(Split(Connector_String, "-")(i), "*")(0)) > 0 Then
a = Replace(Split(Connector_String, "-")(i), "*", "-")
ElseIf a <> "" Then
Str_Search (a)
ElseIf InStr(End_String, Split(a, "-")(UBound(Split(a, "-")))) > 0 Then
Exit Sub
End If
Next
End Sub
最后,我的节点的另一个棘手问题是节点是双向的(所以,我可能有 String1*String2 和 String2*String1),这会导致创建无限循环的问题(我没有尝试解决在我的代码上,因为我什至无法获得一些路径)。
查看下面的字符串:
开始字符串
-RAND_VW_E-RAND_VG_E-RAND_VG_F-RAND_M_2C-RAND_M_3A-RAND_VW_D-RAND_VW_V-RAND_M_1E-RAND_M_4E-RAND_VG_V-RAND_M_2D-RAND_M_3B-RAND_VW_C-RAND_VG_D-RAND_M_1F-RAND_M_4F-RAND_I_LINE-RAND_M_1E & RAND_M_4E-RAND_M_1F & RAND_M_4F
End_String
-RAND26RD-RAND06RD-RAND08RD-RAND12RD-RAND06RD-RAND02RD-RAND07RD-RAND01RD-RAND05RD-RAND03RD-RAND09RD-RAND04RD-RAND10RD-RAND20RD-RAND21RD-RAND22RD-RAND23RD-
连接器字符串
-RANDIAC*RANDACBD-RANDV*RANDIF-RANDV*RANDIBD-RANDBD*RAND26RD-RANDACBD*RANDBD-RAND67F*RAND06RD-RAND89AC*RAND08RD-RANDACAC*RAND89AC-RANDA*RANDACAC-RAND_VW_E*RANDE-RAND_VG_E*RANDE-RAND_VG_F*RANDF-RAND_M_2C*RANDC-RAND_M_3A*RANDA-RANDEBD*RANDBD-RANDE*RANDEBD-RANDI*RANDIBD-RANDIBD*RANDBD-RANDF*RANDFNTH-RANDACAC*RANDACBD-RAND_VW_D*RANDD-RANDFSTH*RAND12F-RAND12F*RAND12RD-RANDIAC*RAND67AC-RAND67AC*RAND06RD-RANDFSTH*RAND02F-RAND02F*RAND02RD-RAND_VW_V*RANDV-RANDE*RANDEF-RAND_M_1E*RANDE-RAND_M_4E*RANDE-RANDEF*RANDFSTH-RAND_VG_V*RANDV-RANDV*RANDIAC-RANDFSTH*RAND67F-RAND67F*RAND07RD-RANDFNTH*RAND01RD-RANDIF*RANDFSTH-RANDB*RANDBD-RAND_M_2D*RANDD-RAND_M_3B*RANDB-RANDI*RANDIF-RANDIF*RANDFNTH-RANDFNTH*RAND05RD-RANDC*RANDACAC-RAND_VW_C*RANDC-RANDACAC*RAND67AC-RAND67AC*RAND07RD-RAND_VG_D*RANDD-RANDD*RANDBD-RAND_M_1F*RANDF-RAND_M_4F*RANDF-RANDFSTH*RAND03F-RAND03F*RAND03RD-RANDI*RANDIAC-RAND_I_LINE*RANDI-RANDIAC*RAND89AC-RAND89AC*RAND09RD-RANDF*RANDFSTH-RANDFSTH*RAND0410-RAND0410*RAND04RD-RAND0410*RAND10RD-RANDBD*RAND26BD-RANDFSTH*RANDFWST-RANDFWST*RANDFX-RAND20X*RAND20RD-RAND21X*RAND21RD-RANDFX*RAND21X-RANDFX*RAND20X-RANDEF*RANDFNTH-RANDACAC*RANDJET-RAND22Y*RAND22RD-RAND23Y*RAND23RD-RANDACY*RAND23Y-RANDJET*RANDACY-RANDACY*RAND22Y-RAND23Y*RAND23BD-RAND22Y*RAND22BD-RAND22Y*RAND23BD-RAND26BD*RAND22BD-RAND26BD*RAND23BD-RAND23BD*RAND26BD-RAND22BD*RAND26BD-RAND23BD*RAND23RD-RAND22BD*RAND22RD-RAND26BD*RAND26RD-RANDJET*RANDACX-RANDACX*RAND20X-RANDACX*RAND21X-RANDACX*RANDFX-RANDFX*RANDFWST-RANDFWST*RANDFSTH-RANDFSTH*RANDFNTH-
希望有人可以帮助我。
【问题讨论】:
-
我了解到您在编写循环时遇到问题,但您希望该循环做什么?我不明白你的问题最终结果应该是什么。
-
所以,这个 Connector_String 包含所有连接的节点。但是,该信息来自网络。 string1 与 string2 连接(从 1 到 2 的方向)。然后,string2 与 string12 连接,string12 连接到 string54 等等,从图中可以看出,路径将具有以下形式。
-
Start_string-String2-String12-….-End_string。因此,我尝试遍历 Start_String 中的所有节点,并让每个节点循环 Connector_String,直到找到 End_String。
-
这样有意义吗?
-
这是否正确:您从起始字符串中获取一个节点,在连接器字符串中搜索该节点,您遍历连接器字符串中的节点(从起始字符串节点开始),并且对于每个节点,您检查它是否是结束字符串的成员,如果是,则返回一个包含开始节点、所有连接器节点和结束节点的字符串?
标签: excel vba loops for-loop while-loop