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

[µo°Ý] ½Ð±Ð­n¦p¦ó¨Ï¥Î VBA §P§O¤£³W«hÀx¦s®æªº¿ìªk2

¦^´_ 13# Hsieh
¦^´_ 16# ML089
¦^´_ 11# stillfish00
­±¿n¤j¤p¤À§G²Î­pB.rar (108.71 KB)
·PÁ¦U¦ìªºÀ°¦£¡A¦pÁÙ¦³§ó¨Î®Ä¯qªº¸Ñ¨M¤è®×¡A
·q½Ð¤£§[«ü±Ð¡I

TOP

¥»©«³Ì«á¥Ñ c_c_lai ©ó 2013-12-7 08:05 ½s¿è

¦^´_ 16# ML089
¥H±`²z¨Ó½×¡A 10 »P 25 À³µL©¼¦¹¶¡¤§¦êÁp¡AÀ³Äݤ£¦P¤§°Ï¶ô¤~¬O¡A
§A¦b¹ê§@¤W¬O¦p¦ó¸ÑªRªº¡H

TOP

¦^´_ 16# ML089
Hsieh ª©¤j¥L¬OÀ³¥Î "»¼°j" ªº³B²z§Þ¥©¡A¨Ó¨D¥X¦UÂkÄݰ϶ôªº½d³ò¡A
³oºØÂI¤Î©ó­±ªº¹B¥Î¬O­ÓÆZ¤£¿ùªº Idea¡A§A¬Ý¬Ýµ{¦¡½X²Ó²Ó¦a¥h±ÀºV¡A
¬OÆZ­È±o¦^¨ýªº¡A ¦bùØÀY§Ú¥[¤W¤F sRng ªº¦ì§}¬ö¿ý³B²z¡A¨Ã¦P®É¨D¨ú
¨C­Ó°Ï¶ôªº¹ê»Ú¦ì§}¼Æ¡A¥H´£¨Ñ°Ñ¦Ò¤§¥Î¡G
  1. Option Explicit

  2. Public s As Long
  3. Public sRng As Variant

  4. Sub ex()
  5.     Dim dic As Object
  6.     Dim A As Range, Rng As Range, sPos As Range
  7.    
  8.     Set dic = CreateObject("Scripting.Dictionary")
  9.     dic("³sÄò¼Æ¶q") = "¼Æ¶q"
  10.     '   ¼W¦C³¡¤À
  11.     ¤u§@ªí2.[C1] = "³sÄò¦ì§}"
  12.     ¤u§@ªí2.[D1] = "²Õ¦X¼Æ¶q"
  13.    
  14.     With ¤u§@ªí1
  15.         Set Rng = .Range("A1").CurrentRegion
  16.         Rng.Replace 0, Empty, xlWhole
  17.         
  18.         Set sPos = ¤u§@ªí2.[C2]
  19.         Set A = Rng.Find(Empty)
  20.         
  21.         Do Until A Is Nothing
  22.             A = 0: s = 1
  23.             Cnt A
  24.             dic(s) = dic(s) + 1
  25.             
  26.             sPos = sRng
  27.             sPos.Offset(0, 1) = Range(sRng).Count
  28.             
  29.             Set A = Rng.Find(Empty)
  30.             
  31.             Set sPos = sPos.Offset(1)
  32.         Loop
  33.     End With
  34.    
  35.     With ¤u§@ªí2
  36.         .[A1].Resize(dic.Count, 1) = Application.Transpose(dic.keys)
  37.         .[B1].Resize(dic.Count, 1) = Application.Transpose(dic.items)
  38.         .[A1].Resize(dic.Count, 2).Sort key1:=.[A1], Header:=xlYes
  39.     End With
  40.    
  41.     '  MsgBox dic.Count - 1
  42.     Set dic = Nothing
  43. End Sub

  44. Function Cnt(Rng As Range)
  45.     Dim A As Range, Temp As Range
  46.     Dim i As Integer
  47.         
  48.     For Each A In Rng
  49.         For i = -1 To 1 Step 2
  50.             If A.Row + i > 0 And A.Row + i < ¤u§@ªí1.Range("A1").CurrentRegion.Rows.Count Then
  51.                 If IsEmpty(A.Offset(i, 0)) Then Set Temp = Union(Rng, A.Offset(i, 0))   '  "$BF$4:$BF$5"
  52.             End If
  53.         Next
  54.         For i = -1 To 1 Step 2
  55.             If A.Column + i > 0 And A.Column + i < ¤u§@ªí1.Range("A1").CurrentRegion.Columns.Count Then
  56.                 If IsEmpty(A.Offset(, i)) Then Set Temp = Union(Rng, A.Offset(, i))   '  "$BF$4:$BG$4"
  57.             End If
  58.         Next
  59.     Next

  60.     If Not Temp Is Nothing Then      '  True
  61.         Temp = 0
  62.         s = Temp.Count
  63.         sRng = Temp.Address
  64.         Cnt Temp
  65.     End If
  66. End Function
½Æ»s¥N½X

TOP

¥»©«³Ì«á¥Ñ c_c_lai ©ó 2013-12-7 08:42 ½s¿è

¦^´_ 20# c_c_lai
20# ªº Ex() ¤º¤§ C¡BD Äæ¤@¦æ¤@¦æ¦a¥h»¼¼W¬O¬°¤F­n
Æ[¹î¸ê®Æ³B²z¤Î¹Lµ{¡C¥H¤U¬°§ï¥H "¦r¨å" ³B¸Ì¡G
  1. Sub ex2()
  2.     Dim dic As Object, dic2 As Object
  3.     Dim A As Range, Rng As Range
  4.    
  5.     Set dic = CreateObject("Scripting.Dictionary")
  6.     Set dic2 = CreateObject("Scripting.Dictionary")
  7.     dic("³sÄò¼Æ¶q") = "¼Æ¶q"
  8.     dic2("³sÄò¦ì§}") = "²Õ¦X¼Æ¶q"
  9.    
  10.     With ¤u§@ªí1
  11.         Set Rng = .Range("A1").CurrentRegion
  12.         Rng.Replace 0, Empty, xlWhole
  13.         
  14.         Set A = Rng.Find(Empty)
  15.         
  16.         Do Until A Is Nothing
  17.             A = 0: s = 1
  18.             Cnt A
  19.             dic(s) = dic(s) + 1
  20.             dic2(sRng) = Range(sRng).Count
  21.             
  22.             Set A = Rng.Find(Empty)
  23.         Loop
  24.     End With
  25.    
  26.     With ¤u§@ªí2
  27.         .[A1].Resize(dic.Count, 1) = Application.Transpose(dic.keys)
  28.         .[B1].Resize(dic.Count, 1) = Application.Transpose(dic.items)
  29.         .[A1].Resize(dic.Count, 2).Sort key1:=.[A1], Header:=xlYes
  30.         .[C1].Resize(dic2.Count, 1) = Application.Transpose(dic2.keys)
  31.         .[D1].Resize(dic2.Count, 1) = Application.Transpose(dic2.items)
  32.    End With
  33.    
  34.     '  MsgBox dic.Count - 1
  35.     Set dic = Nothing
  36.     Set dic2 = Nothing
  37. End Sub
½Æ»s¥N½X
·PÁ Hsieh ª©¤jªº«ü¾É¡I

TOP

¦^´_ 23# ML089
½Ð±Ð¡G
  1.     '  ¡õ ­pºâ¨C²Õ­Ó¼Æ¡C ª`·N! Frequency ¦^¶Ç i + 1 ²Õ¡A©Ò¥ý±N i - 1
  2.     Bins_array = Application.Evaluate("Row(1:" & i - 1 & ")")
  3.     ArrN = Application.Frequency(Arr, Bins_array)
  4.     MaxN = Application.Max(ArrN)

  5.     '  ¡õ ²Î­p¨C²Õ­Ó¼Æ¡C ª`·N! Frequency ¦^¶Ç i + 1 ²Õ¡A©Ò¥ý±N MaxN - 1
  6.     Bins_array = Application.Evaluate("Row(1:" & MaxN - 1 & ")")
  7.     ArrF = Application.Frequency(ArrN, Bins_array)
½Æ»s¥N½X
Bins_array¡BArrN ¡BMaxN ¡BArrF  ªº¤º²[¤Î§@¥Î¡A¯à§_¥[¥H¸ÑªR¡A
§Ú¹ï¤@¨Ç¥Î»y¤£«Ü±E±x¡A¥B¤ÏÀ³¸û¿ð¶w¡AÁÂÁÂÅo¡I

TOP

¥»©«³Ì«á¥Ñ c_c_lai ©ó 2013-12-7 17:22 ½s¿è

¦^´_ 26# stillfish00
¦^´_ 27# ML089
ªº½T¡I
´£¨ú¨ìArray½T¹ê¥[³t«Ü¦h¡A¦P®É¤]¸Ñ¨M¤F¿ð½wªº§xÂZ¡C
ÁÂÁ§Aµ¥ªº«ü±Ð¡I

TOP

¦^´_ 29# ML089
ÁÂÁ§A¸ÔºÉªº»¡©ú¡A­è¤~§Ú¤w¥þ³¡¨Ï¥Î Debug ¶]¤F¤@°é¡A
¤£©úÁA³B¥ç¤w¥ÑDebug¤¤±o¨ìµª®×¡A¦¹µ{¦¡À³¥Î°}¦C³B²z
¥ç±Æ°£¤F­ì¥ý°õ¦æ³t«×¿ð½wªº§xÂZ¡AÁÂÁ§AªºÀ°¦£¡I

TOP

¦^´_ 32# ML089
¸Õ¸Õ¸g­×§ï«á¤§µ{¦¡¡G

­±¿n¤j¤p¤À§G²Î­p_ML089.rar (150.15 KB)

TOP

¦^´_ 32# ML089
§ó¥¿¹Ï¤ù¡A¤WÀYªº¬O¦b Debug Mode¡A ©Ò¥H®É¶¡¸ûªø¡A
§ó¥¿«á¤§¹Ï¤ù¬°½T¹ê°õ¦æ¬í¼Æ¡C

TOP

¥»©«³Ì«á¥Ñ c_c_lai ©ó 2013-12-7 20:51 ½s¿è

¦^´_ 32# ML089
¼W­×«á¤§µ{¦¡½X¦p¤U¡G
  1. Option Explicit

  2. '  ML089 ¼g©ó 2013/12/7
  3. '  http://forum.twbts.com/viewthread.php?tid=10927&extra=&page=3
  4. Sub ³sÄò0­Ó¼Æ¤§²Î­p()
  5.     Dim dic As Object
  6.     Dim t1 As Date, tt1 As Date, t2 As Date, tt2 As Date
  7.     Dim Arr As Variant, xDebug As String, sRng As Range, WriteToRange As Range
  8.     Dim i As Integer, c As Long, r As Long, y As Integer, rN As Long, cN As Long
  9.     Dim Bins_array As Variant, ArrF As Variant, ArrN As Variant, MaxN As Double
  10.    
  11.     Application.Calculation = xlManual    '  Ãö³¬­pºâ
  12.     Application.ScreenUpdating = False    '  Ãö³¬Åã¥Ü

  13.     xDebug = InputBox("°}¦C­pºâ¸ê®Æ¼g¥X¡C¶ñ¤J 1 / 0 ±±¨î :", "DeBug", 0) '  ¡·°}¦C­pºâ¸ê®Æ¼g¥X¡C¶ñ¤J 1¡BTure / 0¡BFlase ±±¨î
  14.     If xDebug Then ActiveSheet.Copy after:=ActiveSheet    '  Test Use 1

  15.     t1 = Timer: tt1 = Time    '  ¬í¼Æ­p®É¾¹
  16.     Set dic = CreateObject("Scripting.Dictionary")
  17.     dic("³sÄò¦ì§}") = "²Õ¦X¼Æ¶q"

  18.     '  ¡õ §ä 0¡A±N¨C²Õ³sÄò 0 ½s¤£¦P§Ç¸¹
  19.     '  Arr : Variant/Variant(1 to 20, 1 to 26)
  20.     Arr = ActiveSheet.[A1].CurrentRegion    '  Åª¤J°}¦C
  21.    
  22.     i = 0
  23.     rN = UBound(Arr, 1)     '  Y  Rows     20
  24.     cN = UBound(Arr, 2)     '  X  Columns  26
  25.    
  26.     For c = 1 To cN
  27.         For r = 1 To rN     '  ¦¹°j°é±N°}¦C«D0­È§ï¬°¤å¦r«¬ºA
  28.             If Arr(r, c) <> 0 Then Arr(r, c) = "X" '  Empty ·|³Qµø¬° 0¡A"" ¤£·|
  29.         Next
  30.     Next
  31.     For c = 1 To cN
  32.         For r = 1 To rN    '  ¦¹°j°é§ä 0
  33.             If Arr(r, c) = 0 Then
  34.                 i = i + 1
  35.                 Set sRng = Sheets("TEST2").Cells(r, c)
  36.                 Call xRep(Arr, r, c, i, sRng)
  37.                 dic(sRng.Address) = Range(sRng.Address).Count
  38.             End If
  39.         Next
  40.     Next

  41.     If xDebug Then [A1].Resize(rN, cN) = Arr    '  Test Use 2    ' i = 11

  42.     '  ¡õ ­pºâ¨C²Õ­Ó¼Æ¡C ª`·N! Frequency ¦^¶Ç i + 1 ²Õ¡A©Ò¥ý±N i - 1
  43.     Bins_array = Application.Evaluate("Row(1:" & i - 1 & ")")   ' i = 11
  44.     '  ­pºâ¬Y¤@­Ó½d³ò¤ºªº­È¥X²{ªº¦¸¼Æ¡A¨Ã¶Ç¦^¤@­Ó««ª½¼Æ­È°}¦C¡C
  45.     '  ¨Ò¦p¡A¥Î FREQUENCY ¨Ó­pºâ¬Y¨Ç½d³ò¤ºªº¦Ò¸Õ¦¨ÁZ¦U¦³´X­Ó¤H¡C
  46.     '  ¥Ñ©ó FREQUENCY ¶Ç¦^°}¦C¡A¦]¦¹¥²¶·¿é¤J¬°°}¦C¤½¦¡¡C
  47.     ArrN = Application.Frequency(Arr, Bins_array)
  48.     MaxN = Application.Max(ArrN)   '  MaxN : 62 : Variant/Double  (¥H¤W²Î­p¼Æªº³Ì¤j­È)

  49.     '  ¡õ ²Î­p¨C²Õ­Ó¼Æ¡C ª`·N! Frequency ¦^¶Ç i + 1 ²Õ¡A©Ò¥ý±N MaxN - 1
  50.     Bins_array = Application.Evaluate("Row(1:" & MaxN - 1 & ")")
  51.     ArrF = Application.Frequency(ArrN, Bins_array)

  52.     '  ¡õ ¼g¥X¸ê®Æ
  53.     Set WriteToRange = ActiveSheet.Cells(rN + 3, 1)
  54.     WriteToRange.CurrentRegion.ClearContents
  55.     Application.Goto Reference:=WriteToRange, scroll:=True   ' ±Nµe­±¤Á´«¦Ü WriteToRange¡C
  56.     With WriteToRange
  57.         .Resize([A:A].Rows.Count - rN - 3, 2) = ""
  58.         .Resize(1, 2) = Application.Evaluate("{""³sÄò¼Æ"", "";²Õ¼Æ""}")
  59.         y = 0
  60.         For i = 1 To MaxN
  61.             If ArrF(i, 1) <> 0 Then
  62.                 y = y + 1
  63.                 .Offset(y, 0) = i
  64.                 .Offset(y, 1) = ArrF(i, 1)
  65.             End If
  66.         Next
  67.         .Offset(0, 2).Resize(dic.Count, 1) = Application.Transpose(dic.keys)
  68.         .Offset(0, 3).Resize(dic.Count, 1) = Application.Transpose(dic.items)
  69.          
  70.         t2 = Timer: .Offset(y + 1, 1) = Format(t2 - t1, "0.00") & " ¬í"
  71.         tt2 = Time: .Offset(y + 2, 1) = Format((tt2 - tt1) * 24 * 60 * 60, "0.00") & " ¬í"
  72.     End With
  73.     Set Arr = Nothing       '  ÄÀ©ñ°O¾ÐÅé
  74.     Set dic = Nothing
  75.    
  76.     Application.ScreenUpdating = True
  77.     Application.Calculation = xlCalculationAutomatic
  78. End Sub

  79. '  »¼°j©I¥s( recursive call )¬d¸ß¡A±N³sÄò0¼g¤J¦P¤@½s¸¹
  80. Sub xRep(ByRef Arr, r, c, i, ByRef rng As Range)
  81.     Dim Temp As Range
  82.    
  83.     Arr(r, c) = i    '  ¼g¤J½s¸¹
  84.     Cells(r, c).Interior.ColorIndex = 6    '  Test Use 3
  85.     Set Temp = Union(rng, Sheets("TEST2").Cells(r, c))
  86.     On Error Resume Next    '  ÁקKÃä¬É¿ù»~
  87.     If Arr(r - 1, c) = 0 Then Call xRep(Arr, r - 1, c, i, Temp)    '  §ä¤W
  88.     If Arr(r + 1, c) = 0 Then Call xRep(Arr, r + 1, c, i, Temp)    '  §ä¤U
  89.     If Arr(r, c - 1) = 0 Then Call xRep(Arr, r, c - 1, i, Temp)    '  §ä¥ª
  90.     If Arr(r, c + 1) = 0 Then Call xRep(Arr, r, c + 1, i, Temp)    '  §ä¥k
  91.     Set rng = Temp
  92. End Sub
½Æ»s¥N½X

TOP

        ÀR«ä¦Û¦b : ¤@­Ó¯Ê¤fªºªM¤l¡A¦pªG´«¤@­Ó¨¤«×¬Ý¥¦¡A¥¦¤´µM¬O¶êªº¡C
ªð¦^¦Cªí ¤W¤@¥DÃD