返回列表 上一主題 發帖

[發問] EXCEL VBA 的問題

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

TOP

回復 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次太多嗎?

TOP

回復 4# idnoidno

執行結果如下2圖
   

TOP

回復 7# idnoidno


    要如何線上,我不會耶!

TOP

回復 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 搜尋格式。

TOP

回復 11# idnoidno

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

TOP

回復 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"來一行一行看,大部份我只有用"區域變數視窗"監看變化

TOP

回復 17# idnoidno


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

TOP

回復 19# idnoidno


    我會去看說明,有時是有會想法然後去查關鍵看看(不一定查得到)甚至上網找,方式有很多
不過說明若查得到,它的範例也是學習的好方法

TOP

回復 21# idnoidno

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

你應該嘗試著做一份你要的...呃!東西,來看看,不然很難瞭解的, 不在其位不謀其政,大哥你應該知道!

TOP

        靜思自在 : 【時間成就一切】時間可以造就人格,可以成就事業,也可以儲積功德。
返回列表 上一主題