返回列表 上一主題 發帖

[發問] 物件省略的加"."與不加問題

[發問] 物件省略的加"."與不加問題

本帖最後由 thps51134 於 2011-12-7 09:26 編輯

想請教我的觀念哪裡搞錯了

在With...End With 中, 將Cells(), Range()等前面加上"."時
發現出現"錯誤438...不支援此屬性或方法"或"錯誤1004, class range select失敗"等的錯誤訊息

是 Workbook.add的關係嗎?
=====
目前可以正確執行的版本:
  1. With Workbooks.add
  2.     With Sheet1
  3.         Range("A1").select
  4.     End with
  5. End with
複製代碼
但之前學到了
With...End With
其中做動作時
前面物件雖可省略, 但需加個"."
所以原本是這樣:
  1. With Workbooks.add
  2.     With .Sheet1
  3.         .Range("A1").select
  4.     End with
  5. End with
複製代碼
&這樣寫的:
  1. With Workbooks.add
  2.     With Sheet1
  3.         .Range("A1").select
  4.     End with
  5. End with
複製代碼
但就會出現錯誤訊息

請指點我哪裡搞錯了,謝謝大家!

回復 1# thps51134


    當執行Workbooks.add時
作用活頁簿就是該新增活頁簿
所以With Workbooks.add區段下
With .Sheets(1)會指向該新增活頁簿中的第一個工作表
但是若少了"."
With Sheets(1)則是指向程式碼所在的活頁簿中的第一個工作表
那麼在做select動作時,因為並非於作用中活頁簿中執行所以會出錯
學海無涯_不恥下問

TOP

本帖最後由 thps51134 於 2011-12-7 12:44 編輯

回復 2# Hsieh

    Dear Hsieh大, 老實說
 讓我相當困惑的其中一點就在於
 我的Code是寫在下面所寫的"Test.xls"的Module中
  1.     Windows("Test.xls").Activate
  2.     Range(Cells(1, 1), Cells(4, 72)).Copy
  3.    
  4.     With Workbooks.Add
  5.         With Sheets1
  6.             Cells(1, 1).Select '也改為' Cells(1,1).value= "OH" '過, 確認過動作真的是會作用在此'
  7.             ActiveSheet.Paste
  8.         End With
  9.     End With
複製代碼
這樣寫下來,竟然可以執行出
讓在test 中Copy的資料於新開的workbook中的Sheet1中貼上  
(我的目的就是要copy舊檔案中的部分資料, paste於開的檔案中)

Hsieh大的回覆也讓我驚覺我的錯誤訊息問題...
應該與語法不熟大有關係= =a
因為將
With Sheet1 改為 With .Sheets(1)
加"."的就順利執行了!
感謝!

TOP

本帖最後由 Hsieh 於 2011-12-8 08:34 編輯

回復 3# thps51134
你試過可以直接給值是可以執行的
所以應該會發現是Select造成的錯誤   
試著不要使用SELECT,也可避免無謂的螢幕更新
    With Workbooks.Add
      Set A = .Sheets(1).Cells(1, 1) '指定新活頁簿的第一個工作表A1
       With Workbooks("Test.xls").Sheets(1)
          .Range(.Cells(1, 1), .Cells(4, 72)).Copy A '複製TEST.XLS的第一張工作表部分範圍到新活頁簿中
       End With
    End With
學海無涯_不恥下問

TOP

本帖最後由 thps51134 於 2011-12-7 15:23 編輯

回復 4# Hsieh
  1. Sub NewMethod()
  2.     With Workbooks.Add
  3.       Set A = .Sheets(1).Cells(1, 1) '指定新活頁簿的第一個工作表A1
  4.        With Windows("test.xls").Sheets(1)
  5.           .Range(.Cells(1, 1), .Cells(4, 72)).Copy A '複製TEST.XLS的第一張工作表部分範圍到新活頁簿中
  6.        End With
  7.     End With
  8. End Sub
複製代碼
偵錯時highlight說在第4行發現問題
還是說, 會不會我改到了什麼設定?
===
其實用.select是因為
使用錄製巨集時跑出的Code 為需要用到Activate的
改來改去就成了現在的樣子

真的很想省掉
Hsieh大給了我一個很棒的方向~

TOP

本帖最後由 GBKEE 於 2011-12-7 16:35 編輯

回復 5# thps51134
視窗 Windows沒有Sheets(1)有ActiveSheet
視窗 With Windows ("test.xls").Sheets(1)   改為 ->  活頁簿   With WorkBooks("test.xls").Sheets(1)

TOP

回復 6# GBKEE

    抱歉未及時回覆
    感謝兩位... (羞愧掩面)
 竟然眼花當錯誤

想繼續向諸位請教
1. 在第四行中的" .Range(.Cells(1, 1), .Cells(4, 72)).Copy A "的意義為何?
  1. With Workbooks.Add
  2.       Set A = .Sheets(1).Cells(1, 1) '指定新活頁簿的第一個工作表A1
  3.        With Workbooks("Test.xls").Sheets(1)
  4.           .Range(.Cells(1, 1), .Cells(4, 72)).Copy A '複製TEST.XLS的第一張工作表部分範圍到新活頁簿中
  5.        End With
  6. End With
複製代碼
若設" .Range(.Cells(1, 1), .Cells(4, 72))" 為B
B.Copy A 是 "copy B to A"嗎?

2. 若想另外在"Test.xls"作逐行判斷
令結果= true的該列copy to 新開的Workbook
自己腦袋裡的概念像這樣...
  1. With Workbook("Test.xls").Sheets(1)
  2.     for i = 1 to RowEnd 'RowEnd為整個Sheet(1)中的最後一列'
  3.         If true then
  4.             Rows(i).copy
  5.             With  剛剛新開的workbook
  6.                 '將於Workbook("Test.xls").Sheets(1)中copy的Row
  7.                 'paste在 New Workbook的最後一列之後
  8.             End With
  9.         End if
  10.     Next i
  11. End With
複製代碼
還是說建議強制先替使用者將新add 的 workbook存檔
再將它叫出來?

感謝!

TOP

本帖最後由 GBKEE 於 2011-12-14 16:48 編輯

回復 7# thps51134
.Range(.Cells(1, 1), .Cells(4, 72)).Copy A      -> .Range(範圍)複製(全部)到變數物件A
若設" .Range(.Cells(1, 1), .Cells(4, 72))" 為B-> B.Copy A
還是說建議強制先替使用者將新add 的 workbook存檔,再將它叫出來?
應是做完COPY 再存檔

TOP

回復 8# GBKEE

想用VBA做的事:
   1. 將Test.xls表格檔頭複製到新開的檔案
  2. 回到舊檔案(Test.xls), 對Row data作逐列判斷
    符合=> Copy該row到 檔案最後一列後
    不符=> 到下一列判斷
這邊不知道該如何在兩個Workbook中切換才好
=====

    其實很想知道如何做完所有copy動作再存檔
 可是不知道該如何寫For loop中的
        with "剛剛新增的workbook" 
    如果直接 with workbook.add怕一次loop就新開一個workbook ...@@

謝謝!

TOP

回復 9# thps51134
  1. Option Explicit
  2. Sub Ex()
  3.     Dim NewSh As Worksheet
  4.     With Workbook("Test.xls").Sheets(1)
  5.         Set NewSh = Workbooks.Add.Sheets(1)   '變數指定為 新增活頁簿的Sheets(1)
  6.         For i = 1 To RowEnd                   'RowEnd為整個Sheet(1)中的最後一列'
  7.             If 條件 = True Then
  8.                 If NewSh.Cells(1) = "" Then   'A1=""
  9.                     Rows(i).Copy newbo.Rows(1) '新檔案最後一列後
  10.                 Else
  11.                     Rows(i).Copy NewSh.Cells(Rows.Count, "A").End(xlUp).Offset(1)  '新檔案最後一列
  12.                 End If
  13.             End If
  14.         Next
  15.         NewSh.Parent.SaveAs "資料夾\檔案名稱"    '新增的活頁簿存檔
  16.     End With
  17. End Sub
複製代碼

TOP

        靜思自在 : 君子為目標,小人為目的。
返回列表 上一主題