返回列表 上一主題 發帖

[發問] 將資料寫入到其他多個EXCEL檔案

回復 9# lpk187
我試過了!可以但有一個地方會錯誤,第一次資料轉出可以,再按第二次他會出現下圖
AAA.jpg
  1. Sub Workbook_Open2()
  2. Dim xlPath As Variant, Ro As Integer
  3. Dim xlFilea, xlFileb, arra, arrb
  4.     xlPath = ThisWorkbook.Path & "\"
  5. xlFilea = ("B.xlsx")
  6. xlFileb = ("C.xlsx")
  7. arra = Sheets("工作表1").Range("A1:F1")
  8. arrb = Sheets("工作表1").Range("A2:F2")
  9.     Workbooks.Open (xlPath & xlFilea)
  10.     With Workbooks(xlFilea).Worksheets("工作表1")
  11.         Set da = .Columns(1).Find(arra(1, 1), , , , , 2)
  12.         If Not da Is Nothing Then GoTo 10
  13.          Ro = .Cells(65535, 1).End(xlUp).Row + 1
  14.          
  15.         .Cells(Ro, 1).Resize(UBound(arra), UBound(arra, 2)) = arra
  16.     End With
  17. 10:
  18.     Workbooks(xlFilea).Close True

  19.     Workbooks.Open (xlPath & xlFileb)
  20.     With Workbooks(xlFileb).Worksheets("工作表1")
  21.         Set da = .Columns(1).Find(arrb(1, 1), , , , , 2)
  22.         If Not da Is Nothing Then GoTo 10
  23.         Ro = .Cells(65535, 1).End(xlUp).Row + 1
  24.         .Cells(Ro, 1).Resize(UBound(arrb), UBound(arrb, 2)) = arrb
  25.     End With
  26. 20:
  27.     Workbooks(xlFileb).Close True

  28. End Sub
複製代碼
另一方面如果傳送方式變成如下圖
c.xlsx會有函數去計算數值,可以跳格傳送嗎

TOP

回復 11# mark761222

可以的話,請附上你的範例檔案上來,而且是你最終目的的範例檔,目的不同,就算只有些許的改變,可能程式都要大幅的改變,就像11樓的問題,和之前的寫法大部份會不一樣!
甚至可以的話在範例檔中請附上C欄及F欄的公式!

TOP

回復 12# lpk187


    好!我全部整理一下再跟你說,謝謝

TOP

回復 12# lpk187
我將資料整理好了

每日更新接收,黃色區塊有sub 計算數量,所以希望vba貼過去不會覆蓋,或者有什麼方法可以解決也可以,
因為傳送過去的資料,有可能會做微調,所以才希望函數不要被覆蓋掉。
共會傳送3筆資料到各個不同的工作表。
VBA資料自動傳送問題.rar (302.42 KB)

TOP

回復 14# mark761222


    有2種方式,請自行測試,選擇自己的需求,一種為有函數的儲存格就寫入函數,但鑑於有可能做微調故有第二種方式,跳過有函數的儲存格
  1. Option Explicit
  2. Sub Ex() '方式1為寫入函數
  3.     Dim xlPath As Variant, xlFile As Variant
  4.     Dim Rng As Range, Rn As Range, Ran As Range, ch As Range
  5.     Dim myCol As Integer, myRow As Integer, k As Integer
  6.     Dim xlRo As Integer
  7.     Dim arr
  8.     xlPath = ThisWorkbook.Path & "\" '讀取本程式檔的路徑
  9.     xlFile = "每日更新接收.xlsx" '讀取本程式檔名稱
  10.     With ThisWorkbook.Sheets("工作表1")
  11.         myCol = .Cells(1, Columns.Count).End(xlToLeft).Column '查詢工作表1的最後一欄位置
  12.         myRow = .Cells(Rows.Count, 1).End(xlUp).Row '查詢工作表1的最後一列位置
  13.         For Each Rng In .Range("A2", .Cells(myRow, 1)) '此迴圈做 有資料Range位置的聯集 Union
  14.             If Rng <> "" Then
  15.                 k = k + 1
  16.                 If k = 1 Then
  17.                     Set Rn = Rng
  18.                 Else
  19.                     Set Rn = Union(Rn, Rng)
  20.                 End If
  21.             End If
  22.         Next
  23.     End With
  24.     Workbooks.Open (xlPath & xlFile) '打開"每日更新接收.xlsx"活頁簿
  25.     For Each Ran In Rn
  26.         With Workbooks(xlFile).Sheets(Ran.Value)
  27.             Set ch = .Columns(1).Find(Ran.Offset(, 1), LookAt:=xlWhole, SearchDirection:=2)
  28.             '檢查日期是否有重複,當ch變數為Nothing時,則無發現重複日期,否則離開這一次的資料儲存,並執行下一個迴圈
  29.             If Not ch Is Nothing Then MsgBox Ran & "工作表中的" & ch & "資料已存在,不會儲存資料": Set ch = Nothing: GoTo 10
  30.             arr = Ran.Offset(, 1).Resize(, myCol - 1)
  31.             ''''把公式替換陣列中的值'''
  32.             arr(1, 5) = "=SUM(RC[5]:RC[13])"
  33.             arr(1, 6) = "=1-RC[-1]/RC[-2]"
  34.             arr(1, 8) = "=SUM(RC[12]:RC[18])"
  35.             arr(1, 9) = "=1-RC[-1]/RC[-2]"
  36.             arr(1, 29) = "=SUM(RC[5]:RC[10])"
  37.             arr(1, 30) = "=1-RC[-1]/RC[-2]"
  38.             arr(1, 48) = "=SUM(RC[2]:RC[11])"
  39.             arr(1, 49) = "=1-RC[-1]/RC[-2]"
  40.             ''''
  41.             xlRo = .Cells(Rows.Count, 1).End(xlUp).Row + 1
  42.             .Cells(xlRo, 1).Resize(, UBound(arr, 2)) = arr '寫入資料
  43.         End With
  44. 10:
  45.     Next
  46.     Workbooks(xlFile).Close True '關閉"每日更新接收.xlsx"活頁簿
  47. End Sub

  48. Sub Ex1() '不寫入函數跳過有函數的儲存格
  49.     Dim xlPath As Variant, xlFile As Variant
  50.     Dim Rng As Range, Rn As Range, Ran As Range, ch As Range
  51.     Dim myCol As Integer, myRow As Integer, k As Integer, I As Integer
  52.     Dim xlRo As Integer
  53.     Dim arr
  54.     xlPath = ThisWorkbook.Path & "\" '讀取本程式檔的路徑
  55.     xlFile = "每日更新接收.xlsx" '讀取本程式檔名稱
  56.     With ThisWorkbook.Sheets("工作表1")
  57.         myCol = .Cells(1, Columns.Count).End(xlToLeft).Column '查詢工作表1的最後一欄位置
  58.         myRow = .Cells(Rows.Count, 1).End(xlUp).Row '查詢工作表1的最後一列位置
  59.         For Each Rng In .Range("A2", .Cells(myRow, 1)) '此迴圈做 有資料Range位置的聯集 Union
  60.             If Rng <> "" Then
  61.                 k = k + 1
  62.                 If k = 1 Then
  63.                     Set Rn = Rng
  64.                 Else
  65.                     Set Rn = Union(Rn, Rng)
  66.                 End If
  67.             End If
  68.         Next
  69.     End With
  70.     Workbooks.Open (xlPath & xlFile) '打開"每日更新接收.xlsx"活頁簿
  71.     For Each Ran In Rn
  72.         With Workbooks(xlFile).Sheets(Ran.Value)
  73.             Set ch = .Columns(1).Find(Ran.Offset(, 1), LookAt:=xlWhole, SearchDirection:=2)
  74.             '檢查日期是否有重複,當ch變數為Nothing時,則無發現重複日期,否則離開這一次的資料儲存,並執行下一個迴圈
  75.             If Not ch Is Nothing Then MsgBox Ran & "工作表中的" & ch & "資料已存在,不會儲存資料": Set ch = Nothing: GoTo 20
  76.             xlRo = .Cells(Rows.Count, 1).End(xlUp).Row + 1
  77.             For I = 1 To myCol - 1
  78.                 If I = 5 Or I = 6 Or I = 8 Or I = 9 Or I = 29 Or I = 30 Or I = 48 Or I = 49 Then GoTo 10 '不寫入函數跳過有函數的儲存格
  79.                 .Cells(xlRo, I) = Ran.Offset(, I)
  80. 10:
  81.             Next
  82.         End With
  83. 20:
  84.     Next
  85.     Workbooks(xlFile).Close True '關閉"每日更新接收.xlsx"活頁簿
  86. End Sub
複製代碼

TOP

回復 15# lpk187


謝謝! 順利運作,但是幾乎看不懂,不知道他的邏輯怎麼去判斷取得整個資料丟到工作表1 、2 、3   程度差太多了@_@

本來想自己改完套用到另一個工作表,看來有些難度,希望等我整理完資料完,能在幫我解答,謝謝

TOP

回復 16# mark761222

我以下圖來解釋 程式,更詳細的方法,你可以利用 F8逐行來執行程式,並利用區域變數數視窗來觀看程式 怎麼走的

   

TOP

回復 17# lpk187

檔案匯出.rar (701.29 KB)

如果 T與B跟C的 不會複製的地方不一樣 ,還有將檔案分至2個excel怎麼更改呢?,如附件
有三個檔案跟上一次不一樣,如果多一個excel,還有TB位子不同。
看了你的教學,我頂多只能把它分成2個工作表去跑,如果整合在一起,怎麼讓他去判別呢

TOP

回復 18# mark761222


    如果 T與B跟C的 不會複製的地方不一樣 ,還有將檔案分至2個excel怎麼更改呢?
不會複製的地方,我該怎麼樣去判斷?位置?顏色?完全沒有規則!
匯出資料工作表中,有好幾個Tabl,位置會不會不同?該怎麼電腦去判別它的啟始位置?它未來的位置會和附件一樣?
再來是合併儲存格,VBA判別資料,若遇到合併儲存格,最容易出錯了。

看了你的附件,如果整合在一起,坦白說很難!
至於,要分多個檔案,或多個工作表不是難事,難的是要匯出的資料,完全沒有系統性的規劃!

TOP

回復 19# lpk187

抱歉我可能說明的不夠詳細,我將檔案重新整理用顏色分開了
附件中有EXCEL檔案與圖片說明

黃色區塊跳開不複製過去,因為有函數不希望覆蓋
資料彙整那部分,儲存格是不會變動的,所以從那邊發出數據給各個excle的工作表,如果前面日期相同不寫入

不知道這樣夠不夠清除,如果哪裡不懂再跟我講
謝謝

圖片說明.rar (847.13 KB)
檔案匯出.rar (749.76 KB)

TOP

        靜思自在 : 做好事不能少我一人,做壞事不能多我一人。
返回列表 上一主題