返回列表 上一主題 發帖

[發問] 請高人幫忙除錯,謝謝~



請問哪裡出錯了?Rng(2).copy Rng(1)

TOP

回復 40# 198188
With Workbooks.Open("C:\Users\patrick.HKG\Desktop\Patrick.XLSX").Sheets("SHEET1")
將此檔案與未出錯檔案對調看是否一樣的出錯,可依下方程序看看

回復 41# 198188
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng(1 To 2) As Range
  4.     With Workbooks("payment.XLSM").Sheets("2012")
  5.         Set Rng(1) = .[E1000].End(xlUp).Offset(, -4) '這 Rng(1)的位置
  6.         With Workbooks.Open("C:\Users\patrick.HKG\Desktop\Patrick.XLSX").Sheets("SHEET1")
  7.             Set Rng(2) = .[A2:L2]
  8.             Set Rng(2) = .Range(Rng(2), .[A2].End(xlDown))
  9.             MsgBox .Rows.Count - Rng(2).Rows.Count < .Rows.Count - Rng(1).Row 'True: Rng(2)範圍大於 Rng(1) 就有錯誤
  10.             Rng(2).Copy Rng(1)
  11.             .Parent.Close False
  12.         End With
  13.     End With
  14. End Sub
複製代碼

TOP

回復 42# GBKEE


    01.Option Explicit

02.Sub Ex()

03.    Dim Rng(1 To 2) As Range

04.    With Workbooks("payment.XLSM").Sheets("2012")

05.        Set Rng(1) = .[E1000].End(xlUp).Offset(, -4) '這 Rng(1)的位置

06.        With Workbooks.Open("C:\Users\patrick.HKG\Desktop\Patrick.XLSX").Sheets("SHEET1")

07.            Set Rng(2) = .[A2:L2]

08.            Set Rng(2) = .Range(Rng(2), .[A2].End(xlDown))

09.            MsgBox .Rows.Count - Rng(2).Rows.Count < .Rows.Count - Rng(1).Row 'True: Rng(2)範圍大於 Rng(1) 就有錯誤

10.            Rng(2).Copy Rng(1)

11.            .Parent.Close False

12.        End With

13.    End With

14.End Sub
是Rng(2)範圍大於 Rng(1),但是Set Rng(1) = .[E1000].End(xlUp).Offset(, -4) '這 Rng(1)的位置 (這句的意思是不是等於由E1000開始往上檢查最後一列,OFFSET( , -4)將E欄改成A欄
Set Rng(2) = .Range(Rng(2), .[A2].End(xlDown))是否意思從A欄第二列開始往下到最後一筆?

TOP

回復 43# 198188
Set Rng(1) = .[E1000].End(xlUp):  E1000開始往上檢查最後一列=> 如是 E999
Set Rng(1) = .[E1000].End(xlUp).Offset(, -4) => A999
那 A999 到 檔案底部 的列數是 2003-> 65536-999 +1
*********
Set Rng(2) = .Range(Rng(2), .[A2].End(xlDown))
A欄第二列開始往下到最後一筆範圍的列數 ?? 如大於 65536-999 +1
********** 複製的資料範圍>貼上位置的範圍 ?? 那多出的資料要擺哪裡 ??****

TOP

回復 44# GBKEE


    Set Rng(1) = .[E1000].End(xlUp):  E1000開始往上檢查最後一列=> 如是 E999
那麼請問我應該如何寫這句,將它寫成set rng(1) = 當前worksheet(2012)E 欄的最後一列加1?
其實我A欄大部分都沒有資料

TOP

回復 44# GBKEE


    Set Rng(2) = .Range(Rng(2), .[A2].End(xlDown))
A欄第二列開始往下到最後一筆範圍的列數 ?? 如大於 65536-999 +1
********** 複製的資料範圍>貼上位置的範圍 ?? 那多出的資料要擺哪裡 ??****
或者
這句可否改成A欄第二列開始往下到最後一筆範圍的列數,但基於有時會隔開一列,可否加多句找到最後一筆的那列後加兩列,如果也沒有資料,才確認是最後一筆,否則繼續往下開始

TOP

本帖最後由 GBKEE 於 2012-12-8 10:45 編輯

回復 46# 198188
41# 的錯誤在
  1.           Set Rng(2) = .[A2:L2]
  2.           Set Rng(2) = .Range(Rng(2), .[A2].End(xlDown))   'A欄沒資料 [A2].End(xlDown) 會到檔案底部
複製代碼
39# 已提醒你: 給你的程式碼要消化一下,VBA才會進步
  1.    
  2.           Set Rng(1) = .[E2]  'E欄資料有連續
  3.          '
  4.          '
  5.            Set Rng(2) = .[A2:L2]
  6.           ' **** Set Rng(2) = .Range(Rng(2), .[a2].End(xlDown))  ***** 這行不要用
  7.             Set Rng(2) = Rng(2).Resize(.[E1].End(xlDown).Row - 1)  
  8.            '[E1].End(xlDown) 到E欄有資料的地方會停止,才不會到檔案底部
  9.             Rng(2).copy Rng(1).Cells(1, -3)
複製代碼

TOP

回復 47# GBKEE


   感激解釋,
但是我試過除了剛才這句 Set Rng(1) = Rng(1).End(xlDown).Offset(1)出現問題外,當我E欄中間有一列空白,就不懂往下copy,所以才用A欄,明白原理,但就是轉不過來怎樣改?

         With Workbooks.Open("C:\Documents and Settings\USER\桌面\Patrick.XLSX").Sheets("SHEET1")

            Set Rng(2) = .[A2:L2]

            Set Rng(2) = Rng(2).Resize(.[E1].End(xlDown).Row - 1)

            Rng(2).Copy Rng(1).Cells(1, -3)

            .Parent.Close False

TOP

回復 47# GBKEE


    正如第38貼Patrick.XLSX,E 欄只有幾欄資料怎會超出範圍?Set Rng(2) = Rng(2).Resize(.[E1].End(xlDown).Row - 1)這句以什麼作為規則?

TOP

回復 48# 198188
當我E欄中間有一列空白: 可由檔案底部往上
  1.     Set Rng(2) = Rng(2).Resize(.Cells(.Rows.Count, "E").End(xlUp).Row - 1)
  2.     Set Rng(2) = Rng(2).Resize(.Range("E" & .Rows.Count).End(xlUp).Row - 1)
複製代碼
回復 49# 198188
VBA 的說明
  1. Resize 屬性
  2. 請參閱套用至範例特定調整指定的範圍。傳回 Range 物件,該物件代表調整後的範圍。
  3. expression.Resize(RowSize, ColumnSize)
  4. expression     必選。該運算式傳回要調整大小的 Range 物件。
  5. RowSize     選擇性的 Variant。新範圍中所包含的列數。如果省略此引數,範圍中的列數保持不變。
  6. ColumnSize     選擇性的 Variant。新範圍中所包含的欄數。如果省略此引數,範圍中的欄數保持不變。
複製代碼
  1. For xi = 1 To 5
  2.         Set Rng(2) = Rng(2).Resize(xi)
  3.         MsgBox Rng(2).Address
  4.     Next
複製代碼

TOP

        靜思自在 : 自己害自己,莫過於亂發脾氣。
返回列表 上一主題