- 帖子
- 835
- 主題
- 6
- 精華
- 0
- 積分
- 915
- 點名
- 0
- 作業系統
- Win 10,7
- 軟體版本
- 2019,2013,2003
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2010-5-3
- 最後登錄
- 2024-11-14
|
4#
發表於 2013-11-30 10:31
| 只看該作者
本帖最後由 luhpro 於 2013-11-30 10:35 編輯
感謝大大的回覆
又想請問
1.我求的結果顯示在 跟 資料在不同的檔案的話 要如何修改
如資料在A檔 ...
joey3277 發表於 2013-11-29 10:41 
剛剛看到程式可以再做簡化,
只要在開頭加上 Dim rTar As Range
再於第一個 Do 底下加 Set rTar = .Cells(lSou, 3)
就可以把其下的 .Cells(lSou, 3) 用 rTar 取代.
1.- Sub nn()
- Dim lSou&, lTar&
- Dim sStr$
- Dim rTar As Range
- Dim vD, vK, vI
-
- Set vD = CreateObject("Scripting.Dictionary")
- With Workbooks.Open(ThisWorkbook.Path & "\資料.xls").Sheets("Sheet1")
- lSou = 2
-
- Do While .Cells(lSou, 3) <> ""
- Set rTar = .Cells(lSou, 3)
- sStr = CStr(.Cells(lSou, 1))
- If InStr(1, vD(CStr(rTar)), sStr) = 0 Then
- If vD(CStr(rTar)) = "" Then
- vD(CStr(rTar)) = sStr
- Else
- vD(CStr(rTar)) = vD(CStr(rTar)) & "&" & sStr
- End If
- End If
- lSou = lSou + 1
- Loop
- End With
-
- lSou = 0
- lTar = 2
- vK = vD.keys
- vI = vD.items
- Do While lSou < vD.Count
- Cells(lTar, 1) = vI(lSou)
- Cells(lTar, 2) = vK(lSou)
- lTar = lTar + 1
- lSou = lSou + 1
- Loop
- End Sub
複製代碼 2. 將 vD(CStr(rTar)) = vD(CStr(rTar)) & "&" & sStr 中的 "&" 改為 "."
3. 這就要用到 Excel VBA 實作 自訂工作表函數 了:
以下程式放在 Module 內- Function GetData(rIVar As Range, rTar As Range, iInd As Integer) As String
- ' rIVar 要篩選的值所在儲存格, rTar 清單中篩選欄首格, iInd 資料欄與篩選欄的欄數差
- Dim lRows&
- Dim sStr$
- Dim rRng
- Dim vD, vK, vI
- Application.Volatile ' 設為揮發性函數(每次相關儲存格有異動都要重新計算)
- Set vD = CreateObject("Scripting.Dictionary")
- lRows = rTar.End(xlDown).Row - rTar.Row
- Set rTar = Range(rTar, rTar.Offset(lRows))
- For Each rRng In rTar
- sStr = CStr(rRng.Offset(, iInd))
- If InStr(1, vD(CStr(rRng)), sStr) = 0 Then
- If vD(CStr(rRng)) = "" Then
- vD(CStr(rRng)) = sStr
- Else
- vD(CStr(rRng)) = vD(CStr(rRng)) & "&" & sStr
- End If
- End If
- Next
-
- lRows = 0
- vK = vD.keys
- vI = vD.items
- Do While lRows < vD.Count
- If vK(lRows) = rIVar.Text Then GetData = vI(lRows)
- lRows = lRows + 1
- Loop
- End Function
- Function NrSmall(rTar As Range, iI As Integer) As Integer
- Dim vD
- Dim rRng As Range
- Dim aDat()
- Application.Volatile ' 設為揮發性函數(每次相關儲存格有異動都要重新計算)
- Set rTar = Range([c2], [c9])
- Set vD = CreateObject("Scripting.Dictionary")
- ReDim aDat(0)
- For Each rRng In rTar
- If vD(CStr(rRng)) = "" Then
- If aDat(0) <> 0 Then ReDim Preserve aDat(UBound(aDat) + 1)
- aDat(UBound(aDat)) = rRng
- vD(CStr(rRng)) = rRng
- End If
- Next
- NrSmall = Application.Small(aDat, iI)
- End Function
複製代碼 E2==GetData(F2,C$2,-2) (其下儲存格公式沿用)
F2==NrSmall(C$2:C$9,ROW()-1) (其下儲存格公式沿用) |
|