返回列表 上一主題 發帖

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

回復 40# GBKEE

大大您好

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

能否請大大指點一下(如果真的很複雜的話就不用麻煩大大了沒關係^^")
不會EXCALL的笨蛋

TOP

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

TOP

回復 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

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

基本上單純只用一天假日上班換一天平日休假比較好理解(相當於直接對照儲存格過來而已),但只要牽扯到上半天班的或有使用半天的假就比較難理解~"~
不會EXCALL的笨蛋

TOP

Ex2.rar (50.88 KB) 回復 42# GBKEE

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











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

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

如果條件太複雜無法做也沒關係
不會EXCALL的笨蛋

TOP

回復 42# GBKEE

大大您好:

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

關於假日出勤單的部分

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

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

請大大幫我看看

感恩  麻煩您了~

假日出勤.jpg (15.32 KB)

假日出勤.jpg

出勤時間.jpg (52.76 KB)

出勤時間.jpg

假日出勤.jpg (15.32 KB)

假日出勤.jpg

出勤時間.jpg (52.76 KB)

出勤時間.jpg

不會EXCALL的笨蛋

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

回復 46# GBKEE
休日出勤單12.zip (54.09 KB)

大大您好:

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

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

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

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

那麼之後每月更新時我需要變更哪裡呢? 這次的比較難   看不太懂   請大大指導~"~
不會EXCALL的笨蛋

TOP

回復 46# GBKEE



大大您好 :

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

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

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

不好意思    我不太了解    想說幫大大看一下
不會EXCALL的笨蛋

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

回復 49# GBKEE

大大您好:

照您的修改在Z18~AD18新增0~4數值,程式已有啟動。
但測試該人"Edge"時,21號沒有跑出來,只有22.28這兩個日期有印出而已呢
請問這該怎麼辦呢   是我設定錯誤嗎~"~?
不會EXCALL的笨蛋

TOP

        靜思自在 : 不要小看自己,因為人有無限的可能。
返回列表 上一主題