iT邦幫忙

1

Excel巨集疑難

之前曾用過巨集內的錄製來設定一些簡單的操作,但因匱乏專業知識且需求並不急迫而無積極學習,至於目前遇到的問題在於,公司有一套系統篩出數據,而匯出的數據已Excel打開時僅排列在A欄,有一萬筆資料就會依序排至A1...A10000,以往篩出的資料只有2、300筆,愚鈍的我利用錄製巨集的方式能夠將幾百筆的數據剪下貼上在同一頁''影印''的範圍,減少作業及呈報的時間,但目前為加強效率一次輸出一萬筆數據,若為了錄製此動作而進行錄製,想必會花費一整天的時間,敢問版上在此專業領域的前輩能否替我解答,若能給予大致上的範本更感激不盡。Ps.以往一頁影印範圍為225筆,45筆為一欄共五欄。就是說能將A1...A10000的資料排序成A1~A45,B1~B45,C1~C45,D1~D45,E1~E45後再接下A46~90,B46~B90以此類推的排序方式嗎?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
蟹老闆
iT邦大師 1 級 ‧ 2017-03-25 01:17:16
最佳解答

檔案裡需要一個叫STOR的工作表,巨集啟動時請確保資料頁是啟動中的狀態,然後執行以下巨集

Sub Stor()
For ONE = 1 To Range("A1048576").End(xlUp).Row Step 225
    For I = 1 To 5
        ActiveSheet.Range(Cells(ONE + ((I - 1) * 45), 1), Cells((ONE + ((I - 1) * 45)) + 44, 1)).Copy
        Sheets("Stor").Cells((NUL * 45) + 1, I).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Next I
    NUL = NUL + 1
Next ONE
End Sub

重點說明:
第二行:執行迴圈從1到a欄的最後一個row,且每一迴圈是以累加225的方式進行
第三行:執行迴圈1到5
第四行:透過計算one上層迴圈及i 目前迴圈進行 + - * / 計算出應copy的資料欄位
第五行:透過計算nul變數及i目前迴圈數進行 + - * / 計算出應貼上的欄位,這裡要注意的是第一次計算時nul是空值,也就是說0 * 45 還是 0 ,加上1後第一次貼上的位置是A1
第七行:NUL在這裡才開始給予值,延遲賦值的原因是避免第一次貼上發生錯誤.

1
海綿寶寶
iT邦大神 1 級 ‧ 2017-03-25 08:34:06

這題我比較懶
我是用公式做
假設資料在「工作表1」
那麼在「工作表2」設定一個公式
從欄A到欄E,列要設多少列隨便
不管是A多少到E多少
都是設同一個公式如下

=OFFSET(工作表1!$A$1,QUOTIENT(ROW()-1,45)*225+MOD(ROW()-1,45)+1+(COLUMN()-1)*45-1,0)

另外
如果要改每頁的欄數或列數
只要改
其中那個45是 每頁「每欄的列數」
225則是 每頁「總筆數」(=45*5)

0
eigen
iT邦新手 1 級 ‧ 2017-03-25 21:58:59

只要公式即可,不用巨集

利用 row() column() 練習,就能將原本的資料(行數),計算出來
=INT((ROW()-1)/45)X45X5 + MOD(ROW()-1,45)+1+COLUMN()45-45
將這貼到 45
5 的空間,往下複制,就看的出

1 46 91 136 181
2 47 92 137 182
3 48 93 138 183

43 88 133 178 223
44 89 134 179 224
45 90 135 180 225
226 271 316 361 406
227 272 317 362 407
228 273 318 363 408
229 274 319 364 409

之後只要會用 indirect 指令

=INDIRECT("Sheet1!A"&A1)
就能從 sheet1 抓 a1 a2 a3 的資料

我要發表回答

立即登入回答