返回列表 上一主題 發帖

[發問] 兩個獨立EXCEL 如何將運算完的資料回傳到主Excel?

本帖最後由 GBKEE 於 2019-3-14 10:20 編輯

回復 10# 502243
你只用圖片說明,但如再能加上範例檔祥加說明一切狀況,
回覆者會貼切的回答  


你疑惑<===E.Range("d1")  為何是用E?而不是用Ap.Workbooks("c").Sheets(1)
A的資料 不是要貼上C 的A欄 嗎?
Set Rng = Ap.Workbooks(1).Sheets(1).Range("A1") '指名C檔下
篩選[A欄]>5 取的 C 的D欄 的資料  >>不就  E.Range("d1")

你疑惑  If AR <> "" Then '有資料    <====AR最上面不是已經清空為0了??
這裡啊******
For Each E In Rng
        '大於5 寫上D欄的值  **有
        If E > 5 Then AR = AR & "," & E.Range("d1")
    Next
***********
xApp.App.Quit   或   Ap.Quit      都可


回復 14# 502243
不同excel.exe  間 的物件 無法用Copy
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

假若拿Sub Ex_newexce1()出來修改一下..
只是單純的複製貼上

Sub Ex_newexce2()
     Dim AR As Variant, Rng(1 To 2) As Range, E As Range

      With Workbooks("a").Sheets(1)
          Set Rng(1) = .Range(“A1”, .Range(“A1”).End(xlDown))   ‘同excel.exe 可以成功
          Set Rng(2) = Workbooks(“a”).Sheets(1).Range(“c1”)       ‘A檔A欄copy A檔C欄      
           Rng(1).Copy Rng(2)
      End With
   
End Sub


Sub Ex_newexce3()
     Dim AR As Variant, Rng(1 To 2) As Range, E As Range

      With Workbooks("a").Sheets(1)
          Set Rng(1) = .Range(“A1”, .Range(“A1”).End(xlDown)) ‘不同excel.exe  會失敗
          Set Rng(2) = Ap.Workbooks(“c”).Sheets(1).Range(“c1”) ‘‘A檔A欄copy C檔C欄
           Rng(1).Copy Rng(2)
      End With
   
End Sub

小弟還在思索著錯誤的原因....

TOP

回復 12# zheng211016
差在多一個excel.exe的物件控制..就麻煩了點...網路上探討的好像並不多
也或者是我的查詢時關鍵字沒查到..
不過還是感謝各位前輩的指點協助

TOP

回復 3# 502243


   所以我的檔案有回答到你的問題?

TOP

回復 8# Scott090
    感謝前輩的回應
類似那樣呼叫但又不大一樣.....差在跨層呼叫
第一條參考我試過.可行
第二條我會在試看看

目前朝Application物件那方面嘗試..也就是.GBKEE大大給的參考下去研究

TOP

回復 9# GBKEE

請教GBKEE大大:
剛看了幾個小時在一行一行測試..
有幾個地方不太明白
1.
    For Each E In Rng
            '大於5 寫上D欄的值
            If E > 5 Then AR = AR & "," & E.Range("d1")      <===E.Range("d1")  為何是用E?而不是用Ap.Workbooks("c").Sheets(1)...這段看不大明白
        Next
        
        Set Rng = Ap.Workbooks("1").Sheets(1).Range("C:C")   '
        Rng = ""
        If AR <> "" Then '有資料    <====AR最上面不是已經清空為0了??
            AR = Split(Mid(AR, 2), ",")   '分割      
            Rng(1).Resize(UBound(AR)) = Application.WorksheetFunction.Transpose(AR)
            'B檔-->'大於5 寫上D欄的值 **寫在A檔C欄
        End If


2.跑的時候C.xlsm檔案A欄有複製到值..但D欄還是一樣空空的...而且不會copy回A.xlsm ...C欄
3.另外請問GBKEE大大如果想關閉新開的excel.exe這個物件...當下應該用甚麼指令才行呢?   xApp.App.Quit     ' Ap.Quit      ' Ap.Close <==這幾個我試好像都不行

TOP

本帖最後由 GBKEE 於 2019-3-13 14:15 編輯

回復 7# 502243
試試看
  1. '****A.xlsm 裡面
  2. '**物件類別模組 Class1 的程式碼
  3. Option Explicit
  4. Public WithEvents App  As Application
  5. Property Set T_APP(p As Application)
  6.     Set App = p     '物件類別 導入物件
  7.     App.Visible = True
  8. End Property
複製代碼
  1. 'A.xlsm
  2. '一般 Module1 的程式碼
  3. Option Explicit
  4. Public xApp As New Class1
  5. Public Ap As Object
  6. Private Sub Ex_開始()
  7.     Set Ap = New Application
  8.     Set xApp.T_APP = Ap
  9.     Ap.Workbooks.Open (ThisWorkbook.Path & "\C.XLSM")
  10.                       '** 請修正為正確檔案名稱***
  11. End Sub
  12. Sub Ex_newexcel()
  13.     Dim AR As Variant, Rng As Range, E As Range
  14.     With ThisWorkbook.Sheets(1)  '指名A檔下
  15.         Set Rng = .Range("A1", .Range("A1").End(xlDown))
  16.     End With
  17.     AR = Rng.Value  'A檔下的數值
  18.     Set Rng = Ap.Workbooks(1).Sheets(1).Range("A1") '指名C檔下
  19.     Rng.EntireColumn = ""
  20.     Set Rng = Rng.Resize(UBound(AR))
  21.     Rng.Value = AR  'A檔下的數值貼在B檔上
  22.     AR = ""           'AR 清空
  23.     For Each E In Rng
  24.         '大於5 寫上D欄的值
  25.         If E > 5 Then AR = AR & "," & E.Range("d1")
  26.     Next
  27.     Set Rng = ThisWorkbook.Sheets(1).Range("C:C")   '
  28.     Rng = ""
  29.     If AR <> "" Then
  30.         AR = Split(Mid(AR, 2), ",")
  31.         Rng(1).Resize(UBound(AR)) = Application.WorksheetFunction.Transpose(AR)
  32.         'B檔-->'大於5 寫上D欄的值 **寫在A檔C欄
  33.     End If
  34. End Sub

  35. Private Sub Ex_結束()
  36.     Ap.Workbooks(1).Close False
  37.     xApp.App.Visible = False
  38. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 7# 502243


    所以版主的訴求是  A  專案程式碼 呼叫 C 專案內的 程式 碼?
     可以參考 本論壇:
            http://forum.twbts.com/thread-5960-1-1.html
                         如何用巨集呼叫巨集
                         呼叫不同專案的程序   Run "123.XLS!A01.MAIN"

     或,其他網址
               https://samlifebox.blogspot.com/2015/02/macro-macro.html
                         Excel 之 macro 呼叫 macro

       A、C 是不同的Excel.Application物件,改一改也許可行

TOP

回復 6# Scott090

剛好相反耶…相關的流程圖如新圖所示….

A.xlsm 裡面的程式碼應該只會有:
開始鈕
Sub newexcel()
Dim xlapp As Object
        Set xlapp = CreateObject("Excel.Application") '建立一個新的excel程式
        Set xlbook = xlapp.Workbooks.Open("D:\Excel VBA\c.xlsm") '用excel開啟活頁簿
            xlapp.Visible = True 'excel可以看見
   '''''''''' '後面還在撰寫中
         
End Sub

結束鈕
Sub newexcelclose()


C.xlsm裡面的程式碼:
接收A.xlsm裡面資料
處理資料
回傳資料到A

只是運算與回傳的程式碼的部分
我還在構思要寫在哪個裡面比較洽當….

TOP

回復 5# 502243


         澄清確認一下:
        Sub newexcel() 這一段程序碼是寫在 Excel2Application.C.xlsm
         叫入 Excel1Application.A.xlsm,然後要到 A.xlsm 執行在A.xlsm 裡面的程式碼( 如按鈕在 A 工作表),
        用 A 的 程式碼 把 A 的資料拿到 C 工作表去處理、處理完的資料拿回 A。
         流程回到 C.xlsm 把 A.xlsm 關閉。
         A、C  是2個獨立的物件。

         是這樣嗎?

TOP

        靜思自在 : 吃苦了苦、苦盡廿來,享福了福、福盡悲來。
返回列表 上一主題