Re: [算表] 如何用VBA抓儲存格的值而非公式結果

看板Office作者 (沒有人)時間11年前 (2015/03/08 12:22), 編輯推噓2(204)
留言6則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《nifa (沒有人)》之銘言: : 標題: [算表] 如何用VBA抓儲存格的值而非公式結果 : 時間: Thu Mar 5 17:54:19 2015 : : 軟體:Excel : : 版本:2010 : : 因為公司需求 : : 1. : 想把業務的出貨列表以當天為準 : 往後一星期的值抓出來列印 : : 2. : 之後會再把各業務的一星期內的表(一個業務一個檔案) : 整合到一個工作表內並排序 : : ========================= : : 目前是先做第一步的部分 : : 我是用VBA按鈕去寫 : 按下去後會用篩選的方式先列出一星期內的內容 : 然後再逐筆 copy 到另一個工作表 : 之後取消篩選,內容如下 : : Private Sub testsend_Click() : : Dim Sht As Worksheet : Dim rng As Range : Dim a As Integer : : With Sheets("排程表") '在Orders工作表中 : : Set rng = .UsedRange '所有資料範圍 : rng.AutoFilter Field:=2, Criteria1:=Array("15.02.09", _ : "15.02.10", _ : "15.02.11", _ : "15.02.12", _ : "15.02.13", _ : "15.02.14", _ : "15.02.15"), _ : Operator:=xlFilterValues '篩選出日期 : : Set Sht = Sheets("一週交期") : a = Sht.Range("a1048576").End(xlUp).Row '定位最後一列非空白列的值 : : For i = 2 To Sheets("排程表").Range("b1048576").End(xlUp).Row '依列數跑迴圈 : If Range("B" & i) <> "" Then : a = a + 1 '每次都重新定位最後一列空白列的值 : For j = 1 To Sheets("排程表").Range("a1").End(xlToRight).Column '依欄數跑迴圈 : Set rng = Sht.Cells(a, j) : rng = Sheets("排程表").Cells(i, j) '若不為寄送格則複製原內容 : Next : End If : Next : : AutoFilterMode = False : : End With : : End Sub : : 這部分寫來測試的是沒有問題,但是因為目前的 array 內用的是固定值 : 而我需求的是希望用 today(),today()+1,today()+2 這樣去做 : 目前我是用取巧的方式,另外開一個 sheet : a1 - a7 填上 today(),today()+1...這樣 : 然後用格式化條件變成 15.02.09 , 15.02.10 , 15.02.11 的格式 : : 但是當用 VBA 抓儲存格的值 : : sheets"日期參數用".cells(1,1) : : 來對照時 : 抓出來的值會是 2015/2/9 這樣而非 15.02.09 : : 可是我們公司日期輸入方式又偏偏是非制式的 yy.mm.dd : 而非 yy/mm/dd,這樣一來如果要拿抓出來的值當篩選條件 : 會是 2015/2/9 這樣,無法使用 : : 所以想請問是否有方法可以抓取儲存格"顯示出來的字" : 而非是抓取公式運算的值呢 ? : : 另外 2. 的部分 : 在網路上跟板內搜尋過 : 可是效果跟我想要的有些出入 : 想一併請教是否有可以參考的解決方法呢 ? : : : -- : : 上PTT純粹是慌亂生活中忙碌時間裡緊張壓力下微不足道的我們唯一偷偷能做到的 : 忙裡偷閒下的快樂時光用來放鬆慌亂生活中忙碌時間裡緊張壓力下微不足道的我 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.62.220.207 : ※ 文章網址: https://www.ptt.cc/bbs/Office/M.1425549263.A.E62.html : → soyoso: 用format()來轉換成yy.mm.dd的格式 03/05 18:20 : 推 EGsux: http://i.imgur.com/My1svyt.jpg
這種? 03/05 18:20 : → soyoso: 問題2.一個業務一個檔來看,步驟開檔workbook.open 03/05 18:27 : → soyoso: 將開啟檔案內特定工作表內的資料copy到另一個工作表內 03/05 18:28 : → soyoso: sheet().usedrange.copy,關檔workbook.close 03/05 18:29 : → soyoso: 排序range.sort 03/05 18:30 非常感謝 so 大跟 EG 大的幫忙 一次性解決了我的問題 XD 經過這幾天的努力,問題 1 總算是完美解決了 XD 這邊順便將我修改後程式 po 上 供以後若有同樣需求的板友參考 Private Sub testsend_Click() Sheets("一週交期").Range("a2:r500").Clear '先清空一週交期的內容 Dim day(6) As String Dim a As Integer 'for 日期用 Dim b As Integer 'chk 用 Dim c As Integer '第一個日期的列數 Dim d As Integer '定義篩選後有資料的最後一列位置 Dim e As Integer '目的工作表的最後一列空白列 Application.ScreenUpdating = False b = 0 For a = 0 To 6 '定義 e 為 7 天內的日期 Do day(a) = Format(Date + b, "yy.mm.dd") Set chk = Worksheets("排程表").Range("b:b").Find(day(a)) b = b + 1 Loop While chk Is Nothing '檢查日期是否為空值,若為空值則日期向後一天並重覆迴圈 If a = 0 Then '抓出第一個日期的列數 c = chk.Row End If Next With Sheets("排程表") Set rng = .UsedRange '自動篩選範圍為所有資料範圍 rng.AutoFilter Field:=2, Criteria1:=Array(day(0), _ day(1), _ day(2), _ day(3), _ day(4), _ day(5), _ day(6)), _ Operator:=xlFilterValues '篩選出日期 d = Sheets("排程表").Range("a1048576").End(xlUp).Row '定義篩選後有資料的最後一列位置 e = Sheets("一週交期").Range("a1048576").End(xlUp)(2).Row '目的工作表的最後一列空白列 Sheets("排程表").Range("A" & c & ":R" & d).Copy Sheets("一週交期").Range("A" & e) AutoFilterMode = False End With End Sub 除了將當天日期往後七天內的資料抓出來外 另外加上了若使用 find 找到的日期為工作表內未輸入的日期(例假日等) 將自行跳過,並由之後的日期遞補上,以免程式錯誤 簡單來說就是,抓出來的七天日期會是排除了假日後的有效日期 至於問題 2 嘛,正在測試中 XD -- 上PTT純粹是慌亂生活中忙碌時間裡緊張壓力下微不足道的我們唯一偷偷能做到的 忙裡偷閒下的快樂時光用來放鬆慌亂生活中忙碌時間裡緊張壓力下微不足道的我 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.132.72 ※ 文章網址: https://www.ptt.cc/bbs/Office/M.1425788577.A.5DD.html

03/09 13:24, , 1F
criteria 那邊不能換成 day()嘛?
03/09 13:24, 1F

03/09 13:25, , 2F
這樣以後要排更多日期也不用改
03/09 13:25, 2F

03/09 18:21, , 3F
因為之前試其他方式有問題,後來用 array 才 ok
03/09 18:21, 3F

03/09 18:22, , 4F
EG 大說的用 day() 以後不用修改的意思是 ? 篩選還不太熟
03/09 18:22, 4F

03/09 21:44, , 5F
應可用advancedfilter http://goo.gl/rQhMyk
03/09 21:44, 5F

03/10 03:33, , 6F
手邊沒電腦測試 可以寫成criteria1:=day() ?
03/10 03:33, 6F
文章代碼(AID): #1K-ywXNT (Office)
文章代碼(AID): #1K-ywXNT (Office)