ªð¦^¦Cªí ¤W¤@¥DÃD µo©«

[µo°Ý] ½Ð°Ý¦p¦ó¥ý§PÂ_­þ¤@Äæ«á¦A¶i¦æ­pºâ

¥»©«³Ì«á¥Ñ Andy2483 ©ó 2023-6-5 11:54 ½s¿è

¦^´_ 1# gaishutsusuru


    ÁÂÁ½׾Â,ÁÂÁ«e½úµoªí¦¹¥DÃD»P½d¨Ò
«á¾ÇÂǦ¹©«½m²ß°}¦C»P¦r¨å,¾Ç²ß¤è®×¦p¤U,½Ð«e½ú°Ñ¦Ò

°õ¦æµ²ªG:



¤u§@ªí¼Ò²Õ:
Option Explicit 'H4¼g¤J¿ï¨úAÄ檺Àx¦s®æ
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Target
   Dim T$
   If .Columns.Count <> 1 Or .Column <> 1 Or .Row = 1 Then Exit Sub
   T = .Address(0, 1): [H4] = T
End With
End Sub
'========================================
Sub TEST()
Dim Brr, Crr, V, Y, A, R&, i&, j%, M&, T$, Tr$, V1&, V2&
Set Y = CreateObject("Scripting.Dictionary")
Brr = Range([D1], [A65536].End(3))
For i = 2 To UBound(Brr)
   For j = 3 To 4
      Y(Brr(1, j)) = j
      T = Brr(1, j) & "|" & Brr(i, 1): Tr = Brr(1, j) & "|" & i
      Y(T) = i: Y(T & "|" & "Sum") = Y(T & "|" & "Sum") + Brr(i, j)
      Y(Tr) = i: Y(Tr & "|" & "Sum") = Y(Tr & "|" & "Sum") + Brr(i, j)
   Next
Next
[I2:I65536].ClearContents
Crr = Range([I1], [H65536].End(3))
For i = 2 To UBound(Crr)
   T = Trim(Crr(i, 1)): If T = "" Then GoTo i01
   A = Split(Replace(Replace(Crr(i, 1), "$A", ""), ":", "~"), ",")
   If A(0) = "" Then GoTo i01
   For Each V In A
      V1 = Y(Crr(1, 2) & "|" & Split(V, "~")(0))
      V2 = Y(Crr(1, 2) & "|" & StrReverse(Split(StrReverse(V), "~")(0)))
      If InStr(V, "~") Then
         If V1 * V2 = 0 Then Crr(i, 2) = "": GoTo v01
         If V1 > V2 Then M = V2: V2 = V1: V1 = M
         For R = V1 To V2: Crr(i, 2) = Crr(i, 2) + Brr(R, Y(Crr(1, 2))): Next
         ElseIf Y(Crr(1, 2) & "|" & V & "|" & "Sum") <> "" Then
            Crr(i, 2) = Crr(i, 2) + Y(Crr(1, 2) & "|" & V & "|" & "Sum")
v01:  End If
   Next
i01: Next
[H1].Resize(UBound(Crr), 2) = Crr
Set Y = Nothing: Erase Brr, Crr, A
End Sub
¥Î¦æ°Ê¸Ë¸mÂsÄý½×¾Â¾Ç²ß«Ü¤è«K,ÁÂÁ½׾¸gÀç¹Î¶¤
½Ð¤j®a¤@°_¤W½×¾Â¨Ó¥æ¬y

TOP

¦^´_ 2# Andy2483


    ¤u§@ªí¼Ò²Õ­×¥¿¦p¤U:

Option Explicit  'H4¼g¤J¿ï¨úAÄ檺Àx¦s®æ
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Target
   Dim T$, xR As Range
   Set xR = Range([A2], [A65536].End(3))
   If .Columns.Count <> 1 Or .Column <> 1 Then Exit Sub
   If Intersect(xR, Selection.Cells) Is Nothing Then Exit Sub
   T = Intersect(xR, Selection.Cells).Address(0, 1)
   [H4] = T
End With
End Sub
¥Î¦æ°Ê¸Ë¸mÂsÄý½×¾Â¾Ç²ß«Ü¤è«K,ÁÂÁ½׾¸gÀç¹Î¶¤
½Ð¤j®a¤@°_¤W½×¾Â¨Ó¥æ¬y

TOP

¦^´_ 1# gaishutsusuru


    ÁÂÁ«e½ú
«á¾ÇÂǦ¹©«½m²ß¦Û­q¨ç¼Æ,¾Ç²ß¤è®×¦p¤U,½Ð«e½ú°Ñ¦Ò

¬¡­¶Ã¯1_20230605_5F.zip (16.32 KB)

°õ¦æµ²ªG:


Option Explicit
Function SumText(xC As String, xY As String)
Dim Brr, Crr, V, Y, A, R&, i&, j%, M&, T$, Tr$, V1&, V2&, Z&
Set Y = CreateObject("Scripting.Dictionary")
Brr = Range([D1], [A65536].End(3))
For i = 2 To UBound(Brr)
   For j = 3 To 4
      Y(Brr(1, j)) = j
      T = Brr(1, j) & "|" & Brr(i, 1): Tr = Brr(1, j) & "|" & i
      Y(T) = i: Y(T & "|" & "Sum") = Y(T & "|" & "Sum") + Brr(i, j)
      Y(Tr) = i: Y(Tr & "|" & "Sum") = Y(Tr & "|" & "Sum") + Brr(i, j)
   Next
Next
T = Trim(xC): If T = "" Then GoTo 102
A = Split(Replace(Replace(xC, "$A", ""), ":", "~"), ",")
If A(0) = "" Then Z = 0: GoTo 102
For Each V In A
   V1 = Y(xY & "|" & Split(V, "~")(0))
   V2 = Y(xY & "|" & StrReverse(Split(StrReverse(V), "~")(0)))
   If InStr(V, "~") Then
      If V1 * V2 = 0 Then Z = 0: GoTo 102
      If V1 > V2 Then M = V2: V2 = V1: V1 = M
      For R = V1 To V2: Z = Z + Brr(R, Y(xY)): Next
      ElseIf Y(xY & "|" & V & "|" & "Sum") = "" Then
         Z = 0: GoTo 102
      Else
         Z = Z + Y(xY & "|" & V & "|" & "Sum")
End If
v01: Next
102: If Z <> 0 Then SumText = Z Else SumText = ""
End Function
¥Î¦æ°Ê¸Ë¸mÂsÄý½×¾Â¾Ç²ß«Ü¤è«K,ÁÂÁ½׾¸gÀç¹Î¶¤
½Ð¤j®a¤@°_¤W½×¾Â¨Ó¥æ¬y

TOP

¥»©«³Ì«á¥Ñ Andy2483 ©ó 2023-6-6 09:24 ½s¿è

¦^´_ 5# gaishutsusuru


    ÁÂÁ«e½ú¦^´_
1.«á¾Ç¹ï©ó¤Óªøªº¤½¦¡¾Ç±o«ÜºC,½Ð«e½ú«Ý¼F®`ªº«e½úÀ°¦£
2.«á¾Ç¾ÇExcel¤Q¦h¦~»{¬°¤W³Â»¶®a±Ú½×¾Â¾Ç²ß¬O³Ì¦nªº³~®|,¾ÇExcel¥u¦³¨C¤Ñ½m²ß¨D¶i¨B,¨S¦³±¶®|,½×¾Â¦³«Ü¦h¾Ç¤£§¹ªº½d¨Ò,¨C­Ó½d¨Ò¤S¥i¥H¥Î¦hºØ¤è®×¸Ñ¨M,¤£¥²¶R®Ñ,±`¤W³Â»¶®a±Ú½×¾Â¾Ç´N¹ï¤F
3.¥H¤U¬O½Æ²ß¬Q¤Ñªº¤è®×,µo²{«Ü¦h¦A§ï¶iªº,»P½Æ²ßªº¤ß±oµù¸Ñ,½Ð«e½ú°Ñ¦Ò,½Ð¦U¦ì«e½ú¤£§[«ü±Ð

Option Explicit'¤u§@ªí¼Ò²Õ
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'¡ô·í¤u§@ªí¤Wªº¿ï¨ú½d³òÅܧó®É·|µo¥Í¦¹¨Æ¥ó
With Target
'¡ô¥H¤U¬OÃö©óIJµoªºµ{§Ç
   Dim T$, xR As Range
   '¡ô«Å§iÅܼÆ
   Set xR = Range([A2], [A65536].End(3))
   '¡ô¥OxRÅܼƬO[A2]¨ìAÄæ³Ì«á¤@­Ó¦³¤º®eÀx¦s®æ,³o½d³òÀx¦s®æ
   If .Columns.Count <> 1 Or .Column <> 1 Then Exit Sub
   '¡ô¦pªG¿ï¨úIJµoªºÄæ¼Æ¤£¬O1Äæ,©ÎÄ渹¤£¬O1,´Nµ²§ô°õ¦æ
   If Intersect(xR, Selection.Cells) Is Nothing Then Exit Sub
   '¡ô¦pªGxRÅܼƻP¿ï¨úIJµoªºÀx¦s®æ¨S¥æ¶°,´Nµ²§ô°õ¦æ
   T = Intersect(xR, Selection.Cells).Address(0, 1)
   '¡ô¥OTÅܼƬO xRÅܼƻP¿ï¨úIJµoªºÀx¦s®æ¥æ¶°Àx¦s®æ¦ì§}(Ä渹¦³$)
   [H4] = T
   '¡ô¥O[H4]Àx¦s®æ­È¬O TÅܼÆ
End With
End Sub


Option Explicit'¤@¯ë¼Ò²Õ
Function SumText(xC As String, xY As String)
'¡ô¦Û­q¨ç¼ÆSumText(),«Å§iÅܼÆxC,xY³£¬O¦r¦êÅܼÆ
Dim Brr, Crr, V, Y, A, R&, i&, V1&, V2&, Z&, M&, j%, T$, Tr$
'¡ô«Å§iÅܼÆ(Brr,Crr,V,Y,A)¬O³q¥Î«¬ÅܼÆ,(R,i,V1,V2,Z,M)¬Oªø¾ã¼Æ,
'j¬Oµu¾ã¼Æ,(T,Tr)¬O¦r¦êÅܼÆ

Set Y = CreateObject("Scripting.Dictionary")
'¡ô¥OYÅܼƬO ¦r¨å
Brr = Range([D1], [A65536].End(3))
'¡ô¥OBrrÅܼƬO ¤Gºû°}¦C,¥HA~DÄæÀx¦s®æ­È±a¤J
For i = 2 To UBound(Brr)
'¡ô³]¶¶°j°é
   For j = 3 To 4
   '¡ô³]¶¶°j°é
      Y(Brr(1, j)) = j
      '¡ô¥O²Ä1¦Cj°j°éÄæBrr°}¦C­È·íkey,item¬Oj°j°é¼Æ(°O¦~¤Àªº°}¦CÄ渹)
      T = Brr(1, j) & "|" & Brr(i, 1): Tr = Brr(1, j) & "|" & i
      '¡ô¥OTÅܼƬO ²Ä1¦Cj°j°éÄæBrr°}¦C­È³s±µ"|",¦A³s±µi°j°é²Ä1ÄæBrr°}¦C­È,
      '¥OTrÅܼƬO ²Ä1¦Cj°j°éÄæBrr°}¦C­È³s±µ"|",¦A³s±µi°j°é¼Æ

      Y(T) = i: Y(T & "|Sum") = Y(T & "|Sum") + Brr(i, j)
      '¡ô¥OTÅܼƬOkey,item¬OiÅܼÆ,¯Ç¤JY¦r¨å¤¤
      '¡ô¥O¥HTÅܼƳs±µ"|Sum"²Õ¦¨·s¦r¦ê·íkey,item¬O
      '¬O²Ö¥[i°j°é¦Cj°j°éÄæBrr°}¦C­È

      Y(Tr) = i: Y(Tr & "|Sum") = Y(Tr & "|Sum") + Brr(i, j)
      '¡ô¥OTrÅܼƷíkey,item¬OiÅܼÆ,¯Ç¤JY¦r¨å¤¤,
      '¡ô¥O¥HTrÅܼƳs±µ"|Sum"²Õ¦¨·s¦r¦ê·íkey,item¬O
      '¬O²Ö¥[i°j°é¦Cj°j°éÄæBrr°}¦C­È

   Next
Next
T = Trim(xC): If T = "" Then GoTo 102
'¡ô¥OTÅܼƬO xCÅܼƥh°£«e«áªÅ¥Õ¦r¤¸«áªº·s¦r¦ê,
'¦pªGTÅܼƬO ªÅ¦r¤¸?´N¸õ¨ì¼Ð¥Ü102¦ì¸mÄ~Äò°õ¦æ

A = Split(Replace(Replace(xC, "$A", ""), ":", "~"), ",")
'¡ô¥OAÅܼƬOxCÅܼƦr¦ê³Q¤À³Î¦¨ªº¤@ºû°}¦C
'³QxCÅܼƳQ¤À³Î«e¥ý°µ2¦¸ªº¦r¤¸¸m´«,"$A"´«¦¨ "", ":"´«¦¨ "~"
'³Ì«á¥H³r¸¹¤À³Î¦¨¤@ºû°}¦C

If A(0) = "" Then Z = 0: GoTo 102
'¡ô¦pªG0¯Á¤Þ¸¹A°}¦C­È¬O ªÅ¦r¤¸?´N¥OZÅܼƬO0,¸õ¨ì¼Ð¥Ü102¦ì¸mÄ~Äò°õ¦æ
For Each V In A
'¡ô³]³v¶µ°j°é!¥OVÅܼƬO A°}¦C¸Ìªº¤@°}¦C­È
   V1 = Y(xY & "|" & Split(V, "~")(0))
   '¡ô¥OV1ÅܼƬOxYÅܼƳs±µ"|",
   '¦A³s±µ(VÅܼƥH"~"¤À³Î«áªº0¯Á¤Þ¸¹°}¦C­È)©Ò²Õ¦¨ªº·s¦r¦ê¬d,
   '¬dY¦r¨å¦^¶Çitem­È

   V2 = Y(xY & "|" & StrReverse(Split(StrReverse(V), "~")(0)))
   '¡ô¥O¥HV2ÅܼƬOxYÅܼƳs±µ"|",¦A³s±µ(VÅܼƦr¤¸¶¶§ÇÄA­Ë«á,
   '¥H"~"¤À³Î«áªº0¯Á¤Þ¸¹°}¦C­È°µ¦r¤¸¶¶§ÇÄA­Ë¦^¨Ó,
   '¥H¤W²Õ¦¨ªº·s¦r¦ê¬dY¦r¨å¦^¶Çitem­È

   If InStr(V, "~") Then
   '¡ô¦pªGVÅܼƸ̦³¥]§t"~" ?
      If V1 * V2 = 0 Then Z = 0: GoTo 102
      '¡ô¦pªGV1ÅܼƻPV2Åܼƪº­¼¿n¬O 0,
      '´N¥OZÅܼƬO0 , ¸õ¨ì¼Ð¥Ü102¦ì¸mÄ~Äò°õ¦æ

      If V1 > V2 Then M = V2: V2 = V1: V1 = M
      '¡ô¦pªGV1ÅܼƤj©óV2ÅܼÆ?´N¥OMÅܼƨó§UÅýV1.V2­È¤¬´«
      For R = V1 To V2: Z = Z + Brr(R, Y(xY)): Next
      '¡ô³]¶¶°j°é!±qV1ÅܼƨìV2ÅܼÆ,¥OZÅܼƬO Brr°}¦C­È,
      '(R¬O«üBrr°}¦C¦C¸¹,Y(xY)¬O«ü$I$1Àx¦s®æ­È¬dY¦r¨å°OªºÄ渹)

      ElseIf Y(xY & "|" & V & "|Sum") = "" Then
      '¡ô§_«h¦pªG¥H²Õ¦X¦r¦ê¬dY¦r¨å¸Ìitem¬OªÅ¦r¤¸?
         Z = 0: GoTo 102
         '´N¥OZÅܼƬO0 , ¸õ¨ì¼Ð¥Ü102¦ì¸mÄ~Äò°õ¦æ
      Else
         Z = Z + Y(xY & "|" & V & "|Sum")
         '¡ô§_«h´N¥OZÅܼƲ֥[ ²Õ¦X¦r¦ê¬dY¦r¨å¸Ìitem­È
   End If
Next
102: If Z <> 0 Then SumText = Z Else SumText = ""
'¡ô¦pªGZÅܼƤ£¬O0,´N¥OSumText¨ç¼Æ¦^¶ÇZÅܼÆ(ªø¾ã¼ÆÅܼÆ),
'§_«h´N¦^¶ÇªÅ¦r¤¸

End Function
¥Î¦æ°Ê¸Ë¸mÂsÄý½×¾Â¾Ç²ß«Ü¤è«K,ÁÂÁ½׾¸gÀç¹Î¶¤
½Ð¤j®a¤@°_¤W½×¾Â¨Ó¥æ¬y

TOP

        ÀR«ä¦Û¦b : ¤£©È¨Æ¦h¡A¥u©È¦h¨Æ¡C
ªð¦^¦Cªí ¤W¤@¥DÃD