Board logo

標題: [發問] 資料的複製、貼上,語法問題 [打印本頁]

作者: iceandy6150    時間: 2019-6-20 00:38     標題: 資料的複製、貼上,語法問題

各位好  想請問一些語法上的錯誤

一、同一個檔案,不同sheet之間的複製 貼上
With Sheets("工作表1")
a = .UsedRange.Rows.com
  1. Sheets("工作表1").Range("A1:B" & a).Copy

  2. Sheets("結果區").Range("A1").Select

  3. Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
  4. , SkipBlanks:=False, Transpose:=False

  5. Application.CutCopyMode = False
複製代碼
End with

我想把Sheet工作表1的  已使用列數 的資料,複製貼上到 Sheet結果區的 A1
可是在這一行跟我說出錯  Sheets("結果區").Range("A1").Select
為什麼呢?


二、不同檔案之間的複製、貼上

假使有兩個檔案   一個叫  資料.xlsx   一個叫   檔案.xlsx
我現在是用
Windows("資料.xlsx").Activate
.Range("A1:B3").copy

Windows("檔案.xlsx").Activate
.Range("A1").select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False

就是要用誰,誰就先Active
或是要寫很長
e=Workbooks("資料.xlsx").Sheets("工作表1").Range("A1:B3").Value
Workbooks("檔案.xlsx").Sheets("工作表1").Range("A1:B3").Value = e

如果直接接在一起好像也會錯
例如:
Workbooks("檔案.xlsx").Sheets("工作表1").Range("A1:B3").Value = Workbooks("資料.xlsx").Sheets("工作表1").Range("A1:B3").Value

因為我是新手
有時候對於這個就很困擾
明明我已經告訴電腦  哪個檔案的哪個sheets的哪個Range了
我就只是想要B檔案的這個位置 = A檔案的某個位置的值 而已
但是常常出錯

或是就要先用一個 e = 某某某   然後圈圈圈再 = e

搞得我很混亂
再麻煩各位大大解答
謝謝
作者: n7822123    時間: 2019-6-20 01:15

本帖最後由 n7822123 於 2019-6-20 01:26 編輯

回復 1# iceandy6150

可是在這一行跟我說出錯  Sheets("結果區").Range("A1").Select
為什麼呢?

a = .UsedRange.Rows.com
應該是
a = .UsedRange.Rows.count


二、不同檔案之間的複製、貼上

你的題目實在太廣了.......寫法千百種
只能說新手只能多看別人怎麼寫的
最後才能找到自己習慣的寫法


原程式:
Windows("資料.xlsx").Activate
.Range("A1:B3").copy

Windows("檔案.xlsx").Activate
.Range("A1").select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False

(1)可以設物件來簡短長度 如下:

Set 資料表=workbooks("資料.xlsx").sheets("工作表1")
Set 檔案表=workbooks("檔案.xlsx").sheets("工作表1")
資料表.[A1:B3].copy
檔案表.[A1].PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False



(2)如果啟用的工作表在"資料.xlsx"的"工作表1",
     基本上以後用這個工作表,前面的"地址"就可以省略了
     用Activate+With...End With 來簡短長度 如下


workbooks("資料.xlsx").sheets("工作表1").Activate

with workbooks("檔案.xlsx").sheets("工作表1")
    [A1:B3].copy  
    .[A1].PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
    , SkipBlanks:=False, Transpose:=False  
end with



[A1:B3].copy  這裡是copy "資料.xlsx"的"工作表1"的[A1:B3],因為是啟用的工作表,前面直接省略!
注意[A1]前面多了.,所以是在"檔案.xlsx"的"工作表1"的[A1]貼上

作者: iceandy6150    時間: 2019-6-20 01:54

回復 2# n7822123


    感謝大大講解,原來規則是這樣

回到我第一題
  1. With Sheets("工作表1")

  2. a = .UsedRange.Rows.Count
  3. Sheets("結果區").Range("A1:Z200").Delete Shift:=xlShiftUp    '清除所有資料
  4. Sheets("工作表1").Range("A1:B" & a).Copy
  5. Sheets("結果區").Range("A1").Select
  6. Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
  7. , SkipBlanks:=False, Transpose:=False

  8. Application.CutCopyMode = False
  9. End with
複製代碼
說錯在那一行
[attach]30907[/attach]

是因為用了 With Sheets("工作表1")
所以我Sheets("結果區").Range("A1").Select 這樣就會錯嗎?
還是另有原因
謝謝
作者: n7822123    時間: 2019-6-20 02:47

本帖最後由 n7822123 於 2019-6-20 03:02 編輯

回復 3# iceandy6150


非啟用的工作表做選取,會發生錯誤

所以盡量不要用 Select,下面程式同理,試試看

Sheets("工作表1").Activate
Sheets("結果區").Range("A1").Select


選取之前,要先改啟用的工作表
改成下面這樣就可以了

Sheets("工作表1").Activate
Sheets("結果區").Activate
Sheets("結果區").Range("A1").Select

作者: n7822123    時間: 2019-6-20 03:13

本帖最後由 n7822123 於 2019-6-20 03:14 編輯

回復 4# n7822123

亦或者用Application.Goto取代Select

Sheets("工作表1").Activate
Application.Goto Sheets("結果區").Range("A1")

作者: iceandy6150    時間: 2019-6-20 12:28

回復 5# n7822123


    感謝您的教學

如果是以這種寫法
************************************
選取之前,要先改啟用的工作表,
改成下面這樣就可以了

Sheets("工作表1").Activate
Sheets("結果區").Activate
Sheets("結果區").Range("A1").Select
************************************

如果有很多資料要判斷,就會兩個檔案一直Active
第一檔Active,複製,第二檔Active,選取,貼上 (這是判斷一筆而已)
如果有100筆要判斷的話,符合條件就複製過去,不符合就不動作
就會一直Active
畫面就跳啊跳啊,呵呵
不過能成功完成要做的事就好

GOTO可能就比較不會跳來跳去

再次感謝
作者: n7822123    時間: 2019-6-20 12:58

本帖最後由 n7822123 於 2019-6-20 13:07 編輯

回復 6# iceandy6150

所以不要用select,可參考我2樓的第2個寫法
固定一個工作表activate,其他的用with……end with
for回圈在with之內 你要處理1000個也沒問題
作者: 准提部林    時間: 2019-6-21 10:00

回復 3# iceandy6150

With Sheets("工作表1")
       a = .UsedRange.Rows.Count
       Sheets("結果區").Range("A1:Z200").Delete Shift:=xlShiftUp    '清除所有資料
           .Range("A1:B" & a).Copy
       Sheets("結果區").Range("A1").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
      , SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End with
作者: iceandy6150    時間: 2019-6-21 12:19

回復 8# 准提部林


    我今天遇到一個新問題
一個檔案,兩個sheet: 1.工作表1    2. PPT
我要把資料從【工作表1】,複製到【PPT】

但是程式結果有誤,可能又是我語法有問題了
  1. Private Sub CommandButton6_Click()

  2. If Sheets("PPT").Range("A1").Value <> "" Then
  3.   Sheets("PPT").Range("A1:Z200").Delete Shift:=xlShiftUp    '清除所有資料
  4. End If

  5. Sheets("工作表1").Range("A1").CurrentRegion.Copy

  6. Sheets("PPT").Activate

  7. ActiveSheet.[A1].Select
  8. Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
  9. , SkipBlanks:=False, Transpose:=False

  10. Application.CutCopyMode = False

  11. a = UsedRange.Rows.Count

  12. For i = 2 To a
  13.   Range("U" & i).Value = Range("G" & i).Value + 1
  14. Next i
  15. End sub
複製代碼
我中間已經把【PPT】Activate了
a去計算已經使用列數,是計算【PPT】的嗎   還是計算 【工作表1 】的?
因為下面做迴圈的時候,結果居然是放在 【工作表1】 的U欄,而不是放在【PPT】的U欄
Range("U" & i).Value = Range("G" & i).Value + 1  這行 如果寫 .Range 又跟我警告錯誤

後來只好改成
For i = 2 To a
  Sheets("PPT").Range("U" & i).Value = Sheets("PPT").Range("G" & i).Value + 1
Next i
這樣才能放在PPT的U欄中


Sheets("工作表1").Range("A1").CurrentRegion.Copy
這一行我本來是寫[A1].CurrentRegion.Copy
但是我發現,如果我把畫面點在【PPT】,再按F8逐步測試程式
結果就會去複製【PPT】的A1,而不會去複製【工作表1】的A1

這個"地址"該省不該省,還有"目前啟用"的對象是誰
我還是有點模糊
再請各位大大解答了
謝謝
註:這個按鈕是寫在 工作表1
作者: 准提部林    時間: 2019-6-21 12:34

回復 9# iceandy6150


為保無誤,
RANGE或USEDRANGE前面最好冠上SHEETS("???")
作者: n7822123    時間: 2019-6-21 14:08

本帖最後由 n7822123 於 2019-6-21 14:11 編輯

回復 9# iceandy6150


UsedRange是計算某個工作表的使用範圍~~~所以前面最好指定是哪個Sheet
你的按鈕在工作表1,所以工作表1一開始就是Activate了~~~~
盡量不要一直切換工作表.........把自己弄混亂了~~~我光看你的說明...我自己也混亂了XD
依照你的寫法,我認為你還是直接指定哪個工作表比較安全^.^
你在ppt工作表的操作比較多,按鈕卻設在工作表1的確容易出問題

如果是我,就這樣寫摟~~~

With Sheets("PPT")
  If .[A1].Value <> "" Then .[A1:Z200].Delete Shift:=xlShiftUp    '清除所有資料
  [A1].CurrentRegion.Copy
  .[A1].PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
  , SkipBlanks:=False, Transpose:=False
  Application.CutCopyMode = False
  A = .UsedRange.Rows.Count
  For i = 2 To A
    .Range("U" & i).Value = .Range("G" & i).Value + 1
  Next i
End With

作者: iceandy6150    時間: 2019-6-24 00:32

回復 10# 准提部林


    好的,非常感謝

只是因為有時候很長一串
我都想省一下,呵呵
作者: iceandy6150    時間: 2019-6-24 00:48

UsedRange是計算某個工作表的使用範圍~~~所以前面最好指定是哪個Sheet
你的按鈕在工作表1,所以工作表1一開始就是Activate了~~~~
盡量不要一直切換工作表.........把自己弄混亂了~~~我光看你的說明...我自己也混亂了XD
依照你的寫法,我認為你還是直接指定哪個工作表比較安全^.^
你在ppt工作表的操作比較多,按鈕卻設在工作表1的確容易出問題

如果是我,就這樣寫摟~~~

With Sheets("PPT")
  If .[A1].Value <> "" Then .[A1:Z200].Delete Shift:=xlShiftUp    '清除所有資料
  [A1].CurrentRegion.Copy
  .[A1].PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
  , SkipBlanks:=False, Transpose:=False
  Application.CutCopyMode = False
  A = .UsedRange.Rows.Count
  For i = 2 To A
    .Range("U" & i).Value = .Range("G" & i).Value + 1
  Next i
End With
回復 11# n7822123

喔~ 那我知道了  按鈕在哪一頁,按下按鈕的時候,那一頁就是Activate了
任何指令或是省了 "前面地址" 的寫法,都是針對這一頁面在動作

所以如果三個SHEET,分別是【功能區】、【結果區】、【輸出區】
很多按鈕功能都是寫在【功能區】的話

我只要寫
Range("A1:B5").select  ==>> 【功能區】的A1~B5會被選取

如果想要針對另外兩個頁面去做處理
我就必須先寫WITH

With Sheets("結果區")
.Range("A1:B5").select    ==>>  【結果區】的A1~B5會被選取    前面要加"點",才是針對With的Sheet來動作

那來個測試
如果程式如下的話
Range("A1:B5").select

With Sheets("結果區")
.Range("A1:B5").select
End with

With Sheets("輸出區")
.Range("A1:B5").select
End with

果然就會乖乖的去選取各Sheet選取該對應的區塊
【功能區】的A1~B5會被選取
再來是
【結果區】的A1~B5會被選取
再來是
【輸出區】的A1~B5會被選取

原來有點 跟沒有點  還有WITH  是這樣用得喔
我會了  YA~ 感謝大大教學~




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