標題:
符合指定條件.並合併傳回相對應儲存格內容.
[打印本頁]
作者:
joey3277
時間:
2013-11-21 11:17
標題:
符合指定條件.並合併傳回相對應儲存格內容.
[attach]16813[/attach]
如上圖
如果相對應的A欄 有不同的內容與重覆相同的
有哪各公式可自動清除重覆 並合併不同內容再同一各儲存格
作者:
luhpro
時間:
2013-11-24 11:29
回復
1#
joey3277
這用 Excel VBA 較容易寫 :
Sub nn()
Dim lSou&, lTar&
Dim sStr$
Dim vD, vK, vI
Set vD = CreateObject("Scripting.Dictionary")
lSou = 2
Do While Cells(lSou, 3) <> ""
sStr = CStr(Cells(lSou, 1))
If InStr(1, vD(CStr(Cells(lSou, 3))), sStr) = 0 Then
If vD(CStr(Cells(lSou, 3))) = "" Then
vD(CStr(Cells(lSou, 3))) = sStr
Else
vD(CStr(Cells(lSou, 3))) = vD(CStr(Cells(lSou, 3))) & "&" & sStr
End If
End If
lSou = lSou + 1
Loop
lSou = 0
lTar = 2
vK = vD.keys
vI = vD.items
Do While lSou < vD.Count
Cells(lTar, 5) = vI(lSou)
Cells(lTar, 6) = vK(lSou)
lTar = lTar + 1
lSou = lSou + 1
Loop
End Sub
複製代碼
作者:
joey3277
時間:
2013-11-29 10:41
感謝大大的回覆
又想請問
1.我求的結果顯示在 跟 資料在不同的檔案的話 要如何修改
如資料在A檔案 但你提供的巨集篩選想顯示在B檔案
2.如果我的訂單月份欄輸入的方式改成數字後面加一各小數點.如(1.)
這樣用公式的方式合併A欄的資料時也分的清楚.如(1.2.).
但想請問不用巨集的方式
公式要如何寫
作者:
luhpro
時間:
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) (其下儲存格公式沿用)
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)