Board logo

標題: [發問] 求助建立迴圈應用 [打印本頁]

作者: linsurvey2005    時間: 2011-6-3 21:50     標題: 求助建立迴圈應用

以下程式碼是我執行單次的方法是正常執行的
可是當資料範圍在不同sheet就麻煩了
因為我指定了位址Range("A3").Select給他
想要讓資料有一直圈選往後增加
一直到按取消然後繼續執行後面程式
若能指正程式的碼編方式 我會更高興~多學一招會更好睡覺~^.^

Sub test()
    Dim mtstr As String
    myStr = "選取資料OK後按確定鍵"
    On Error Resume Next
    Set k = Application.InputBox(myStr, Type:=8)  'data範圍
    p = k.Copy
    Workbooks.Add     '開啟新活頁簿
    Range("A3").Select '指定儲存格
    ActiveSheet.Paste  '貼上資料
    If Err Then
          Err.Clear
    Exit Sub
    End If
End Sub
作者: Hsieh    時間: 2011-6-4 00:53

  1. Sub test()
  2.     Dim mtstr As String, Wb As Workbook
  3.     On Error Resume Next
  4.     myStr = "選取資料OK後按確定鍵"
  5.     Set k = Application.InputBox(myStr, Type:=8)  'data範圍
  6.     If Err Then Exit Sub
  7.     Set Wb = Workbooks.Add    '開啟新活頁簿
  8.     ThisWorkbook.Activate
  9.     k.Copy Wb.ActiveSheet.[A3]
  10.     Set k = Nothing
  11.     Do Until Err.Number <> 0
  12.       Set k = Application.InputBox(myStr, Type:=8) 'data範圍
  13.       k.Copy Wb.ActiveSheet.[A65536].End(xlUp).Offset(1, 0) '指定儲存格 貼上資料
  14.       Set k = Nothing
  15.     Loop
  16. End Sub
複製代碼

作者: linsurvey2005    時間: 2011-6-4 11:26

謝謝老師回復,再進一步請教老師
我這樣增加行列上去會影響程式的運作嗎?(我跑起來還好只是想了解觀念)
還有我可以在第一次選取資料時就一起顯示"如果要繼續選取請按[繼續]鍵"嗎?
感覺我這樣好像又多一次動作
請老師幫我指正

    Do Until Err.Number <> 0
     Dim Msg1, Style, Response, MyString
      Style = vbYesNo
      Msg1 = "是 / 否 繼續選取資料"
      Response = MsgBox(Msg1, Style)
        If Response = vbYes Then    ' 若使用者按下 [是]。
      Set k = Application.InputBox(myStr, Type:=8) 'data範圍
      k.Copy Wb.ActiveSheet.[A65536].End(xlUp).Offset(1, 0) '指定儲存格 貼上資料
      Set k = Nothing
            Else
             Exit Do    ' 產生相對回應。
        End If
      Loop
作者: Hsieh    時間: 2011-6-4 11:50

本帖最後由 Hsieh 於 2011-6-4 11:53 編輯
  1. Sub test()
  2.     Dim mtstr As String, Wb As Workbook
  3.     On Error Resume Next
  4.     myStr = "選取資料OK後按確定鍵"
  5.     Set k = Application.InputBox(myStr, Type:=8)  'data範圍
  6.     If Err Then Exit Sub
  7.     Set Wb = Workbooks.Add    '開啟新活頁簿
  8.     ThisWorkbook.Activate
  9.     k.Copy Wb.ActiveSheet.[A3]
  10.     Set k = Nothing
  11.     Response = MsgBox("是否繼續", vbYesNo)
  12.     Do Until Response <> vbYes
  13.       Set k = Application.InputBox(myStr, Type:=8) 'data範圍
  14.       k.Copy Wb.ActiveSheet.[A65536].End(xlUp).Offset(1, 0) '指定儲存格 貼上資料
  15.       Set k = Nothing
  16.       Response = MsgBox("是否繼續", vbYesNo)
  17.     Loop
  18. End Sub
複製代碼

作者: linsurvey2005    時間: 2011-6-4 15:08

感謝老師的再三回覆
請教以下幾行是不是讓物件由"K"畫面(顯示狀態)帶出資料後
插入新活頁簿(隱藏狀態),這樣是提高作業效率的一種嗎?
另外對"K"物件釋放,是不是防止資料多 電腦會卡卡的.
不好意思問題比山高~^.^
Set Wb = Workbooks.Add    '開啟新活頁簿
ThisWorkbook.Activate
k.Copy Wb.ActiveSheet.[A3]
Set k = Nothing

作者: Hsieh    時間: 2011-6-4 16:24

當新的活頁簿開啟時,作用中活頁簿會指向該新增的活頁簿
ThisWorkbook.Activate
確保作用中活頁簿會是程式碼所在之活頁簿
此時新活頁簿仍然是顯示的,只是顯示在下一層視窗

Set k = Nothing
在這邊是必須的,當對話框選擇動作會造成程式出錯時
因前面的On Error Resume Next會讓程序繼續執行,若不釋放k物件
程式在結束時可能會多貼一次未釋放的k物件
作者: linsurvey2005    時間: 2011-6-4 23:32

感謝老師不吝指導,它山之法
我再次增加了開檔行列
繼續選取資料就顯示到選取的活頁簿
如果結束選取就顯示到新的活頁簿
因巨集是在另外一個Excel檔案建立(程式檔.xls)
最主要是希望運作時不要編輯到(程式檔.xls)
但是新增部分就是不會顯示到"新活頁簿"
請老師幫忙指導

Sub testopen()
    F = Application.GetOpenFilename("Excel 檔案(*.xls),*.xls")
    If F = "False" Then Exit Sub
        Workbooks.Open filename:=F
            y = ActiveWorkbook.Name
        
    Dim mtstr As String, Wb As Workbook
    On Error Resume Next
        myStr = "選取資料OK後按確定鍵"
    Set k = Application.InputBox(myStr, Type:=8)  'data範圍
    If Err Then Exit Sub
        Set Wb = Workbooks.Add    '開啟新活頁簿
            ThisWorkbook.Activate
                Wb = ActiveWorkbook.Name            
            k.Copy Wb.ActiveSheet.[A3]
        Set k = Nothing
        Response = MsgBox("是 / 否繼續選取", vbYesNo)
    Do Until Response <> vbYes
Windows(y).Activate        
       Set k = Application.InputBox(myStr, Type:=8) 'data範圍
            k.Copy Wb.ActiveSheet.[A65536].End(xlUp).Offset(1, 0) '指定儲存格 貼上資料
        Set k = Nothing
            Response = MsgBox("是 / 否繼續選取", vbYesNo)
    Loop
   
    Application.DisplayAlerts = False
        Windows(y).Close
    Application.DisplayAlerts = True
    Application.ScreenUpdating = False

Windows(Wb).Activate  
.........
.......
....
作者: linsurvey2005    時間: 2011-6-5 20:21

老師可以再指導一下嘛?
好期待內
作者: Hsieh    時間: 2011-6-5 22:09

回復 8# linsurvey2005

已經被你打敗了
被你的說明搞的腦袋打結了
首先你只要確定你要點選是哪個檔案?
點選後複製到哪個檔案?
最簡單就是把這些檔案在開啟時用變數來儲存就能在後續動作指定到正確檔案
再用迴圈來開啟點選窗格(inputbox),與繼續與否的對話(msgbox)
清楚了解你想要的動作順序就能完成  
因為之前的語法已經包含了開啟新檔,將檔案指定給物件變數,  迴圈點選複製
作者: linsurvey2005    時間: 2011-6-6 09:15


拍謝~我的問題邏輯結構不夠具體造成"腦袋打結"~^.^
還是我給老師看全部的程式碼 這樣比較不會筆誤~^.^
Sub testall()
    F = Application.GetOpenFilename("Excel 檔案(*.xls),*.xls")
       If F = "False" Then Exit Sub
         Workbooks.Open filename:=F
            y = ActiveWorkbook.Name         
    Dim mtstr As String, Wb As Workbook
    On Error Resume Next
      myStr = "選取資料OK後按確定鍵"
    Set k = Application.InputBox(myStr, Type:=8)  'data範圍
         If Err Then Exit Sub
           Set Wb = Workbooks.Add    '開啟新活頁簿
    ThisWorkbook.Activate
         k.Copy Wb.ActiveSheet.[A3]
           Set k = Nothing'釋放物件
              Response = MsgBox("是 / 否繼續選取", vbYesNo)
    Do Until Response <> vbYes
        Windows(y).Activate'回到原選取檔案繼續選取
           Set k = Application.InputBox(myStr, Type:=8) 'data範圍
             k.Copy Wb.ActiveSheet.[A65536].End(xlUp).Offset(1, 0) '指定儲存格 貼上資料
           Set k = Nothing'釋放物件
             Response = MsgBox("是 / 否繼續選取", vbYesNo)
    Loop
   
    Application.DisplayAlerts = False'關閉訊息欄   
       Windows(y).Close' 關閉選取資料檔案
    Application.DisplayAlerts = True'開啟訊息欄
   
   Application.ScreenUpdating = False
        Windows(Wb).Activate '顯示到新活頁簿檔案畫面
        Windows("book1".xls).Activate   '上面那行可以寫成這樣嘛?  
Dim nX As Long, X As Long, I As Integer'以下是在新活頁簿執行
    nX = [A65536].End(xlUp).Row
    For X = nX To 4 Step -1
      For I = 1 To 3
       Rows(X).Insert
      Next
    Next
    bb = (nX - 1) * 4 - 1
    cc = 65536
    Rows(bb & ":" & cc).Clear
    Columns("n") = Columns("n").Value'只顯示表格資料
    Application.Dialogs(xlDialogSaveAs).Show (Format(Date, "yymmdd" & "-Tilt") & "-PDA" & ".xls")'另存新活頁簿檔名
   Windows("程式檔").Close'關閉巨集撰寫檔案(因為我使用巨集小按鈕指定巨集來啟動)應該是老師說的"程式檔"皆再下層執行不要顯示狀態
End Sub
以上 麻煩老師幫我指正~學無止盡,養生平性~^.^
作者: Hsieh    時間: 2011-6-6 11:06

回復 10# linsurvey2005

試試看這樣是不是你要的
  1. Sub Selection_Copy()
  2. Dim fs$, SRng, SourceWb As Workbook
  3. fs = Application.GetOpenFilename("Excel 檔案(*.xls),*.xls")
  4. Set SourceWb = Workbooks.Open(fs)
  5. k = Application.InputBox("請選取欲複製的範圍", , , , , , , 8)
  6. If TypeName(k) = "Boolean" Then SourceWb.Close 0: Exit Sub
  7. Set nwb = Workbooks.Add
  8. With nwb.Sheets(1)
  9. .Activate
  10. r = Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  11. If IsArray(k) Then
  12. .Cells(r, 1).Resize(UBound(k, 1), UBound(k, 2)) = k
  13. Else
  14. .Cells(r, 1) = k
  15. End If
  16. yn = MsgBox("是否繼續", vbYesNo): GoTo 10
  17. Do Until yn <> 6 Or TypeName(k) = "Boolean"
  18. r = Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  19. If IsArray(k) Then
  20. .Cells(r, 1).Resize(UBound(k, 1), UBound(k, 2)) = k
  21. Else
  22. .Cells(r, 1) = k
  23. End If
  24. yn = MsgBox("是否繼續", vbYesNo)
  25. 10
  26. If yn = 6 Then SourceWb.Activate: k = Application.InputBox("請選取欲複製的範圍", , , , , , , 8)
  27. Loop
  28. nwb.Activate
  29. DoEvents
  30. myfilename = Format(Date, "yymmdd") & "-Tilt-PDA.xls"
  31. Application.SendKeys myfilename, True
  32. sf = Application.GetSaveAsFilename("E:\")
  33. If sf <> False Then nwb.SaveAs sf
  34. SourceWb.Close 0
  35. End With
  36. End Sub
複製代碼

作者: linsurvey2005    時間: 2011-6-6 14:01

好讚~這種有教無淚的精神(五體投地)
程式碼的效果有如99.99純金
嚇死我了~太強了
再次詢問
If TypeName(k) = "Boolean" Then SourceWb.Close 0: Exit Sub
這句SourceWb.Close 0  是用來關掉  開啟的檔案嗎?

myfilename = Format(Date, "yymmdd") & "-Tilt-PDA.xls"
原來句子這樣子就可以了
等我積分充足我就去下載老師的"一些vba常用語法範例"
接觸VBA快2年了沒基本底子
很多東湊西湊的程式碼
該是要正面接觸的時候了
加入論壇很開心
感謝老師不吝指導
以上
作者: linsurvey2005    時間: 2013-7-2 08:33

回復 11# Hsieh


老師好
執行資料選取的時候,按ctrl+"A1:E50","G1:H50"
資料顯示合併為A1:C50,G1:H50(D1:E50的資料已被G1:H50蓋過)
我想讓資料合併為A1:E50,G1:H50
幫忙解惑
作者: GBKEE    時間: 2013-7-2 09:45

回復 12# linsurvey2005

這句SourceWb.Close 0  是用來關掉  開啟的檔案嗎?

SourceWb.Close 0 -> SourceWb.Close False ( 檔案關閉:  不儲存檔案)
SourceWb.Close 1 -> SourceWb.Close True   (檔案關閉:  儲存檔案)

回復 13# linsurvey2005

[attach]15346[/attach]
作者: linsurvey2005    時間: 2013-7-2 16:48

回復 14# GBKEE

謝謝大大小解
另有一大未解,就是 11# 程式裡面的選取資料不能使用ctrl+相對儲存格數目
作者: GBKEE    時間: 2013-7-3 07:47

回復 15# linsurvey2005
不了解你的涵義: 13# 資料顯示合併為A1:C50,G1:H50(D1:E50的資料已被G1:H50蓋過),我想讓資料合併為A1:E50,G1:H50
ctrl+相對儲存格數目 => 選取多重的範圍
修改Hsieh超版  11#的程式碼試試看
  1. Option Explicit
  2. Sub Selection_Copy()
  3.     Dim fs$, SRng As Range, SourceWb As Workbook, r As Integer, k As Range, myfilename As String
  4.     On Error Resume Next
  5.     fs = Application.GetOpenFilename("Excel 檔案(*.xls),*.xls")
  6.     Set SourceWb = Workbooks.Open(fs)
  7.     Set k = Application.InputBox("請選取欲複製的範圍", , , , , , , 8)       '物件:Range
  8.     If Err.Number <> 0 Then GoTo 10                                         '取消InputBox的輸入->k不為物件會有錯誤
  9.     With Workbooks.Add.Sheets(1)                                            '物件:新增活頁簿的第1個工作表
  10.         '新增活頁簿時,作用中的活頁簿會移到此新增活頁簿
  11.         SourceWb.Activate                                                    '作用中的活頁簿:此活頁簿
  12.         Do
  13.             For Each SRng In k.Areas                                         'Areas 集合,此集合代表多重範圍中的所有範圍
  14.                 r = Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  15.                 .Cells(r, 1).Resize(SRng.Rows.Count, SRng.Columns.Count) = SRng.Value
  16.             Next
  17.             If MsgBox("是否繼續", vbYesNo) = vbNo Then Exit Do
  18.             Set k = Application.InputBox("請選取欲複製的範圍", , , , , , , 8)
  19.             If Err.Number <> 0 Then Exit Do                                   '取消InputBox的輸入->k不為物件會有錯誤
  20.         Loop
  21.         .Activate
  22.         DoEvents
  23.         myfilename = Format(Date, "yymmdd") & "-Tilt-PDA.xls"
  24.         Application.SendKeys myfilename, True
  25.        fs = Application.GetSaveAsFilename("E:\")
  26.         If fs <> False Then .Parent.SaveAs fs
  27.         .Parent.Close 0
  28.     End With
  29. 10:
  30.     SourceWb.Close 0
  31. End Sub
複製代碼

作者: linsurvey2005    時間: 2013-7-3 21:48

回復 16# GBKEE


    大大好 無法順利選取資料 我說明一下程式碼內容

第一步驟 是先點選所要的Excel檔案
第二步驟 開始選取所要的資料(因為資料有累積值,想把第一筆 跟 第四筆 跟 第七筆資料一起選取)
第三步驟 選擇資料不足的話可以繼續進行資料選取(再次選取的資料需要堆疊到先前抓取的)
第四步驟 進行存檔

感謝有三
作者: GBKEE    時間: 2013-7-4 05:27

回復 17# linsurvey2005

[  看的一頭霧水  ]
作者: linsurvey2005    時間: 2013-7-4 08:37

回復 18# GBKEE


大大說的真是到味
我直接上傳給大大過目即可知道問題出在哪裡
檔案程式碼有添加個人的構想,感謝
作者: GBKEE    時間: 2013-7-4 10:02

回復 19# linsurvey2005
還是 [  看的一頭霧水  ],尚缺: 1.資料檔,2.完成檔(你的構想) 的範例.
作者: linsurvey2005    時間: 2013-7-4 17:16

回復 20# GBKEE


    大大好 真是抱歉馬上上傳檔案 1資料檔  2完成檔會自己產生
我要選取的資料為 a5:E68,BH5:BI68
選取完成之後將會有七列資料 放置新檔案 然後資料自動進行排序 最後儲存檔名
作者: GBKEE    時間: 2013-7-6 07:39

回復 21# linsurvey2005
再試試看
  1. Option Explicit
  2. Sub Selection_Copy()
  3.     Dim fs As String, Nwb As Workbook, SourceWb As Workbook, R As Integer, k As Range, myfilename As String
  4.     On Error GoTo 11                                                                                 '程執行式如有錯誤.到 標記12:處裡
  5.     fs = Application.GetOpenFilename("Excel 檔案(*.xls),*.xls")
  6.     If fs = "False" Then Exit Sub
  7.     Set SourceWb = Workbooks.Open(fs)
  8.     Set k = Application.InputBox("選取傾斜->墩柱編號,里程,方向及初使值,前次監測值", Type:=8)        '物件:Range:如取消InputBox的輸入->k不為物件錯誤值=1004
  9.     Set Nwb = Workbooks.Add
  10.     With Nwb.Sheets(1)                                                                              '物件:新增活頁簿的第1個工作表
  11.         '新增活頁簿時,作用中的活頁簿會移到此新增活頁簿
  12.         SourceWb.Activate                                                                           '作用中的活頁簿:此活頁簿(SourceWb)
  13.         Do
  14.             R = Application.Max(3, .Cells(.Rows.Count, 1).End(xlUp).Row + 1)
  15.             k.Copy .Cells(R, 1)                                                                     '複製所選起的的範圍
  16.             If MsgBox("是否繼續", vbYesNo) = vbNo Then Exit Do
  17.             Set k = Application.InputBox("選取傾斜->墩柱編號,里程,方向及初使值,前次監測值", Type:=8) '物件:Range:如取消InputBox的輸入->k不為物件錯誤值=1004
  18.         Loop
  19. 9:
  20.         .Activate
  21.         DoEvents
  22.         myfilename = Format(Date, "yymmdd") & "-Tilt-PDA.xls"
  23.         Application.SendKeys myfilename, True
  24.         fs = Application.GetSaveAsFilename("E:\")
  25.         If fs <> False Then .Parent.SaveAs fs
  26.         .Parent.Close 0
  27.     End With
  28. 10:
  29.     SourceWb.Close 0
  30.     Exit Sub
  31. 11:
  32.     If Err = 424 Then
  33.         If Nwb.Sheets(1).UsedRange.Rows.Count > 1 Then GoTo 9                                         '已有選擇範圍過:新增活頁簿需存檔
  34.         GoTo 10
  35.     End If
  36.     k.Select
  37.     MsgBox "所選的 " & k.Areas.Count & " 範圍:不在同一列上,列數不相等", , "不可複製!!"
  38.     Resume Next                                                                                          '回到程式碼錯誤行的下一行
  39. End Sub
複製代碼

作者: linsurvey2005    時間: 2013-7-8 17:20

回復 22# GBKEE


    謝謝大大,編修之後選取儲存格可以正常呈現,但是點選"否"出現狀況,詳圖片
(請問大大 出現狀況這一行是告訴我再選擇資料用的嗎?)




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