Board logo

標題: [發問] EXCEL VBA 的問題 [打印本頁]

作者: idnoidno    時間: 2015-4-12 15:44     標題: EXCEL VBA 的問題

請問附表的檔案中,如何在工作表1中表格,使用VBA找出甲、乙、丙的最後一列數值和日期寫到工作表2中,請叫有路過的大哥可以指導一下,謝謝

另再請教,假如甲乙丙丁(欄位)有很多個,那VBA的語法又該如何調整呢
作者: lpk187    時間: 2015-4-12 23:51

回復 1# idnoidno
  1. Sub 巨集1()
  2. n = 1
  3. For Each Rng In 工作表1.Range("B1", 工作表1.Cells(1, Columns.Count).End(xlToLeft).Address) '第一列"動態"讀取做循環
  4.     RngRow = 工作表1.Columns(Rng.Column).Find("*", , , , , xlPrevious).Row '尋找改欄的最後一個儲存格
  5.     工作表2.Cells(n, 1) = Cells(RngRow, 1) '日期寫入工作表2
  6.     工作表2.Cells(n, 2) = Cells(RngRow, Rng.Column) '最後的數值寫入工作表2
  7.     n = n + 1
  8. Next
  9. End Sub
複製代碼

作者: idnoidno    時間: 2015-4-13 08:30

感謝大大的回復,我來研究試試看,不懂的,希望您可以接受我的請益
謝謝
作者: idnoidno    時間: 2015-4-13 12:59

請問阿lpk187大大
執行的結果有點不一樣
另外loop好像太多次
作者: lpk187    時間: 2015-4-13 13:44

回復 4# idnoidno

我再執行一次,結果是你要的意思,不過我還是修改一下
  1. Sub 巨集1()
  2. n = 1
  3. For Each Rng In 工作表1.Range("B1", 工作表1.Cells(1, Columns.Count).End(xlToLeft).Address) '第一列"動態"讀取做循環
  4.     RngRow = 工作表1.Columns(Rng.Column).Find("*", , , , , xlPrevious).Row '尋找改欄的最後一個儲存格
  5.     工作表2.Cells(n, 1) = Rng
  6.     工作表2.Cells(n, 2) = 工作表1.Cells(RngRow, 1) '日期寫入工作表2
  7.     工作表2.Cells(n, 3) = 工作表1.Cells(RngRow, Rng.Column) '最後的數值寫入工作表2
  8.     n = n + 1
  9. Next
  10. End Sub
複製代碼
二、我程序是做動態循環,以你上傳的檔案去做的,依這個檔案只做了"甲乙丙"3次循環,所以你說的太多Loop是指3次太多嗎?
作者: lpk187    時間: 2015-4-13 13:51

回復 4# idnoidno

執行結果如下2圖
    [attach]20635[/attach]

[attach]20636[/attach]
作者: idnoidno    時間: 2015-4-13 14:06

大大,謝謝,可以和你線上請益依下嗎
作者: Hsieh    時間: 2015-4-13 14:17

回復 6# lpk187
  1. Sub ex()
  2. Dim Ar()
  3. Dim A As Range
  4. With 工作表1
  5. For Each A In .Range(.[B1], .[B1].End(xlToRight))
  6.    c = Application.Lookup(9.9E+307, A.EntireColumn)
  7.    d = Application.Lookup(9.9E+307, A.EntireColumn, .Columns("A"))
  8.    ReDim Preserve Ar(s)
  9.    Ar(s) = Array(A.Value, CDate(d), c)
  10.    s = s + 1
  11. Next
  12. With 工作表2
  13.    .UsedRange.ClearContents
  14.    .[A1].Resize(s, 3) = Application.Transpose(Application.Transpose(Ar))
  15. End With
  16. End With
  17. End Sub
複製代碼

作者: lpk187    時間: 2015-4-13 14:20

回復 7# idnoidno


    要如何線上,我不會耶!
作者: idnoidno    時間: 2015-4-13 14:22

哇謝謝版主出手回應
小弟才學粗淺,可能要好好的研讀了
還是十分感謝版主
作者: idnoidno    時間: 2015-4-13 20:08

回復 9# lpk187

想就教,你的第3行的語法,是否可以稍做說明一下
謝謝
作者: lpk187    時間: 2015-4-13 23:28

回復 11# idnoidno

是這一列嗎?
RngRow = 工作表1.Columns(Rng.Column).Find("*", , , , , xlPrevious).Row '尋找改欄的最後一個儲存格
其中,工作表1.Columns(Rng.Column)是尋找的範圍所對應的欄,我以動態循環來改變它尋找的範圍,以循環的第一次迴圈來說,它會搜尋"甲"那一欄最後有"值"的儲存格來傳回所對應的列號Row,我以萬用字元 * 來代表任何字串,xlPrevious是由下往上找,

  以下是擷取Excel說明Range.Find的說明給參考!
Excel 開發人員參考資料
Range.Find 方法
會尋找範圍中的特定資訊。
語法

運算式.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

運算式   代表 Range 物件的變數。

參數

名稱 必要/選用 資料類型 描述
What 必要 Variant 要搜尋的資料。可以為字串或任何 Microsoft Excel 資料類型。
After 選用 Variant 指定儲存格,搜尋將會從這個儲存格之後開始。這個儲存格對應於從使用者介面執行搜尋時的作用儲存格位置。注意,After 必須是範圍中的單一儲存格。請記住搜尋是從這個儲存格之後開始,因此必須等到該方法循環回到指定的儲存格時,才會搜尋其內容。如果沒有指定這個引數,則搜尋會從範圍左上角的儲存格之後開始。
LookIn 選用 Variant 資訊的類型。
LookAt 選用 Variant 可以為下列其中一個 XlLookAt 常數:xlWhole 或 xlPart。
SearchOrder 選用 Variant 可以為下列其中一個 XlSearchOrder 常數:xlByRows 或 xlByColumns。
SearchDirection 選用 XlSearchDirection 搜尋方向。
MatchCase 選用 Variant 如果為 True,則搜尋時會將大小寫視為相異。預設值為 False。
MatchByte 選用 Variant 只有當您已選取或安裝雙位元組語言支援時,才能使用。如果為 True,則雙位元組字元只能符合雙位元組字元。如果為 False,則雙位元組字元可符合對應的單位元組字元。
SearchFormat 選用 Variant 搜尋格式。
作者: lpk187    時間: 2015-4-13 23:41

回復 11# idnoidno

我也只是一個初學者。有空時我會來這討論區看看其他大大的程式的做法。順便以其他人的問題來當成作業來作,看看自己學了多少(其實有很多人問題看都看不懂),所以我也會等其他大大的答案啦!所以大家一起研究
作者: idnoidno    時間: 2015-4-13 23:59

謝謝,請教,VBA的畫面中,您有使用即時監看視窗來輔助您的程序直行嗎
作者: idnoidno    時間: 2015-4-14 00:09

For Each Rng In 工作表1.Range("B1", 工作表1.Cells(1, Columns.Count).End(xlToLeft).Address) '第一列"動態"讀取做循環
這一列中用法,您可否再予以指導說明一下
另外動態讀取做循環的中文意思有點不清楚
真的感謝您可以回復,謝謝
作者: lpk187    時間: 2015-4-14 06:26

回復 15# idnoidno


For Each Rng In 工作表1.Range("B1", 工作表1.Cells(1, Columns.Count).End(xlToLeft).Address) '第一列"動態"讀取做循環

所謂的動態是指,當你儲存格有"增減"時仍可以依你的增減來做讀取,例如:只有甲乙丙3欄它就只做3次循環,若增加2欄則可以做5次 循環
上面 Rng 是儲存格(Range)的變數,
工作表1.Range("B1", 工作表1.Cells(1, Columns.Count).End(xlToLeft).Address) ,則是範圍意思是後B1這一欄開始到,Columns.Count是所有欄的數目,
End(xlToLeft).Address是從最後的儲存格尋找回來遇到的第一個有值的儲存格位址

還有當運行程序時剛開始最好用"F8"來一行一行看,大部份我只有用"區域變數視窗"監看變化
作者: idnoidno    時間: 2015-4-14 06:48

謝謝您,您的儲存格變數不用宣告嗎?還是一般初學就先省掉呢
作者: lpk187    時間: 2015-4-14 08:23

回復 17# idnoidno


    在For Each Rng 這個變數不用宣告
我上面寫的好像有點難懂,他原來可以像下面這樣寫
For Each Rng in Range("B1:D1")    ' 其中Range("B1:D1") 是迴圈的範圍
        ...
        ...
Next  
你可以多參考VBA的說明
作者: idnoidno    時間: 2015-4-14 11:18

lpk187大大,按您的回覆,您也是會去查詢F1查詢說明去看使用的用法嗎
還是至少您是已經知道有這樣的一個函數,會用後然後再去按要解決的例子再去查是不是可以合適解決的嗎
作者: lpk187    時間: 2015-4-14 13:00

回復 19# idnoidno


    我會去看說明,有時是有會想法然後去查關鍵看看(不一定查得到)甚至上網找,方式有很多
不過說明若查得到,它的範例也是學習的好方法
作者: idnoidno    時間: 2015-4-15 08:47

回復  idnoidno


    我會去看說明,有時是有會想法然後去查關鍵看看(不一定查得到)甚至上網找,方式有 ...
lpk187 發表於 2015-4-14 13:00

lpk188大大,可否請您看小弟的另一個延伸的問題
http://forum.twbts.com/thread-13807-1-1.html
可否請益您的方法有何建議
謝謝
作者: lpk187    時間: 2015-4-15 20:59

回復 21# idnoidno

說實在的,我真的看不懂你要什麼?

你應該嘗試著做一份你要的...呃!東西,來看看,不然很難瞭解的, 不在其位不謀其政,大哥你應該知道!
作者: idnoidno    時間: 2015-4-15 22:40

回復  idnoidno

說實在的,我真的看不懂你要什麼?

你應該嘗試著做一份你要的...呃!東西,來看看, ...
lpk187 發表於 2015-4-15 20:59


lpk 187大大您好
感謝您回復,我寫完內容沒有細究就提出請求指導
現在再看發現自己寫的真的有點不知所云
不好意思
我會想ㄧ下再更正
不過我因為初到論壇
所以想要找個人協助學習
但是因為積分不夠所以連短信都無法使用
見到您熱心所以希望跟您學習一下
希望有這個機會
感謝




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