Board logo

標題: [發問] 物件省略的加"."與不加問題 [打印本頁]

作者: thps51134    時間: 2011-12-7 09:22     標題: 物件省略的加"."與不加問題

本帖最後由 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
複製代碼
但就會出現錯誤訊息

請指點我哪裡搞錯了,謝謝大家!
作者: Hsieh    時間: 2011-12-7 10:13

回復 1# thps51134


    當執行Workbooks.add時
作用活頁簿就是該新增活頁簿
所以With Workbooks.add區段下
With .Sheets(1)會指向該新增活頁簿中的第一個工作表
但是若少了"."
With Sheets(1)則是指向程式碼所在的活頁簿中的第一個工作表
那麼在做select動作時,因為並非於作用中活頁簿中執行所以會出錯
作者: thps51134    時間: 2011-12-7 12:34

本帖最後由 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)後
加"."的就順利執行了!
感謝!
作者: Hsieh    時間: 2011-12-7 13:42

本帖最後由 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
作者: thps51134    時間: 2011-12-7 15:21

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

[attach]8754[/attach]回復 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大給了我一個很棒的方向~
作者: GBKEE    時間: 2011-12-7 16:23

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

回復 5# thps51134
視窗 Windows沒有Sheets(1)有ActiveSheet
視窗 With Windows ("test.xls").Sheets(1)   改為 ->  活頁簿   With WorkBooks("test.xls").Sheets(1)
作者: thps51134    時間: 2011-12-14 15:16

回復 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存檔
再將它叫出來?

感謝!
作者: GBKEE    時間: 2011-12-14 16:19

本帖最後由 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 再存檔
作者: thps51134    時間: 2011-12-14 17:16

回復 8# GBKEE

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

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

謝謝!
作者: GBKEE    時間: 2011-12-15 17:51

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

作者: thps51134    時間: 2011-12-20 10:42

本帖最後由 thps51134 於 2011-12-20 10:47 編輯

回復 10# GBKEE

 想請教您code中兩列的意義
1. 第一列 "Option Explicit"

2. 第11列 "NewSh.Cells(Rows.Count, "A").End(xlUp).Offset(1)"
  迴圈執行到這裡時,似乎最後一列的資訊無法更新? (也怕我改寫錯了)
  每次於新檔案貼上都是貼在同一列Q_Q
  1. '自己改寫的迴圈內; 第九列執行有問題'
  2. For i = 22 To RowEnd      'RowEnd為整個Sheet(1)中的最後一列'
  3.     If Cells(i, 3).Value = "BU5" Then
  4.         If NewSh.Cells(2, 1) = "" Then  '因為Cells(1,1)都為空, 所以換了別格
  5.             Range(Cells(i, 1), Cells(i + 1, 2)).EntireRow.Copy NewSh.Rows(1)
  6.                  '新檔案最後一列後
  7.                  '因為前面沒看到newbo所以換成NewSh...不知道有沒有誤會'
  8.         Else
  9.             Range(Cells(i, 1), Cells(i + 1, 3)).EntireRow.Copy NewSh.Cells(Rows.count, "A").End(xlUp).Offset(1) '新檔案最後一列
  10.         End If
  11.     End If
  12. Next i
複製代碼
謝謝!
作者: GBKEE    時間: 2011-12-20 14:44

回復 11# thps51134
Option Explicit 陳述式  在模組層次中強迫每個在模組�堛瘍僂くㄔ眸楨�確的宣告。
如圖
[attach]8852[/attach]

迴圈執行到這裡時,似乎最後一列的資訊無法更新? (也怕我改寫錯了)
程式碼是沒問題的要看看檔案內容




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