iT邦幫忙

0

EXCEL 如何找到表格中特定位置資料 並改掉

我知道用INDEX 加MATCH 可以找到值 但我希望依名字跟日期對應到後值後,直接把原值改掉,請問有辦法嗎 或寫VBA

以下表為依居直接把上表改掉 有新班別直接把原班別改掉
https://ithelp.ithome.com.tw/upload/images/20190329/20116514S0ch7mfYzN.png我知道用INDEX
https://ithelp.ithome.com.tw/upload/images/20190328/201165142xnLVyEm4n.jpg
https://ithelp.ithome.com.tw/upload/images/20190329/20116514MXOBPjr9Tk.png

來杯拿鐵大大你好
很感謝你的回答
但我還是VBA新手,真的看不太懂
可否請你逐行多打一點註解
我試著做一些備註
但不懂那個邏輯,想套用都難
Sub 換班()
'換班表A23:H28 ,原班表A14:M20(D14:M20日期,B16:B20)
'提出人want答應人 hire
'want(日期,姓名,原班別)
'宣告dataR = 24
dataR = 24
'A16儲存格
last = Range("A16").End(xlDown).Row
'Cells(列,欄)(24,1)
'提出人WANT=陣列(24,1)(24,2)(24,3)
'答應人hire=陣列(24,5)(24,6)(24,7)
Do While Cells(dataR, 1).Value <> ""
want = Array(Cells(dataR, 1), Cells(dataR, 2), Cells(dataR, 3))
hire = Array(Cells(dataR, 5), Cells(dataR, 6), Cells(dataR, 7))

For i = 16 To last
'假設名字格值=
    If Cells(i, 2).Value = want(1) Then
        want(1) = Cells(i, 1)
    End If
    If Cells(i, 2).Value = hire(1) Then
        hire(1) = Cells(i, 1)
    End If
Next
'C15格偏移
Range("C15").Offset(hire(1), hire(0)).Select
Range("C15").Offset(hire(1), hire(0)).Value = want(2)
Range("C15").Offset(want(1), want(0)).Select
Range("C15").Offset(want(1), want(0)).Value = hire(2)
dataR = dataR + 1

Loop
End Sub

目前知道就就怎麼多,可否請您多打一點註解

看更多先前的討論...收起先前的討論...
你的圖解析度太差
小魚 iT邦大師 1 級 ‧ 2019-03-28 22:29:35 檢舉
如果要把值改掉就要VBA吧,
除非你是用條件判斷去決定顯示什麼,
那就可以直接用公式.
有誠意
VBA會需要基礎知識
1.另存為允許巨集副檔名
2.將程式貼到模組
3.指定巨集到按鈕(如果要長期使用)
學會這些才能用VBA
不好意思,原文修改不會通知
下次用私訊會比較快

1 個回答

1
來杯拿鐵
iT邦新手 2 級 ‧ 2019-03-29 16:42:23
最佳解答

這是示範請記得修改
https://ithelp.ithome.com.tw/upload/images/20190329/20091910omITxlcMzj.jpg

Sub 換班()
'換班表A23:H28 ,原班表A14:M20(D14:M20日期,B16:B20)
'提出人want答應人 hire
'want提出人=陣列(換班日期,提出人姓名,提出人班表)
'hire答應人=陣列(換班日期,答應人姓名,答應人班表)

last = Range("A16").End(xlDown).Row 'A16到表格底端(確認員工人數
dataR = 24 '換班表第一列
sta = "C15"

比較簡單作法改上面三列參數
last:Range("A16")改成你原班表「王大明」位置
dataR = 24 改成你換班表第一列列數(表頭不算)
sta = "C15"改成你原班表「星期」位置

Do While Cells(dataR, 1).Value <> "" '不斷執行程式直到空值
    '儲存換班表第n列
    want = Array(Cells(dataR, 1), Cells(dataR, 2), Cells(dataR, 3))
    hire = Array(Cells(dataR, 5), Cells(dataR, 6), Cells(dataR, 7))
    
    '把員工姓名改成員工編號
    'hire答應人=陣列(換班日期,答應人姓名,答應人班表)
    For i = 16 To last
        If Cells(i, 2).Value = want(1) Then
            want(1) = Cells(i, 1) '
        End If
        If Cells(i, 2).Value = hire(1) Then
            hire(1) = Cells(i, 1)
        End If
    Next
    
    '從C15往下hire(1)列,往右hire(0)列,改成提出人班表
    '員工編號是往下排序,所以會移動到答應人同列
    '而日期則是往右排序,所以會移動到跟日期同欄
    Range(sta).Offset(hire(1), hire(0)).Value = want(2)
    Range(sta).Offset(want(1), want(0)).Value = hire(2)
    dataR = dataR + 1 '換班表下一列
Loop
End Sub

我要發表回答

立即登入回答