返回列表 上一主題 發帖

[發問] 怎麼抓取A資料表假日上班的日期與時間到B資料表的儲存格中

回復 14# prince0413
試試看
  1. Const 早 = "10:00~18:00"
  2. Const 全日 = "10:30~18:30"
  3. Const 晚 = "11:00~19:00"
  4. Sub Ex()
  5.     Dim Rng(1 To 2) As Range, i As Integer, 出勤 As String
  6.     Sheets("假日出勤單").PageSetup.PrintArea = "A1:H13"      '一頁就夠了
  7.     Set Rng(1) = Sheets("假日出勤單").Range("J2")            '設定姓名
  8.     Do While Rng(1) <> ""                                    '執行迴圈的條件:姓名<>""
  9.         With Sheets("11月")
  10.             Set Rng(2) = .Range("B:B").Find(Rng(1), LOOKAT:=xlWhole)
  11.             If Not Rng(2) Is Nothing Then
  12.                 i = 3                                         '第3欄 :C
  13.                 Do While IsNumeric(.Cells(4, i))              '執行迴圈的條件:第4列是數字
  14.                     If .Cells(5, i) = "六" Or .Cells(5, i) = "日" Then
  15.                         出勤 = ""                             '歸零
  16.                         If .Cells(Rng(2).Row, i) Like "*早*" Then
  17.                             出勤 = 早
  18.                         ElseIf .Cells(Rng(2).Row, i) Like "*晚*" Then
  19.                            
  20.                             出勤 = 晚
  21.                         ElseIf .Cells(Rng(2).Row, i) Like "*全日*" Then
  22.                             出勤 = 全日
  23.                         End If
  24.                         If 出勤 <> "" Then
  25.                             Sheets("假日出勤單").Range("B3") = Rng(1)                               '姓名
  26.                             Sheets("假日出勤單").Range("D3") = Rng(2).Offset(, -1)                  '社員編號
  27.                             Sheets("假日出勤單").Range("A5") = DateSerial(2013, 11, .Cells(4, i))   '日期
  28.                             Sheets("假日出勤單").Range("B5") = 出勤                                 '時間
  29.                             Sheets("假日出勤單").Range("D5") = IIf(.Cells(4, i) = "六", "(星期六)", "(星期日)") & "沙龍營業"
  30.                             Sheets("假日出勤單").PrintOut    '印列出勤單
  31.                         End If
  32.                     End If
  33.                     i = i + 1
  34.                 Loop
  35.             End If
  36.         End With
  37.         Set Rng(1) = Rng(1).Offset(1)    '下一位姓名
  38.     Loop
  39. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 16# prince0413
中英文對照表,請放在工作表好對照(注意個人資料),弄好後上傳檔案,我再看看.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 18# prince0413
  1. Const 早 = "10:00~18:00"
  2. Const 全日 = "10:30~18:30"
  3. Const 晚 = "11:00~19:00"
  4. Sub Ex()
  5.     Dim Rng(1 To 2) As Range, i As Integer, 出勤 As String, M As Variant
  6.     Sheets("假日出勤單").PageSetup.PrintArea = "A1:H13"      '一頁就夠了
  7.     Set Rng(1) = Sheets("假日出勤單").Range("J2")            '設定姓名
  8.     Do While Rng(1) <> ""                                    '執行迴圈的條件:姓名<>""
  9.         With Sheets("11月")
  10.             Set Rng(2) = .Range("B:B").Find(Rng(1), LOOKAT:=xlWhole)
  11.             M = Application.Match(Rng(1), Sheets("中英文姓名對照表").Range("A:A"), 0)  'Match : 工作表函數
  12.             If IsError(M) Then MsgBox "中英文姓名對照表 中沒有 : " & Rng(1): Exit Sub
  13.             If Not Rng(2) Is Nothing Then
  14.                 i = 3                                         '第3欄 :C
  15.                 Do While IsNumeric(.Cells(4, i))              '執行迴圈的條件:第4列是數字
  16.                     If .Cells(5, i) = "六" Or .Cells(5, i) = "日" Then
  17.                         出勤 = ""                             '歸零
  18.                         If .Cells(Rng(2).Row, i) Like "*早*" Then
  19.                             出勤 = 早
  20.                         ElseIf .Cells(Rng(2).Row, i) Like "*晚*" Then
  21.                             出勤 = 晚
  22.                         ElseIf .Cells(Rng(2).Row, i) Like "*全日*" Then
  23.                             出勤 = 全日
  24.                         End If
  25.                         If 出勤 <> "" Then
  26.                             Sheets("假日出勤單").Range("B3") = Sheets("中英文姓名對照表").Cells(M, "B")     '姓名: 對照出在B欄的 M列
  27.                             Sheets("假日出勤單").Range("D3") = Rng(2).Offset(, -1)                          '社員編號
  28.                             Sheets("假日出勤單").Range("A5") = DateSerial(2013, 11, .Cells(4, i))           '日期
  29.                             Sheets("假日出勤單").Range("B5") = 出勤                                         '時間
  30.                             Sheets("假日出勤單").Range("D5") = IIf(.Cells(4, i) = "六", "(星期六)", "(星期日)") & "沙龍營業"
  31.                             Sheets("假日出勤單").PrintOut                                                   '印列出勤單
  32.                         End If
  33.                     End If
  34.                     i = i + 1
  35.                 Loop
  36.             End If
  37.         End With
  38.         Set Rng(1) = Rng(1).Offset(1)    '下一位姓名
  39.     Loop
  40. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2013-11-20 12:23 編輯

回復 21# prince0413
  1. Const 早 = "10:00~18:00"
  2. Const 全日 = "10:30~18:30"
  3. Const 晚 = "11:00~19:00"
  4. Sub Ex()
  5.     Dim Rng(1 To 3) As Range, i As Integer, ii As Integer, 出勤 As String, 日期 As Range, Print_x As Integer
  6.     Dim 出勤單 As Range, E As Range
  7.     Set 出勤單 = Sheets("假日出勤單").Range("B3,D3,A5,B5,D5")   '第1張出勤單要導入資料的位置
  8.     For i = 0 To 3                                              '出勤單: 第1張到 第4張的位置 間格 14 列
  9.         出勤單.Offset(i * 14) = ""                              '清除 資料
  10.     '************    但第 2- 3張出勤單 間格 15 列 你需調整一下   *************************************
  11.     Next
  12.     Print_x = 0                                                 '印列 A4紙張 的變數
  13.     Set Rng(1) = Sheets("假日出勤單").Range("J2")               '設定社員 英文,中文,編號 (可以是 Abby,丁千芸,136)
  14.     Do While Rng(1) <> ""                                       '執行迴圈的條件: 社員<>""
  15.         With Sheets("11月")
  16.              Set Rng(3) = Nothing                               '物件: 釋放
  17.              Set Rng(2) = Sheets("中英文姓名對照表").Range("A:C").Find(Rng(1), LOOKAT:=xlWhole)
  18.                                                                  '英文,中文,編號:裡搜尋
  19.              If Not Rng(2) Is Nothing Then
  20.                 Set Rng(2) = Rng(2).Parent.Range("A" & Rng(2).Row)  '英文,中文,編號的第一欄 (英文)
  21.                 For i = 1 To 3                                      '如社員為中文 Sheets("11月")沒有 中文
  22.                     Set Rng(3) = Sheets("11月").Range("A:B").Find(Rng(2).Cells(i), LOOKAT:=xlWhole)
  23.                     If Not Rng(3) Is Nothing Then Exit For           '找到 英文 或 編號
  24.                 Next
  25.             End If
  26.             If Not Rng(3) Is Nothing Then
  27.                 i = 3                                         '第3欄 :C
  28.                 Do While IsNumeric(.Cells(4, i))              '執行迴圈的條件:第4列是數字
  29.                     If (.Cells(5, i) = "六" Or .Cells(5, i) = "日") And Trim(.Cells(Rng(3).Row, i)) <> "" Then
  30.                         出勤 = ""                             '歸零
  31.                         Set 日期 = .Cells(4, i)
  32.                         If .Cells(Rng(3).Row, i) Like "*早*" Then
  33.                             出勤 = 早
  34.                         ElseIf .Cells(Rng(3).Row, i) Like "*晚*" Then
  35.                             出勤 = 晚
  36.                         ElseIf .Cells(Rng(3).Row, i) Like "*全日*" Then
  37.                             出勤 = 全日
  38.                         End If
  39.                         If 出勤 <> "" Then                                  '預防沒有 [全日,早,晚]的班別
  40.                             Print_x = IIf(Print_x = 4, 1, Print_x + 1)
  41.                             With 出勤單.Offset((Print_x - 1) * 14)          '第 Print_x 的位置
  42.                                 .Range("A1") = Rng(2).Offset(, 1)           '社員中文
  43.                                 .Range("C1") = Rng(2).Offset(, 2)           '社員編號
  44.                                 .Cells(3, 0) = DateSerial(2013, 11, 日期)   '日期
  45.                                 .Range("A3") = 出勤                         '時間
  46.                                 .Range("C3") = IIf(日期.Offset(1) = "六", "(星期六)", "(星期日)") & "沙龍營業"
  47.                             End With
  48.                             If Print_x = 4 Then                             '滿4筆印列
  49.                                 出勤單.Parent.PrintOut                      '印列出勤單
  50.                                 For ii = 0 To 3
  51.                                    出勤單.Offset(ii * 14) = ""              '清空已印列資料
  52.                                 Next
  53.                             End If
  54.                         End If
  55.                     End If
  56.                     i = i + 1
  57.                 Loop
  58.             End If
  59.             Rng(1).Offset(, 1) = IIf(Rng(3) Is Nothing, "請檢查 : 假日出勤單 , 對照表 找不到 ", "")
  60.         End With
  61.         Set Rng(1) = Rng(1).Offset(1)    '下一位姓名
  62.     Loop
  63.     If Print_x > 0 And Print_x <= 3 Then 出勤單.Parent.PrintOut 1, Round(Print_x / 2) ' 未滿 4 筆的資料沒印列
  64. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 23# prince0413
出勤單: 第1張 到 第4張的位置 (都要)間格 14 列 ,但第 2- 3張出勤單 間格 15 列 你需調整一下
請看圖示



感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2013-11-21 17:30 編輯

回復 25# prince0413
當月只有上1天假日班的話(等於只需要印1張申請表),我執行程式後連後面的3份空白申請表也跟著一起列印出

沒這問題的,有設計 當有4筆立即印列
  1. If Print_x = 4 Then                             '滿4筆印列
  2.                                 出勤單.Parent.PrintOut                      '印列出勤單
  3.                                 For ii = 0 To 3
  4.                                    出勤單.Offset(ii * 14) = ""              '清空已印列資料
  5.                                 Next
  6.                             End If
複製代碼
最後:未滿4筆的印列 程式碼
  1. If Print_x > 0 And Print_x <= 3 Then 出勤單.Parent.PrintOut 1, Round(Print_x / 2) ' 未滿 4 筆的資料沒印列
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 28# prince0413
28# 月份更改,可如你所說試試看.
對的只有一筆時也會列印
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 30# prince0413
你的Excel不也是2003,沒有這問題的,上傳檔案看看.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 32# prince0413
這是2003的說明 , 請看看2013的說明有何不同再說
  1. Round 函數
  2. 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果。
  3. 單元 描述
  4. expression 必要引數。要進行四捨五入運算的數值運算式。
  5. numdecimalplaces 選擇性引數。數字值,表示進行四捨五入運算時,小數點右邊應保留的位元數。如果忽略,則 Round 函數傳回整數。
複製代碼
2003 中 Print_x As Integer 的範圍足夠了
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 34# prince0413
試試改成    If Print_x > 0 And Print_x <= 3 Then 出勤單.Parent.PrintOut 1, Round(Print_x / 2, 0)
你這圖示是: 工作表函數的說明,Application.WorksheetFunction.Round ,直接書寫 Round 是為VBA函數.

感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 布施如播種,以歡喜心滋潤種子,才會發芽。
返回列表 上一主題