Board logo

標題: [發問] 巨集錄製=countif的使用問題 [打印本頁]

作者: boblovejoyce    時間: 2016-6-8 20:06     標題: 巨集錄製=countif的使用問題

我使用了兩種常見函數,但是是使用聚集錄製而成的~所以執行上會有點慢
=COUNTIF
=CONCATENATE
能否改善呢?
我不解的是~
y = Cells(9, 1).End(xlDown).Row
為什麼y得到的值不是1553?
求高手指導

這份檔案,經過篩選後
J欄位是1的,只看出現1次的~~


[attach]24449[/attach]
作者: GBKEE    時間: 2016-6-9 07:17

回復 1# boblovejoyce
y = Cells(9, 1).End(xlDown).Row 為什麼y得到的值不是1553?
Y 的期望值是 Cells(9, 1) = A9,往下最後一個有資料的儲存格
附檔程式中 為何不是A1而用A9
試試看  工作表上有太多公式會托慢程式運行
  1. Option Explicit
  2. Sub test()
  3.     Dim S As Worksheet, f As Integer, r As String, i As Integer, j As Integer, a() As String, t As Date
  4.     Dim tmpath As String, MyFile As String
  5.     t = Timer
  6.     tmpath = ActiveWorkbook.Path
  7.     MyFile = tmpath & "\" & "Sch_chk.txt" '讀取當前EXCEL檔案路徑下的指定TXT
  8.     i = 1 '從第i列開始寫入檔案資料,i可自訂依自己需要
  9.     Set S = ActiveSheet
  10.     S.Cells.Clear
  11.     f = FreeFile
  12.     Open MyFile For Input As #f
  13.     Do While Not EOF(f)
  14.         Line Input #f, r
  15.         If (InStr(1, r, "CHPT Design Note", vbTextCompare)) = 0 And _
  16.                 (InStr(1, r, "_Index_", vbTextCompare)) = 0 Then '空格_,是一個連接詞,用於換行
  17.                 a = Split(r, "!") '該檔案以!為分隔符號
  18.                 S.Cells(i, "a").Resize(, UBound(a) + 1) = a
  19.             'For j = 0 To UBound(a)
  20.             '   s.Cells(i, j + 1).Value = a(j) '讀取資料依序存入第i列的第1個到j個欄位
  21.             'Next j
  22.             i = i + 1
  23.         End If
  24.     Loop
  25.     Close #f
  26.         With S.Range("D1:D" & S.[A1].End(xlDown).Row) 'D1:D"&到A欄最後一列號的範圍
  27.             .Cells = "=RC[-2]&RC[-1]"
  28.             ' 等同自動填滿 : AutoFill Destination:=Range("D1:D" & x &)
  29.             .Value = .Value
  30.         End With
  31.         'ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[-2],RC[-1])"
  32.        'ActiveCell.FormulaR1C1 = "=RC[-2]&RC[-1]"
  33.        ' Range("D1").Select
  34.         'x = Cells(3, 1).End(xlDown).Row
  35.         'Selection.AutoFill Destination:=Range("D1:D" & x & "") '儲存格自動填滿
  36.         
  37.         S.Range("A:A,D:D").Copy
  38.         S.Range("H1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  39.             :=False, Transpose:=False
  40.         'Range("A:A,D:D").Select
  41.         'Selection.Copy
  42.         'Range("H1").Select
  43.         'Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  44.             :=False, Transpose:=False
  45.         'Application.CutCopyMode = False
  46.         
  47.         '*****************************
  48.         '2003版沒 RemoveDuplicates 這方法,可用進階篩選不重複的資料
  49.         ActiveSheet.Range("$H$1:$I$65536").RemoveDuplicates Columns:=2, Header:=xlNo
  50.         '*****************************************
  51.         
  52.         With S.Range("J1:J" & S.[A1].End(xlDown).Row) 'J1:J"&到A欄最後一列號的範圍
  53.             .Cells = "=COUNTIF(C[-6],RC[-1])"
  54.             ' 等同自動填滿 : AutoFill Destination:=Range("J1:J" & x )
  55.             .Value = .Value
  56.         End With
  57.         'y = Cells(9, 1).End(xlDown).Row
  58.         'Range("J1").Select
  59.         'ActiveCell.FormulaR1C1 = "=COUNTIF(C[-6],RC[-1])"
  60.         'Selection.AutoFill Destination:=Range("J1:J" & s.[A1].End(xlDown).Row)
  61.         'Selection.AutoFilter
  62.         '*****2003 自動篩範圍選,需是連續範圍****************
  63.         'ActiveSheet.Range("H:H,J:J").AutoFilter Field:=3, Criteria1:="1"
  64.         '**************************************************
  65.         S.Range("H1").AutoFilter Field:=3, Criteria1:="1"
  66.         'MsgBox "讀取檔案資料ok"
  67.         MsgBox Format(Timer - t, "0.0000")
  68. End Sub
複製代碼

作者: c_c_lai    時間: 2016-6-9 08:32

回復 2# GBKEE
恕我愚昧,請問 GBKEE 版大,您在最後之
  1. S.Range("H1").AutoFilter Field:=3, Criteria1:="1"
複製代碼
語法的設定用意是?  它想表達的作用是?
又 Field:=3, Criteria1:="1" 各指向哪裡?
[attach]24452[/attach]
謝謝您!
作者: GBKEE    時間: 2016-6-9 09:17

回復 3# c_c_lai
  1. 'Selection.AutoFilter
  2. 62.        '*****2003 自動篩範圍選,需是連續範圍****************
  3. 63.        'ActiveSheet.Range("H:H,J:J").AutoFilter Field:=3, Criteria1:="1"
複製代碼


S.Range("H1").AutoFilter Field:=3, Criteria1:="1"
AutoFilter(自動篩選:會抓取指定的連續欄位) 第一欄,為Field:=1,,,,類推
所以 Field:=3 (第三欄)-> 為S.Range("J1")
  1. AutoFilter 方法  [自動篩選] 篩選出一個清單。為 Variant。
  2. expression.AutoFilter(Field, Criteria1, Operator, Criteria2, VisibleDropDown)
  3. expression 必選。該運算式會傳回 [套用於] 清單中的其中一個物件。
  4. Field 選擇性的 Variant。相對於作為篩選基準欄位 (從清單左側開始,最左側的欄位為第一個欄位) 的位移。
複製代碼

作者: c_c_lai    時間: 2016-6-9 10:47

回復 4# GBKEE
感謝您!
跟我心中預測的狀態一樣,謝謝您釋疑!
作者: boblovejoyce    時間: 2016-6-13 11:58

回復  boblovejoyce
y = Cells(9, 1).End(xlDown).Row 為什麼y得到的值不是1553?
Y 的期望值是 Cells(9, ...
GBKEE 發表於 2016-6-9 07:17



謝謝板主大大的指點~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)