返回列表 上一主題 發帖

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

回復 36# prince0413


Long 資料型態Long (長整數)變數係以範圍從 -2,147,483,648 到 2,147,483,647 之 32 位元 (4 個位元組) 有號數字形式儲存。Long 的型態宣告字元為 &。

你圖示錯誤指出數須是長整數的範圍
那改如下試試
  1. Dim Print_x As Long
  2. '
  3. '
  4. Parent.PrintOut 1, Round(Print_x / 2, 0)
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 38# prince0413
  要改用 工作表函數 :抱歉浪費你的時間(我檔案的Print_x=2,所以一直沒找出錯誤..)
  1.   
  2.    MsgBox Round(0.5, 0)                    ' VBA 函數: 0
  3.    MsgBox Round(0.501, 0)                    ' VBA 函數: 1
  4.    MsgBox Application.WorksheetFunction.Round(1 / 2, 0)   '工作表函數 這才正確
  5.   '************************* 工作表函數 這才正確 *********************
  6.     If Print_x > 0 And Print_x <= 3 Then 出勤單.Parent.PrintOut 1, Application.Round(Print_x / 2, 0)
  7. '**********************************************************************************
  8. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 41# prince0413
可以解釋一下: 1019出1026出,1019代休,下半晚1012出.
下半晚 的時間 ?
11/02(六)沙龍營業,休剩餘的0.5天:要參考何處.
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 45# prince0413

依11月的檔案.的程式碼
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng(1 To 4) As Range, i As Integer, ii As Integer, 出勤 As String, 日期 As Variant, Print_x As Integer
  4.     Dim 出勤單 As Range, E As Range, Sh As Worksheet, 出勤班別()
  5.     Set 出勤單 = Sheets("假日出勤單").Range("B3,D3,A5,B5,D5")   '第1張出勤單要導入資料的位置
  6.     Set Rng(1) = Sheets("假日出勤單").Range("J2")               '設定社員 英文,中文,編號
  7.     For i = 0 To 3                                              '出勤單: 第1張到 第4張的位置 間格 14 列
  8.         出勤單.Offset(i * 14) = ""                              '清除 資料
  9.     Next
  10.     Print_x = 0                                                 '印列 A4紙張 的變數
  11.     Set Sh = Sheets("11月")                                     '***在指定月份****
  12.     Set Rng(4) = Sh.Cells.Find("※本月假日出勤時段", lookat:=xlWhole)
  13.     Set Rng(4) = Sh.Range(Rng(4).Offset(2), Rng(4).Offset(2).End(xlDown))  '出勤時間
  14.     出勤班別 = Application.WorksheetFunction.Transpose(Rng(4).Offset(, 5).Value)  '早.晚...

  15.     Do While Rng(1) <> ""                                       '執行迴圈的條件: 社員<>""
  16.     '※※※※※※※※※※※※※※每月需修改※※※※※※※※※※※※※※※
  17.         With Sh
  18.     '※※※※※※※※※※※※※※每月需修改※※※※※※※※※※※※※※※
  19.              Set Rng(3) = Nothing                               '物件: 釋放
  20.              Set Rng(2) = Sheets("中英文姓名對照表").Range("A:C").Find(Rng(1), lookat:=xlWhole)
  21.                                                                  '英文,中文,編號:裡搜尋
  22.              If Not Rng(2) Is Nothing Then
  23.                 Set Rng(2) = Rng(2).Parent.Range("A" & Rng(2).Row)  '英文,中文,編號的第一欄 (英文)
  24.                 For i = 1 To 3                                      '如社員為中文 Sheets("11月")沒有 中文
  25.                     Set Rng(3) = Sh.Range("A:B").Find(Rng(2).Cells(i), lookat:=xlWhole)
  26.                     If Not Rng(3) Is Nothing Then Exit For           '找到 英文 或 編號
  27.                 Next
  28.             End If
  29.             If Not Rng(3) Is Nothing Then
  30.                 i = 3                                         '第3欄 :C
  31.                 Do While IsNumeric(.Cells(4, i))              '執行迴圈的條件:第4列是數字
  32.                     If (.Cells(5, i) = "六" Or .Cells(5, i) = "日") And Not IsError(Application.Match(.Cells(Rng(3).Row, i), 出勤班別, 0)) Then
  33.                         'Not IsError(Application.Match(.Cells(Rng(3).Row, i), 出勤班別, 0)) -> '假日班別是在[出勤班別]中
  34.                         出勤 = ""                             '歸零
  35.                         For Each E In Rng(4)                  '本月假日出勤時段
  36.                             日期 = Split(E.Offset(, 1), "/")(1) '刪掉月份
  37.                             日期 = Split(日期, ".")             '取得日期
  38.                             If Not IsError(Application.Match(.Cells(4, i), 日期, 0)) Then  '尋找日期
  39.                                 出勤 = E
  40.                                 Exit For
  41.                             End If
  42.                         Next
  43.                         If 出勤 <> "" Then                                  '預防沒有 [全日,早,晚]的班別
  44.                             Set 日期 = .Cells(4, i)
  45.                             Print_x = IIf(Print_x = 4, 1, Print_x + 1)
  46.                             With 出勤單.Offset((Print_x - 1) * 14)          '第 Print_x 的位置
  47.                                 .Range("A1") = Rng(2).Offset(, 1)           '社員中文
  48.                                 .Range("C1") = Rng(2).Offset(, 2)           '社員編號
  49.                                 .Cells(3, 0) = DateSerial(2013, 11, 日期)   '日期
  50.                                 .Range("A3") = 出勤                         '時間
  51.                                 .Range("C3") = IIf(日期.Offset(1) = "六", "(星期六)", "(星期日)") & "沙龍營業"
  52.                             End With
  53.                             If Print_x = 4 Then                             '滿4筆印列
  54.                                 出勤單.Parent.PrintOut                      '印列出勤單
  55.                                 For ii = 0 To 3
  56.                                    出勤單.Offset(ii * 14) = ""              '清空已印列資料
  57.                                 Next
  58.                             End If
  59.                         End If
  60.                     End If
  61.                     i = i + 1
  62.                 Loop
  63.             End If
  64.             Rng(1).Offset(, 1) = IIf(Rng(3) Is Nothing, "請檢查 : 假日出勤單 , 對照表 找不到 ", "")
  65.         End With
  66.         Set Rng(1) = Rng(1).Offset(1)    '下一位姓名
  67.     Loop
  68.     If Print_x > 0 And Print_x <= 3 Then 出勤單.Parent.PrintOut 1, Application.Round(Print_x / 2, 0) ' 未滿 4 筆的資料沒印列
  69. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2013-12-1 16:02 編輯

回復 48# prince0413

Dim  Sh As Worksheet, 出勤班別()
宣告     Sh      型態 Worksheet物件
宣告 出勤班別() 型態 動態陣列





你的附檔 根據上面修改  出勤班別 = Application.WorksheetFunction.Transpose(Rng(4).Offset(, 4).Value)
  1. Set Sh = Sheets("11月") '***在指定月份****
  2. Set Rng(4) = Sh.Cells.Find("※本月假日出勤時段", lookat:=xlWhole)       '※本月假日出勤時段  
  3. Set Rng(4) = Sh.Range(Rng(4).Offset(2), Rng(4).Offset(2).End(xlDown)) '出勤日期
  4. 出勤班別 = Application.WorksheetFunction.Transpose(Rng(4).Offset(, 4).Value) ' 班別
複製代碼
  1. If (.Cells(5, i) = "六" Or .Cells(5, i) = "日") And Not IsError(Application.Match(.Cells(Rng(3).Row, i), 出勤班別, 0)) Then
  2. 出勤 = "" '歸零
  3. For Each E In Rng(4) '本月假日出勤時段
  4. 日期 = Split(E.Offset(, 1), "/")(1) '刪掉月份
  5. 日期 = Split(日期, ".") '取得日期
  6. If Not IsError(Application.Match(.Cells(4, i), 日期, 0)) Then '尋找日期
  7. 出勤 = E
  8. Exit For
  9. End If
  10. Next
複製代碼
.Cells(Rng(3).Row, i) 班別 的字串 是   [早, 全日,全日2,早2] 的班別才會進行下一行的程式碼


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

TOP

回復 50# prince0413
班別
早
全日
全日2
早2

49# 第2個圖示有指出:

21  全日 (早) 在 班別沒有找到. 22 全日,28  全日  班別有找到
所以 21  全日 (早) 是沒有印列出來
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 53# prince0413
請上傳附檔 指明有哪些錯誤
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 55# prince0413

    試試看


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

TOP

回復 59# prince0413

所以字串都要一樣才能對應的到日期時段嚕?
你怎麼現在才看懂!!
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 能付出愛心就是福,能消除煩惱就是慧。
返回列表 上一主題