Board logo

標題: [發問] 怎麼抓取A資料表假日上班的日期與時間到B資料表的儲存格中 [打印本頁]

作者: prince0413    時間: 2013-11-11 18:15     標題: 假日上班申請單(資料表怎麼判斷)

[attach]16668[/attach]

請問各位專業的大大:
我的目的是將11月班表假日(六、日)有出勤的日子,直接再假日出勤單上顯示
此附件為1人整月上班日子的範本,如果可以直接對照的話,那麼公司同仁的假日出勤單都可直接列印出,就不用各別檢查key in了

如附件有兩個資料表,資料表"假日出勤單"內,紅字部分我想直接對照資料表"11月"進行判斷,請問該如何寫呢?
因為我還是生手,知道要用if判斷式,但不知道該怎麼寫出來,請各位大大指導~

感恩
作者: luhpro    時間: 2013-11-11 21:31

回復 1# prince0413
你上傳的檔案少了副檔名,
我自行在後面加上 .zip 後才看到檔案.

你看看是否可以符合你的需求:
[attach]16671[/attach]
  1. Private Sub cbCrtTbl_Click()
  2.   Dim iDate%, iLoc%, iTbl%, iEnd%
  3.   Dim lRow&
  4.   Dim sStr$
  5.   Dim wsSou As Worksheet, wsTar As Worksheet
  6.   
  7.   Set wsSou = Sheets("11月")
  8.   Set wsTar = Sheets("假日出勤單")
  9.   wsTar.Activate
  10.   
  11.   lRow = 11
  12.   With wsSou
  13.     iTbl = 0
  14.     Do While .Cells(lRow, 4) <> ""
  15.       sStr = .Cells(lRow, 6)
  16.       iLoc = InStr(1, sStr, "/") + 1
  17.       Do While iLoc < Len(sStr)
  18.         iEnd = InStr(iLoc, sStr, ".")
  19.         If iEnd = 0 Then iEnd = Len(sStr) + 1
  20.         iDate = Mid(sStr, iLoc, iEnd - iLoc)
  21.         wsTar.Cells(5 + iTbl * 14, 1) = CDate("2013/11/" & iDate)
  22.         wsTar.Cells(5 + iTbl * 14, 2) = .Cells(lRow, 4)
  23.         If iTbl = 1 Then
  24.           wsTar.PrintPreview
  25.           iTbl = -1
  26.         End If
  27.         iLoc = iEnd + 1
  28.         iTbl = iTbl + 1
  29.       Loop
  30.       lRow = lRow + 1
  31.     Loop
  32.     If iTbl = 1 Then
  33.       wsTar.Cells(5 + iTbl * 14, 1) = ""
  34.       wsTar.Cells(5 + iTbl * 14, 2) = ""
  35.       wsTar.PrintPreview
  36.     End If
  37.     .Activate
  38.   End With
  39. End Sub
複製代碼

作者: prince0413    時間: 2013-11-12 20:16

回復 2# luhpro

大大不好意思

我有貼你的程式碼進去
執行後跑出的值都是錯誤日期呢

是否我有設定錯誤呢?
作者: luhpro    時間: 2013-11-12 22:32

回復 3# prince0413
如果你確定 Sheets("11月") 的
F11=11/9.23.30               
F12=11/3.10.17.24               
F13=11/2.9.23.30               
那應該就不會有錯,
不如你把檔案傳上來看看.

PS. 我的程式是依你提供的範例檔做出來的,
抓的是如下圖中 Mark 起來的6個儲存格中的資料,
請再確認一下:
[attach]16680[/attach]
作者: prince0413    時間: 2013-11-14 01:03

回復 4# luhpro


謝謝大大

我在研究看看好呢
感恩
作者: prince0413    時間: 2013-11-14 01:12

回復 4# luhpro


還是大大你有在假日出勤表上設定一個cbCrtTbl的按鈕?
我沒設  所以直接執行才會錯誤?!
作者: prince0413    時間: 2013-11-14 17:16

回復 4# luhpro

[attach]16695[/attach]
   
大大你好

這是我貼你的程式的版本

按按鈕執行時  出來的日期怪怪的   而且"出勤事由"那裡的星期X也沒有抓到資料呢~"~

是我哪裡設定錯誤嗎
作者: luhpro    時間: 2013-11-14 22:33

本帖最後由 luhpro 於 2013-11-14 22:35 編輯
回復  luhpro
大大你好
這是我貼你的程式的版本
按按鈕執行時  出來的日期怪怪的   而且"出勤事由"那裡的星期X也沒有抓到資料呢~"~
prince0413 發表於 2013-11-14 17:16

日期怪怪的? 應該不會的啊, 你看我的抓圖 :
[attach]16701[/attach] 第一頁
[attach]16702[/attach] 第二頁
[attach]16703[/attach] 第四頁
[attach]16704[/attach] 第六頁
至於 "出勤事由" 內沒資料這個問題,
上面的程式我本來就沒做這個部份.
因為不確定你的事由是否要由程式自動產生,
亦或是之後再由手寫補上.
既然你希望程式自動產生,
那就再調整一下囉.
  1. Sub cbCrtTbl_Click()
  2.   Dim iDate%, iLoc%, iTbl%, iEnd%
  3.   Dim lRow&
  4.   Dim sStr$
  5.   Dim wsSou As Worksheet, wsTar As Worksheet

  6.   Set wsSou = Sheets("11月")
  7.   Set wsTar = Sheets("假日出勤單")
  8.   wsTar.Activate
  9.   lRow = 11

  10.   With wsSou
  11.     iTbl = 0
  12.     Do While .Cells(lRow, 4) <> ""
  13.       sStr = .Cells(lRow, 6)
  14.       iLoc = InStr(1, sStr, "/") + 1
  15.       Do While iLoc < Len(sStr)
  16.         iEnd = InStr(iLoc, sStr, ".")
  17.         If iEnd = 0 Then iEnd = Len(sStr) + 1
  18.         iDate = Mid(sStr, iLoc, iEnd - iLoc)
  19.         wsTar.Cells(5 + iTbl * 14, 1) = CDate("2013/11/" & iDate)
  20.         wsTar.Cells(5 + iTbl * 14, 2) = .Cells(lRow, 4)
  21.         wsTar.Cells(5 + iTbl * 14, 4) = "(星期" & Choose(Weekday(CDate("2013/11/" & iDate), 2), _
  22.                             "一", "二", "三", "四", "五", "六", "日") & ")沙龍營業"
  23.         
  24.         If iTbl = 1 Then
  25.           wsTar.PrintPreview
  26.           iTbl = -1
  27.         End If

  28.         iLoc = iEnd + 1
  29.         iTbl = iTbl + 1
  30.       Loop
  31.       lRow = lRow + 1
  32.     Loop

  33.     If iTbl = 1 Then
  34.       wsTar.Cells(5 + iTbl * 14, 1) = ""
  35.       wsTar.Cells(5 + iTbl * 14, 2) = ""
  36.       wsTar.Cells(5 + iTbl * 14, 4) = ""
  37.       wsTar.PrintPreview
  38.     End If
  39.     .Activate
  40.   End With
  41. End Sub
複製代碼
[attach]16705[/attach]
作者: prince0413    時間: 2013-11-15 02:26

回復 8# luhpro


大大您好

假日SHOW"全日"    代表有上班     才需要寫假日出勤單

11/9  則是無出勤    所以不需要抓資料呢  

我貼大大您的程式執行出來的結果抓出來的資料都是無上班的日子呢     

補充: 全日也有分早、晚班時間,如果單單顯示全日則代表整天,都是靠下面的時間和日期表做判斷的哦

PS: 大大可否解釋一下程式的意義,因為我想要學,之後可能會有很多人的班表,我想做個下拉式選單,選出某某人,然後在像此方式印出他的出勤申請單

不好意思    我沒有讀很多程式的書     所以很麻煩您
作者: prince0413    時間: 2013-11-15 14:51

[attach]16711[/attach]回復 8# luhpro


大大您好

這是我有針對"11月"資料表稍為修改後的檔案(新增假日有分早晚班及全日班)

但是貼您的程式執行後出來的日期並不是該人假日上班的日期呢

請問我是哪裡有設定錯誤嗎?!
作者: luhpro    時間: 2013-11-15 22:50

本帖最後由 luhpro 於 2013-11-15 22:51 編輯
回復  luhpro
這是我有針對"11月"資料表稍為修改後的檔案(新增假日有分早晚班及全日班)
但是貼您的程式執行後出來的日期並不是該人假日上班的日期呢
請問我是哪裡有設定錯誤嗎?!prince0413 發表於 2013-11-15 14:51

請參閱上方 4# 內有說明 :
抓的是如該篇文內下方圖中 Mark 起來的6個儲存格中的資料(即 本月假日出勤時段 那個表格, 因為只有那個表有時間資料),
並沒有參考上方的表中的資料.

若你想要套用至多人,
建議你把 本月假日出勤時段 那個表格放到最上面,(若你不希望變更位置, 那我將會改採最後一列資料的相對位置來抓取此表格<會較容易出錯>)
然後 Princey 資料那一列的下方再新增至少一個人的資料,
這樣做出來的程式才容易符合你的需求,
請先依上述調整一下該 Sheet 內容後再上傳檔案,
不然之後程式做好了照樣還是要再改一次.

開題時若提出的範例能儘量符合實際需求,
這樣幫忙的人會比較快做出你要的東西,
如本串的例子,
只抓上表 或 只抓下表, 亦或是兩表都抓,
做出來的程式是可能會有很大的不同的喔.
作者: prince0413    時間: 2013-11-16 19:24

回復 11# luhpro


了解~我會將完整檔修正後po上來
再完整重新敘述需求的~

因為一開始我只show出我自己的班表想藉由大大的教學程式碼理解   
然後在把所有人的班表也加進來該月份裡     將所學的程式碼當範本套用在很多人身上
但這樣好像造成反效果     反而自己看不懂也麻煩到大大您一直修改來修改去了

我這幾天會把所有人的班表key in整理好     再傳上來~
到時候麻煩您教學了

真不好意思     一直麻煩您
作者: prince0413    時間: 2013-11-19 14:14

[attach]16775[/attach]回復 11# luhpro


大大您好:
這是我整理出完整的班表

目的:
在"假日出勤單"內 J2 儲存格下方輸入人名後,旁邊休日出勤單會自動抓取該人"11月"資料表全部的假日上班日期與時間
紅字部分內是要抓取的資料

請問這樣我該怎麼寫程式呢

請大大指導
作者: prince0413    時間: 2013-11-19 14:19     標題: 怎麼抓取A資料表假日上班的日期與時間到B資料表的儲存格中

[attach]16777[/attach]
大大們您好:

目的:
在"假日出勤單"內 J2 儲存格下方輸入人名後,旁邊休日出勤單會自動抓取該人"11月"資料表全部的假日上班日期與時間
紅字部分內是要抓取的資料

請問這樣我該怎麼寫程式呢

請大大們指導

感恩

(如檔案格式怪怪的請再副檔名後加入.ZIP)
作者: GBKEE    時間: 2013-11-19 15:57

回復 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
複製代碼

作者: prince0413    時間: 2013-11-19 16:45

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

[attach]16782[/attach]回復 15# GBKEE

大大您好

我剛貼您的程式進去"Ex"巨集裡
但在"假日出勤單"資料表J2儲存格輸入"英文姓名"後卻沒有反應呢

ps:我忽略姓名中英文對照了(假日出勤單是要轉換成中文姓名),已在下方補上,請大大再幫我看看是否我忽略了甚麼~


Abby  丁X芸
Masumi 吳X錚
Jessica 林X燕
Hitomi 林X婷
Jason 許X豪
Red 陳X呈
Lynn 戴X伶
Prince 許X強
Edge 蘇X祐
Joyce 侯X雯
Jack 黃X傑
作者: GBKEE    時間: 2013-11-19 17:10

回復 16# prince0413
中英文對照表,請放在工作表好對照(注意個人資料),弄好後上傳檔案,我再看看.
作者: prince0413    時間: 2013-11-19 18:36

[attach]16783[/attach]回復 17# GBKEE

大大您好

附件為加入中英姓名對照資料表,以及在"Ex"巨集貼入您的程式後的結果

請您再指教一下

感恩
作者: GBKEE    時間: 2013-11-19 19:45

回復 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
複製代碼

作者: prince0413    時間: 2013-11-19 20:13

回復 19# GBKEE

大大您好

我剛貼您的程式進去巨集後,再J2儲存格輸入英文姓名都沒有反應呢
怎麼會這樣呢?

-------------------------------------------------------------------------------
疑問1:
Sheets("假日出勤單").PageSetup.PrintArea = "A1:H13"      '一頁就夠了

上面程式碼請問大大這甚麼意思呢,照道理說一個人一個月至少會有很多天假日出勤單,代表不只會有一份而以,但大大為什麼範圍只抓"A1:H13"一張而已呢?

不好意思,一直請教您問題~
麻煩了
作者: prince0413    時間: 2013-11-19 20:35

[attach]16784[/attach]回復 19# GBKEE

大大您好

剛誤會您了,我先KEYIN姓名後進去程式碼裡按執行發現有列印出來!
真是太厲害了

疑問:
1.一開始我設這麼多空白的申請表是因為想要一張紙印兩份剛剛好,有這種方式是可以一張A4印兩張申請表的嗎(想節省紙資源)

2.中英文姓名對照表後方我新增了社員編號(如圖),如果社員編號我想跟姓名一樣在假日出勤申請單裡對照過去的話,那我要從哪裡修改程式碼呢?

感恩
作者: GBKEE    時間: 2013-11-20 11:06

本帖最後由 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
複製代碼
[attach]16791[/attach]
作者: prince0413    時間: 2013-11-20 17:28

[attach]16802[/attach]回復 22# GBKEE

大大您好:
我有按照您說的複製程式碼貼入巨集,也有照您說的第2張~第3張出勤單間隔15列(如附件檔),但您說的第一張~第四張間隔14列是甚麼意思呢?
執行後也是只有單張列印一份出來而以呢,是我沒有設定到什麼嗎?還是印表機設定也需要改呢?

麻煩請您再幫我看看
感恩
謝謝

ps:會員編號確實有跟著對應出來了,這次的註解也更易懂,我會努力學習的,一直麻煩您真不好意思
作者: GBKEE    時間: 2013-11-20 20:48

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

[attach]16810[/attach]

[attach]16809[/attach]
作者: prince0413    時間: 2013-11-20 21:44

回復 24# GBKEE

大大您好:
了解您的意思了!
經測試後成功了~
非常感謝您!

但剛測試有一個問題,如果遇到該人當月只有上1天假日班的話(等於只需要印1張申請表),我執行程式後連後面的3份空白申請表也跟著一起列印出來了呢
請問大大這有方法可以避免嗎?(上幾天班就印幾張申請表)

請大大指導
作者: GBKEE    時間: 2013-11-21 06:36

本帖最後由 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 筆的資料沒印列
複製代碼

作者: prince0413    時間: 2013-11-21 16:40

[attach]16819[/attach]回復 26# GBKEE


大大您好:
會不會是我因為怕J欄的東西也跟著一起列印,所以設定列印範圍,導致這種錯誤呢?(如上圖)
我把列印格式清除後就無此問題了 , 謝謝大大的指教!

那麼之後的12月班表內如果出勤時間有變動我只需要修改程式碼的下列時間和資料表名稱就好了嗎?(如下圖紅色框框部分)   

[attach]16820[/attach]
作者: prince0413    時間: 2013-11-21 17:14

回復 26# GBKEE


大大您好:
剛再測試時有發生一件小問題,就是如果該人當月只有上一天班時,系統會顯是錯誤訊息偵錯
然後把下列這段程式反黃呢~

If Print_x > 0 And Print_x <= 3 Then 出勤單.Parent.PrintOut 1, Round(Print_x / 2)      ' 未滿 4 筆的資料沒印列


這段程式的意思是如果上班日子筆數>0和<=3筆時,就列印的意思嗎?
那這樣的話只有一筆時應該也會列印才對呢

請大大指導
作者: GBKEE    時間: 2013-11-21 17:20

回復 28# prince0413
28# 月份更改,可如你所說試試看.
對的只有一筆時也會列印
作者: prince0413    時間: 2013-11-21 17:40

本帖最後由 prince0413 於 2013-11-21 17:42 編輯

回復 29# GBKEE

因為只有一筆時後面的程式就反黃錯誤呢(下面這段程式),也沒有列印~

" 出勤單.Parent.PrintOut 1, Round(Print_x / 2) "

我再想是不是因為 Print_x=1   ,  1 / 2 = 0.5  ,有小數點所以發生此錯誤

那是不是要把 Print_x 這變數換個宣告呢?   Print_x  As  Integer    改成可以有小數點的浮點數?
但我不太懂怎麼改呢

請大大指導~"~
作者: GBKEE    時間: 2013-11-21 17:52

回復 30# prince0413
你的Excel不也是2003,沒有這問題的,上傳檔案看看.
作者: prince0413    時間: 2013-11-21 20:33

[attach]16824[/attach]回復 31# GBKEE

大大您好:
公司的電腦是2013的OFFICE
家裡的電腦是2003的OFFICE

但我幾乎都是再公司做的,存成2003的檔案是因為想說在家可能會開起來看看

所以大大的意思是不需要更改浮點數嗎?
作者: GBKEE    時間: 2013-11-21 20:53

回復 32# prince0413
這是2003的說明 , 請看看2013的說明有何不同再說
  1. Round 函數
  2. 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果。
  3. 單元 描述
  4. expression 必要引數。要進行四捨五入運算的數值運算式。
  5. numdecimalplaces 選擇性引數。數字值,表示進行四捨五入運算時,小數點右邊應保留的位元數。如果忽略,則 Round 函數傳回整數。
複製代碼
2003 中 Print_x As Integer 的範圍足夠了
作者: prince0413    時間: 2013-11-21 21:08

[attach]16825[/attach]回復 33# GBKEE

大大您好:

這是ROUND再2013的說明

我沒有您這麼專業,看不出哪裡不同之處呢

請大大指教
作者: GBKEE    時間: 2013-11-22 06:58

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

[attach]16830[/attach]
作者: prince0413    時間: 2013-11-22 19:43

[attach]16838[/attach]回復 35# GBKEE

大大您好
我昨日有自己嘗試再後面的值改成 0 或 -1,結果都是一樣會有錯誤呢(如上圖)

Then 出勤單.Parent.PrintOut 1, Round(Print_x / 2 , 0)
Then 出勤單.Parent.PrintOut 1, Round(Print_x / 2 , -1)

不懂為甚麼會這樣呢,因為我看說明應該是會把算出來的0.5這值四捨五入變成1就可以符合列印標準才對
怎麼會有錯誤呢
請大大指教 ~"~
作者: GBKEE    時間: 2013-11-22 19:56

回復 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)
複製代碼

作者: prince0413    時間: 2013-11-22 20:01

  1.                         If 出勤 <> "" Then                                  '預防沒有 [全日,早,晚]的班別

  2.                             Print_x = IIf(Print_x = 4, 1, Print_x + 1)

  3.                             With 出勤單.Offset((Print_x - 1) * 14)          '第 Print_x 的位置

  4.                                 .Range("A1") = Rng(2).Offset(, 1)           '社員中文

  5.                                 .Range("C1") = Rng(2).Offset(, 2)           '社員編號

  6.                                 .Cells(3, 0) = DateSerial(2013, 11, 日期)   '日期

  7.                                 .Range("A3") = 出勤                         '時間

  8.                                 .Range("C3") = IIf(日期.Offset(1) = "六", "(星期六)", "(星期日)") & "沙龍營業"

  9.                             End With

  10.                            

  11.                         End If

  12.                     End If

  13.                     i = i + 1

  14.                 Loop

  15.             End If

  16.             Rng(1).Offset(, 1) = IIf(Rng(3) Is Nothing, "請檢查 : 假日出勤單 , 對照表 找不到 ", "")

  17.         End With

  18.         Set Rng(1) = Rng(1).Offset(1)    '下一位姓名

  19.     Loop

  20.    

  21. End Sub
複製代碼
回復 36# prince0413

大大您好:
謝謝您不厭其煩的幫我抓錯誤
我決定把後半段程式碼直接印出的方式改成用手動列印(如上方程式碼,只有把printout的指令拿掉)
執行巨集後在左方出勤單顯示出值,然後自行手動印出
請大大幫我看看是否有哪裡還沒有改到的
目前我執行值都有對應到

因為ROUND函數我怎麼努力看就是看不懂他錯誤是什麼意思~"~


請大大指教
作者: prince0413    時間: 2013-11-22 20:19

回復 37# GBKEE

大大您好:
照您的設定也是跟剛剛一樣的錯誤呢 ...

想不透明明已經將Print_x宣告改成Long , 下方Print_x / 2 , 0 也取整數了,怎麼還會出現錯誤呢~"~
作者: GBKEE    時間: 2013-11-22 20:42

回復 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
複製代碼

作者: prince0413    時間: 2013-11-22 21:21

回復 40# GBKEE

大大您好

一點都不會浪費我的時間,您客氣了,我還要感謝您讓我了解這麼多呢!
不然沒有概念的我一定不知道怎麼看錯誤..
太棒了  ~  程式已經OK了!! ^^
真的非常謝謝您
----------------------------------------------------------------------------------------------
[attach]16839[/attach]
下次我也想用這個觀念做一份平日休假的表單(如附件)
但判斷的方法實在太複雜了,不知道能不能夠弄得出來

能否請大大指點一下(如果真的很複雜的話就不用麻煩大大了沒關係^^")
作者: GBKEE    時間: 2013-11-23 06:04

回復 41# prince0413
可以解釋一下: 1019出1026出,1019代休,下半晚1012出.
下半晚 的時間 ?
11/02(六)沙龍營業,休剩餘的0.5天:要參考何處.
作者: prince0413    時間: 2013-11-25 01:26

回復 42# GBKEE

大大您好:
基本上只要把"11月"資料表中有休假的該儲存格對照到平日休假單裡即可,時間"上、下午"打算自行印出再用筆圈選,

注: 只要假日有上班,就有假可以排平日休,所以平日休假單是要表示該人用哪天的假日上班來休假的意思

1019出1026出 = 代表使用10/19半天+10/26半天加起來休一天
1019代休 = 代表使用10/19整天來休假
1012出.下半晚 = 簡單來說就是請半天假的意思。代表使用10/12半天來休假,下午則是繼續上晚班。(只要SHOW出10/12請假日期即可)
年 = 代表該人使用年假休假
下半年.上半早(晚) = 代表該人休半天假,下午用年假半天休假,有半天時段照常上班(早or晚)
上半年.下半早(晚) = 代表該人休半天假,上午用年假半天休假,有半天時段照常上班(早or晚)

早班時間:9:30~6:30   
晚班時間:2:30~10:30

我明日會用圖解把各種狀況對應休假單表示出來給大大您了解

基本上單純只用一天假日上班換一天平日休假比較好理解(相當於直接對照儲存格過來而已),但只要牽扯到上半天班的或有使用半天的假就比較難理解~"~
作者: prince0413    時間: 2013-11-25 04:24

[attach]16849[/attach]回復 42# GBKEE

大大您好:
我把各種狀況用圖檔呈現給您了解
光解釋我就覺得很複雜了
不知道大大能不能理解

[attach]16850[/attach]

[attach]16851[/attach]

[attach]16852[/attach]

[attach]16853[/attach]

[attach]16854[/attach]

這次只需要能夠對照SHOW在資料表即可,不需要自動printout,改成自行手動列印。
附件裡我重新設計了10份請假單,因為可能該人一個月可能會休好幾天。
手動列印只要有幾份就選擇範圍列印幾頁。

姓名、社員編號、請假日期、天數、備考  → 只有這些格子需要用程式對照運算,"請假別"此欄位不須理會。

如果條件太複雜無法做也沒關係
作者: prince0413    時間: 2013-11-29 20:44

回復 42# GBKEE

大大您好:

真的非常不好意思又來麻煩您,因為目前出現小小的問題

關於假日出勤單的部分

12月份的班表發現假日出勤時間每個日期早晚班及全日出勤時間都不同(如圖一),因此我不知道該怎麼修改程式上方的時間(如圖二),想請問大大該怎麼修改呢?   

如果都照樣KEYIN進去的話,發現"全日"和"全日(早)"都會重複名稱有錯誤~"~

請大大幫我看看

感恩  麻煩您了~
作者: GBKEE    時間: 2013-11-30 11:15

回復 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
複製代碼

作者: prince0413    時間: 2013-12-1 13:10

回復 46# GBKEE
[attach]16911[/attach]

大大您好:

我有照您的程式碼貼上,但執行巨集後卻都沒有反應呢~(如附件)

請問我是哪裡設定錯誤嗎?

-------------------------------------------------------------------------

這次似乎程式碼變化許多,是抓資料的方式改變了嗎??   

那麼之後每月更新時我需要變更哪裡呢? 這次的比較難   看不太懂   請大大指導~"~
作者: prince0413    時間: 2013-12-1 13:58

回復 46# GBKEE

[attach]16912[/attach]

大大您好 :

剛查詢程式,Option Explicit  的意思是在此程式裡所有定義都要明確宣告

可是下方出勤班別感覺不像有宣告的方式,是這個問題導致程式沒有反應嗎?

還是其實可以用這樣的寫法表達

不好意思    我不太了解    想說幫大大看一下
作者: GBKEE    時間: 2013-12-1 15:53

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

回復 48# prince0413

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



[attach]16915[/attach]

你的附檔 根據上面修改  出勤班別 = 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] 的班別才會進行下一行的程式碼


[attach]16914[/attach]
作者: prince0413    時間: 2013-12-1 16:55

回復 49# GBKEE

大大您好:

照您的修改在Z18~AD18新增0~4數值,程式已有啟動。
但測試該人"Edge"時,21號沒有跑出來,只有22.28這兩個日期有印出而已呢
請問這該怎麼辦呢   是我設定錯誤嗎~"~?
作者: GBKEE    時間: 2013-12-2 15:18

回復 50# prince0413
班別

全日
全日2
早2

49# 第2個圖示有指出:

21  全日 (早) 在 班別沒有找到. 22 全日,28  全日  班別有找到
所以 21  全日 (早) 是沒有印列出來
作者: prince0413    時間: 2013-12-2 18:56

回復 51# GBKEE


  大大您好:

測試中該人"Hitomi"該月也沒有跑出任何一筆資料呢~"~
這是什麼問題呢?


了解   所以只要是21日的早班都無法抓到資料嚕?
作者: prince0413    時間: 2013-12-3 14:59

回復 51# GBKEE

大大您好:

剛測試該人"Prince" 12/1 時間印出有錯誤,應該事是10:30~18:30,但卻印出時間為10:00~18:00

請大大指導~"~?

是不是遇到這種重複班別狀況比較難分辨呢?
如果像最初11月那種時段都單一的話,大大最初寫的程式我測試都很ok
但12月遇到這種全日有兩個時段,早班有兩個時段的問題就變得比較複雜了

請問大大我該如何改善您比較方便寫程式呢?
作者: GBKEE    時間: 2013-12-3 15:16

回復 53# prince0413
請上傳附檔 指明有哪些錯誤
作者: prince0413    時間: 2013-12-3 16:17

回復 54# GBKEE

[attach]16941[/attach]
大大您好:
相關BUG如下

12/21"全日(早)"班別  抓不到資料外,其餘"全日"班別 一切正常

"Prince"    12/1 時間印出有錯誤,應該是10:30~18:30,但卻印出時間為10:00~18:00
"Red"        12/7時間印出有錯誤,應該是11:00~19:00,但卻印出時間為10:00~18:00
"Lyn"         12/7時間印出有錯誤,應該是11:00~19:00,但卻印出時間為10:00~18:00
"Hitomi"   該月也沒有跑出任何一筆資料
"Jessica"   該月也沒有跑出任何一筆資料

如果我將假日出勤時段另外分離至一個資料表,這樣大大會不會比較好寫程式,也方便日後月份更換時更改時段呢?(如下圖)   

[attach]16942[/attach]
作者: GBKEE    時間: 2013-12-3 18:30

回復 55# prince0413

    試試看


[attach]16943[/attach]
作者: prince0413    時間: 2013-12-3 18:44

回復 56# GBKEE

大大不好意思

可以幫我解壓縮存成ZIP的格式嗎

公司沒有解壓縮軟體~"~

麻煩您了
作者: prince0413    時間: 2013-12-3 21:16

回復 56# GBKEE

大大您好:

剛測試過,以上挑出的BUG都解決了,只剩下最後那兩個問題還是一樣,HITOMI和JESSICA都沒有顯示任何一筆資料呢
依大大的註解,我看出勤時段和日期都有對應到(如下圖),怎麼會找不到呢? 非常不理解~"~

[attach]16951[/attach]
作者: prince0413    時間: 2013-12-3 21:47

回復 56# GBKEE

[attach]16953[/attach]

大大您好:

剛剛無意間更改時段下方的名稱資料,就出現奇蹟都正常了(如上圖)

請問這是因為字串不符對應不到嗎?

所以字串都要一樣才能對應的到日期時段嚕?
作者: GBKEE    時間: 2013-12-4 13:38

回復 59# prince0413

所以字串都要一樣才能對應的到日期時段嚕?
你怎麼現在才看懂!!
作者: prince0413    時間: 2013-12-4 13:58

回復 60# GBKEE
大大不好意思
因為不太會看程式碼
所以因為一直看不太懂大大是用哪個方式怎麼抓取資料的

感謝大大的幫忙

之後換月份如果有遇到什麼問題再請您教導

真的很謝謝您~




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