返回列表 上一主題 發帖

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

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

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

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

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


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

TOP

本帖最後由 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
複製代碼
謝謝!

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

回復 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

本帖最後由 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

回復 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-7 16:35 編輯

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

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

本帖最後由 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

        靜思自在 : 小事不做、大事難成。
返回列表 上一主題