Board logo

標題: 請教搜尋名稱 找出日期 謝謝 [打印本頁]

作者: mycmyc    時間: 2018-11-1 19:35     標題: 請教搜尋名稱 找出日期 謝謝

請教
[attach]29617[/attach]我想找出  濁水軀體模板  有施工的日期 要如何達成呢 謝謝
作者: n7822123    時間: 2018-11-2 01:25

本帖最後由 n7822123 於 2018-11-2 01:34 編輯

回復 1# mycmyc


J4:輸入你要的工程名稱
J6~J100:=IFERROR(SMALL(IF(HLOOKUP($J$4,$A$1:$H$100,ROW(),FALSE)="","",$A$6:$A$100),ROW()-5),"")

Ctrl+Shift+Enter

[attach]29618[/attach]

[attach]29619[/attach]
作者: hcm19522    時間: 2018-11-2 10:20

{=IFERROR(SMALL(IF((B$1:H$1=K$8)*(B$6:H$30>0),A$6:A$30),ROW(A1)),"")
作者: mycmyc    時間: 2018-11-2 14:57

謝謝 二位前輩指導  我試試看 有問題再請教喔
作者: mycmyc    時間: 2018-11-2 18:07

回復 4# mycmyc

再請教前輩 我想再拿出 尋找到日期後 找出 該日期數量
麻煩 前輩指教[attach]29623[/attach]
作者: mycmyc    時間: 2018-11-2 18:12

回復 2# n7822123




再請教前輩 我想再拿出 尋找到日期後 找出 該日期數量
麻煩 前輩指教   [attach]29624[/attach]
作者: n7822123    時間: 2018-11-2 22:34

回復 6# mycmyc


K6:
IFERROR(INDEX($A$1:$H$100,MATCH($J6,$A$1:$A$100,0),MATCH($J$4,$A$1:$H$1,0)),"")

下拉

[attach]29625[/attach]
作者: mycmyc    時間: 2018-11-2 23:25

回復 7# n7822123
謝謝 阿龍 前輩指導
我先試試看喔
謝謝你
作者: 准提部林    時間: 2018-11-3 10:34

K6:
=IFERROR(VLOOKUP(J6,A:H,MATCH(J$4,A$1:H$1,),),"")
作者: mycmyc    時間: 2018-11-3 15:16

回復 9# 准提部林

    讚!!
    謝謝你 我試試喔
作者: n7822123    時間: 2018-11-4 03:33

回復 10# mycmyc


準大寫的更簡單一些!
作者: mycmyc    時間: 2018-11-4 13:19

回復 10# mycmyc


    不好意思   再請問 依日期欄 取回 當日不為0的工作內容   如紅色之文字  謝謝您
[attach]29635[/attach]
作者: n7822123    時間: 2018-11-5 01:08

本帖最後由 n7822123 於 2018-11-5 01:14 編輯

回復 12# mycmyc

使用的函數都那些而已,你可以先自己研究看看,
真的寫不出來再請別人幫忙,你也可以學到東西,
如果想都不去想,就發問的話,以後遇到類似的問題,還是只能一直請別人幫忙

這次的比較複雜一點點,就先幫你了,不過我沒有把字串再接起來(你可以在別的儲存格做串接)
我寫的有些複雜,應該有更好更簡短的寫法,懶得想了,有請大神賜教!

選取K6:Q6,後輸入
=IFERROR(INDEX($A$1:$H$1,,SMALL(IF(VLOOKUP($J6,$A$6:$H$30,COLUMN($B$2:$H$2)) <> "",COLUMN($B$2:$H$2),""),COLUMN($A$1:$G$1))),"")

先按住Ctrl+Shift 再按 Enter 後放開
再往下拉

[attach]29638[/attach]
作者: 准提部林    時間: 2018-11-5 12:44

回復 12# mycmyc


自訂函數:
Function GetItem(xA As Range, xB As Range) As String
Dim xR As Range, N%, TT$
For Each xR In xB
    N = N + 1
    If Val(xR) > 0 Then TT = TT & "、" & xA(N)
Next
GetItem = Mid(TT, 2)
End Function

K6/公式:=GetItem(B$1:H$1,INDEX(B:H,MATCH(J6,A:A,),))  下拉
作者: mycmyc    時間: 2018-11-5 20:34

回復 13# n7822123
對不起  確實沒學好
原本想用 自訂公式 把日期下工項 做一陣列  在搜尋不等於"" 列出
這樣變成每一個日期 多需要一個自訂公式    因此沒辦法
對不起 麻煩你了  謝謝你   
應該是我 沒把每個函數 融會貫通    才卡住   我再研究一下  常用那些函數
真的感恩你  謝謝
作者: mycmyc    時間: 2018-11-5 21:31

回復 14# 准提部林


謝謝你  我實驗確定可以
存檔是否依定要為.xlsm  巨集模式
感謝二位前輩
本人確實應該更用心學習  謝謝喔  不好意思 感恩[attach]29644[/attach]
作者: n7822123    時間: 2018-11-6 01:23

本帖最後由 n7822123 於 2018-11-6 01:28 編輯

回復 15# mycmyc


厄......沒事,我沒有要唸你的意思,

沒有人一出生就什麼都會,不用跟我說對不起

因為你在同一個Case發問的頻率有點高,所以我誤以為你想都沒想,就上來要答案,這點我誤解你了

有自己想過就OK了! ,當你卡住的時,得到答案後,印象會更深刻,下次就不會卡在同一個地方

如果沒自己想過,直接得到答案,對於答案是沒有感覺的,一模一樣的東西,換個攔列就可能卡住了

要存巨集的檔名可以是.xls(舊版) 或者 .xlsm(新版) ,

.xlsx 不會存VBA巨集,存檔後關掉再開,巨集就沒有了

作者: 准提部林    時間: 2018-11-6 10:11

回復 16# mycmyc

若資料多, 直接用vba取出相關資料:
Sub GetDateItem()
Dim Arr, i&, j%, N&, T$
[工作表2!A:B].ClearContents
[工作表2!A1:B1] = Array("日期", "施工項目")
Arr = Range([工作表1!H1], [工作表1!A65536].End(xlUp))
For i = 6 To UBound(Arr)
    If Not IsDate(Arr(i, 1)) Then GoTo 101
    For j = 2 To UBound(Arr, 2)
        If Val(Arr(i, j)) <> 0 Then T = T & "、" & Arr(1, j)
    Next j
    If T = "" Then GoTo 101
    N = N + 1
    Arr(N, 1) = Arr(i, 1):  Arr(N, 2) = Mid(T, 2): T = ""
101: Next i
If N > 0 Then [工作表2!A2:B2].Resize(N) = Arr
Application.Goto [工作表2!A1]
End Sub

[attach]29647[/attach]
作者: mycmyc    時間: 2018-11-9 21:33

回復 18# 准提部林


    謝謝準大
我研究一下 謝謝你 熱心指導
作者: GBKEE    時間: 2018-11-10 17:57

回復 19# mycmyc
也可用 Application.Match函數
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng(1 To 2) As Range, e As Range, M As Variant, d As Object
  4.      With Sheets("工作表2")
  5.         .UsedRange.Clear
  6.         .[a1:b1] = Array("日期", "施工項目")
  7.     End With
  8.     With Sheets("工作表1")
  9.         Set Rng(1) = .Range("B6", "B" & .[A6].End(xlDown).Row).Resize(, .[A1].End(xlToRight).Column - 1).SpecialCells(xlCellTypeConstants, 1)
  10.         ' ***   .SpecialCells(xlCellTypeConstants, 1)   是數字的儲存格  ***
  11.         For Each e In Rng(1)
  12.             M = Application.Match(.Cells(e.Row, 1).Text, Sheets("工作表2").Columns(1), 0)
  13.             If IsError(M) Then                             'Match不到                 '
  14.                 Set Rng(2) = Sheets("工作表2").Range("A" & Rows.Count).End(xlUp).Offset(1)
  15.                 Rng(2) = .Cells(e.Row, 1).Text             'A欄的日期
  16.                 Rng(2).Cells(1, 2) = .Cells(1, e.Column)   '第一列的施工項目
  17.             Else
  18.                 Set Rng(2) = Sheets("工作表2").Range("A" & M)   'Match到 的列號
  19.                 Rng(2).Cells(1, 2) = Rng(2).Cells(1, 2) & "、" & .Cells(1, e.Column)
  20.             End If
  21.         Next
  22.     End With
  23. End Sub
複製代碼

作者: Andy2483    時間: 2023-6-13 09:16

謝謝論壇,謝謝各位前輩
後學藉此帖學習前輩的方案,變更不同需求情境,學習方案如下,請各位前輩指教

表1 資料表:
[attach]36568[/attach]

准提部林前輩的精簡方案執行結果:
[attach]36569[/attach]

後學方案執行結果:
[attach]36570[/attach]


Option Explicit
Sub TEST()
Dim Brr, Crr, i&, j%, R&, Y&, X%, T$
Dim xR As Range, Sh1 As Worksheet, Sh2 As Worksheet
'↑宣告變數
Set Sh1 = Sheets("工作表1"): Set Sh2 = Sheets("工作表2")
'↑令變數盛裝物件(工作表)
Sh2.UsedRange.ClearContents
'↑令表2有使用儲存格清除內容
Brr = Range(Sh1.[H1], Sh1.Cells(Rows.Count, "A").End(xlUp))
'↑令Brr變數是二維陣列,以表1的A~H欄陣列值帶入陣列中
Y = UBound(Brr): X = UBound(Brr, 2)
'↑令Y變數是 Brr陣列縱向最大索引列號,令X變數是 Brr陣列橫向最大索引欄號
ReDim Crr(1 To Y, 1 To 2)
'↑令Crr變數是 二維空陣列,縱向範圍同Brr陣列,橫向1~2欄
For i = 6 To Y
'↑設順迴圈
   If i = 6 Then
      Crr(1, 1) = "日期"
      Crr(1, 2) = "施工項目"
      R = 1
   End If
   '↑如果i變數是1,先處理標題列
   If Not IsDate(Brr(i, 1)) Then
   '↑如果Brr陣列標題欄(日期欄)裡的值不是日期?
      MsgBox Brr(i, 1) & " 是錯誤的日期!請修正後再重新執行"
      '↑跳出提示窗 "~~~"
      Exit Sub
      '↑結束程式執行
   End If
   For j = 2 To X
      If Val(Brr(i, j)) > 0 Then T = T & "、" & Brr(1, j)
   Next
   '↑設順迴圈,將同列各欄是數值的標題以頓號間隔
   R = R + 1
   '↑令R變數累加1
   Crr(R, 1) = Brr(i, 1)
   If T <> "" Then
   '↑如果T變數不是空的?
      Crr(R, 2) = Mid(T, 2)
      '↑令Crr陣列第2欄寫入施工項目集字串
      T = ""
      '↑令T變數清除內容
   End If
i01: Next
Sh2.[A1].Resize(R, 2) = Crr
'↑令表2.[A1]擴展範圍儲存格值以Crr陣列值寫入
Application.Goto Sh2.[A1]
'↑令游標跳到表2.[A1]儲存格
Set Sh1 = Nothing: Set Sh2 = Nothing: Erase Brr, Crr
'↑令釋放變數
End Sub




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