Board logo

標題: [發問] EXCEL 2007 VBA 在EXCEL 2010 執行出問題 [打印本頁]

作者: li_hsien    時間: 2014-4-24 14:53     標題: EXCEL 2007 VBA 在EXCEL 2010 執行出問題

請問各位大大

最近幫個客戶弄了一個巨集程式

我本身作業是用2007版EXCEL撰寫,儲存成2003可執行的版本

但到客戶端,發現是2010版的EXCEL

基本上我覺得語法應該沒使用到2010不能使用到的部分(因為都蠻單純的)

主要寫到的功能
1. 開啟要處理的來源檔案
2. 刪除來源檔中不必要的儲存格
3. 改變來源檔圖表的格式
(原本來源檔就有Chart了,只是我刪了不必要的儲存格,所以圖表會有點縮減;且須修改部分格式,像是線寬、標記的樣式等等)
4. 最後跳出處理完成的訊息視窗


客戶端開啟來源檔後,只跳出最後處理完的訊息視窗。

前半段的刪除部分及圖表部分都沒執行到@@

也沒有錯誤訊息


後來我實際用了2010版的EXCEL執行,完全跟用2007執行一樣,結果正常

不知是不是客戶公司那設定了什麼???  


想請問各位大大,這方法有沒有什麼處理方式? 還是可能需要做什麼設定???

P.S. 客戶是用英文版的2010


煩請幫忙  謝謝
作者: li_hsien    時間: 2014-4-24 20:33

小弟附個檔讓大家試試

麻煩幫我抓個問題@@

程式是0424,另一個檔案是需要匯入的檔案

我只附了第一個按鈕要開啟的檔案

第二張圖是跑完後應該出現的畫面

TKS~
[attach]18149[/attach]
[attach]18147[/attach][attach]18148[/attach]
作者: GBKEE    時間: 2014-4-25 06:20

回復 2# li_hsien
  1. Sub w_report_Click()
  2.     '-----開啟W表單-----   
  3.     Dim program_file As String, filename As String, w_file As String   
  4.     program_file = Left(ActiveWorkbook.Name, Application.Find(".", ActiveWorkbook.Name) - 1)
  5.     filename = Application.GetOpenFilename   
  6.     On Error GoTo HandleErr  '你希望程式碼有錯誤到 HandleErr
  7.      A w_file '但執行此程序,如有錯誤會回到HandleErr,你不易偵錯的
複製代碼
  1. Sub A(w_file)
  2.     Dim this_week As Integer, end_col As Integer, end_row As Integer, i As Integer, delete_col As Integer
  3.    'w_file->W1414_GF108_CP_weekly_report
  4.    'w_file 正確為 W1414_GF108_CP_weekly_report.xls
  5.     With Workbooks(w_file).Worksheets(1)  'Workbooks(w_file)才不會出錯
複製代碼

作者: li_hsien    時間: 2014-4-25 07:57

回復 3# GBKEE

版大 你說的偵錯處理

我後來有想到  哈哈

所以都把他關掉

直接讓錯誤顯示出來

以下是經客戶再次測試的結果,麻煩幫我看看,問題點都一樣@@
好像CHART的處理有問題
[attach]18155[/attach][attach]18156[/attach][attach]18157[/attach]


不過開檔案那個好像沒有問題 ,因為我檔案還是可以開啟執行耶,只是圖表跟儲存格處理有問題

而且我一直不解的是,我找了三個一樣用2010的朋友幫我測試
都一樣正確OK


不知道是不是英文版的有差異 還是需要做什麼設定@@


煩請幫我測試看看  謝謝
作者: GBKEE    時間: 2014-4-25 09:43

回復 4# li_hsien
我的是2003版,執行附檔程式碼是2003版以上版本寫的.
錯誤點都是 "不支援此屬性或方法" ,可以標出錯誤點是哪裡,看看如何解決
  1. Sub A_chart(w_file)
  2.     'Dim C As ChartObject
  3.     'Set C = Workbooks(w_file).Worksheets(1).ChartObjects("Chart 3")
  4.     With Workbooks(w_file).Worksheets(1).ChartObjects("Chart 3").Chart
  5.         '.ChartArea.Format.Line.Visible = msoFalse   '2003錯誤
  6.         .ChartArea.Border.LineStyle = msoFalse   '改成這樣對嗎?
  7.         .SizeWithWindow = True
  8.         '.ChartArea.Width = 362.5 '寬度 原1449.25      '2003錯誤
  9.         '.ChartArea.Height = 124.75  '高度 原178.75    '2003錯誤
  10.         .Parent.Width = 362.5  ' *** 這樣對嗎? ***
  11.         .Parent.Height = 124.75
  12.         
  13.         With .PlotArea
  14.             .Height = 102.148661417323 '繪圖區高度 原120.97031496063
  15.             .Width = 342.872283464567  '繪圖區寬度 原358.980866141732
  16.             .Left = 10 '繪圖區位移
  17.             .Top = 10  '繪圖區位移
  18.         End With

  19.         '圖表標題
  20.         With .ChartTitle
  21.             If IsError(Application.Find(".", Worksheets(2).Range("G2"))) = False Then
  22.                 .Text = Left(ActiveChart.ChartTitle.Text, Application.Find(" ", ActiveChart.ChartTitle.Text) - 1) _
  23.                     & "-" & Mid(Worksheets(2).Range("G2"), Application.Find(".", Worksheets(2).Range("G2"), Application.Find(".", Worksheets(2).Range("G2")) + 1) + 1, 3) _
  24.                     & " " & "wk" & Right(Worksheets(2).Range("A2"), 4) & " " & Right(ActiveChart.ChartTitle.Text, 15)
  25.             ElseIf IsError(Application.Find(".", Worksheets(2).Range("G2"))) = True Then
  26.                 .Text = Left(ActiveChart.ChartTitle.Text, Application.Find(" ", ActiveChart.ChartTitle.Text) - 1) _
  27.                     & "-" & Mid(Worksheets(2).Range("G2"), Application.Find("_", Worksheets(2).Range("G2"), Application.Find("_", Worksheets(2).Range("G2")) + 1) + 1, 3) _
  28.                     & " " & "wk" & Right(Worksheets(2).Range("A2"), 4) & " " & Right(ActiveChart.ChartTitle.Text, 15)
  29.             End If
  30.             .Font.Size = 6.5  '標題字體大小
  31.             .Font.Name = "Arial" '標題字型
  32.             .Left = 123  '標題位移
  33.         End With
  34.         With .Legend
  35.             .Position = xlLegendPositionBottom  '圖例列底部
  36.             '.Legend.Top = 300   '圖例位移
  37.             .Top = Range("A21").Top
  38.             .Font.Size = 6.5 '圖例字體大小
  39.             .Font.Name = "Arial" '圖例字型
  40.         End With
  41.         With .SeriesCollection("Yield")
  42. '            .SeriesCollection(4).Border.ColorIndex = 18 '線條顏色
  43.             .Border.Color = 5066944 '線條顏色
  44.             '.SeriesCollection("Yield").Format.Line.Weight = 1 '線條&標記寬為1
  45.             '.Format.Line 2003錯誤 ***********
  46.             .Border.Weight = 1            '.LineStyle = 0
  47.             .Border.Weight = -4138   '只改變線條
  48.             .MarkerStyle = 2  '標記菱形
  49.             .MarkerBackgroundColorIndex = 2 '標記顏色(白)
  50.             .MarkerSize = 5    '標記大小5
  51.             .MarkerForegroundColor = 5066944    '標記外框
  52.             .ApplyDataLabels  '顯示資料標籤
  53.             .DataLabels.Font.Size = 5  '上列數值字體大小
  54.             .DataLabels.Font.Name = "Arial" '上列數值字型
  55.             
  56.         End With
  57.         '.SeriesCollection("Yield").Select    '不需要
  58.        ' .SetElement (msoElementDataLabelTop) '資料標籤置上 '2003沒這選項
  59.         .Axes(xlValue, xlPrimary).AxisTitle.Font.Size = 6.5 'Y軸標題大小
  60.         .Axes(xlValue, xlPrimary).AxisTitle.Font.Name = "Arial" 'Y軸標題字型
  61.         .Axes(xlValue, xlPrimary).AxisTitle.Left = -3  'Y軸標題位移

  62.         .Axes(xlCategory).TickLabels.Font.Size = 5  'X軸字體大小
  63.         .Axes(xlCategory).TickLabels.Font.Name = "Arial"    'X軸字型
  64.         
  65.         .Axes(xlValue).TickLabels.Font.Size = 6.5  'Y軸字體大小
  66.         .Axes(xlValue).TickLabels.Font.Name = "Arial"  'Y軸字型
  67.         
  68.         .SeriesCollection("Yield").DataLabels.Font.Size = 5  '上列數值字體大小
  69.         .SeriesCollection("Yield").DataLabels.Font.Name = "Arial" '上列數值字型
  70.     End With
  71. End Sub
複製代碼

作者: li_hsien    時間: 2014-4-25 13:13

回復 5# GBKEE


謝謝版大

轉換成這樣的寫法我自己測試也OK

不過換到對方那邊還是一樣不行@@

且如果With Workbooks的方式變成有副檔名就不行了= =

可是我自己電腦測試有副檔名 沒副檔名都可以

也太奇怪了
作者: GBKEE    時間: 2014-4-25 13:22

本帖最後由 GBKEE 於 2014-4-25 13:25 編輯

回復 6# li_hsien
自己電腦測試有副檔名 沒副檔名都可以 (也是2003版嗎?,可以嗎?)
  1. 'Workbooks(program_file).Worksheets(1).w_file = ""  '2003這裡是錯誤的
  2.       w_file = ""  
複製代碼

作者: li_hsien    時間: 2014-4-25 14:42

本帖最後由 li_hsien 於 2014-4-25 14:43 編輯

回復 7# GBKEE

我環境是2007的,有無副檔名都可以

不過我給客戶(2010英文版),有加副檔名好像會錯誤


現在真不知為什麼客戶那邊2010英文版的為什麼不能執行@@

明明我用自家別台電腦(也是2010)就可以跑出圖表

給其他朋友測試也都可以

不知道是哪段程式或是設定出了問題@@
作者: GBKEE    時間: 2014-4-25 14:49

本帖最後由 GBKEE 於 2014-4-25 14:51 編輯

回復 8# li_hsien
那不好意思我只有2003版幫不上忙了.需有請2010版的幫忙.
作者: li_hsien    時間: 2014-4-25 15:03

回復 9# GBKEE


版大 沒關係

謝謝你!!!

平時已經幫忙解決了不少問題

我也學到了不少東西!!!

TKS~
作者: li_hsien    時間: 2014-4-25 20:02

回復 9# GBKEE


版大我還有一問想請教,不知能否幫忙
  1. Sub w_report_Click()

  2.     '-----開啟W表單-----
  3.    
  4.     Dim program_file As String, filename As String, w_file As String
  5.    
  6.     program_file = Left(ActiveWorkbook.Name, Application.Find(".", ActiveWorkbook.Name) - 1)
  7.     filename = Application.GetOpenFilename
  8.    
  9. '    On Error Resume Next
  10. '    On Error GoTo HandleErr

  11.     Workbooks.Open filename

  12.     w_file = Dir(filename)
  13.     Debug.Print w_file

  14.     A w_file
  15.     A_chart w_file
  16.     F w_file
  17.    
  18.     Workbooks(program_file).Worksheets(1).w_file = ""
  19.     MsgBox "DONE !!!"
  20.    
  21. '    Exit Sub
  22. '
  23. 'HandleErr:
  24. '        MsgBox "請開啟W表單。"
  25.         
  26. End Sub
複製代碼
客戶執行時發現出錯在這行
w_file = Dir(filename)
主要是用來抓開啟的檔案名稱

後來我用個儲存格放檔名讓他測試
EX:
w_file = range("A1")   ->儲存格A1來放檔名
這樣就可以了

不知是不是Dir不能使用

請問有什麼另外可以抓到檔名的方法嗎???


哦~而且最後確認
客戶用EXCEL2010英文版的,一樣要像版大說的加上副檔名才行

感謝!!!!
作者: GBKEE    時間: 2014-4-25 20:22

回復 11# li_hsien
  1. MsgBox filename   '有副檔名的
  2. 'Dir 函數 語法 Dir [(pathname[, attributes])]
  3. w_file = Dir(filename, vbNormal)  '加 attributes這參數試試看
複製代碼

作者: li_hsien    時間: 2014-4-25 22:45

回復 12# GBKEE

謝謝版大

結果客戶那邊還是不行

好像是Dir都不管用@@

結果我想到比較直觀的方法

Workbooks.Open filename
w_file = ActiveWorkbook.Name

讓來源檔開起來的時候
再接一次ActiveWorkbook.Name

雖然好像笨了點

但是可行  哈哈




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