返回列表 上一主題 發帖

[發問] 關於自動貼上連結至另一個檔案並自動插入超連結

回復 22# starry1314


    不好意思,上班中,不能即時回應,也沒好好的檢查程序是否錯誤!抱歉
  1. Sub 貼上資料至_業務管理TEST自動往下貼一行()
  2. '
  3. ' 貼上資料至_業務管理 巨集

  4.     'Range("A3:P3").Copy
  5.     sht = ActiveSheet.Name
  6.     arr = Range("A3:P3")
  7.     本檔案的路徑 = ThisWorkbook.Path & "\"
  8.     本檔案的檔名 = ThisWorkbook.Name
  9.     日期 = Format([B3], "M""月")
  10.     Workbooks.Open (ThisWorkbook.Path & "\" & "客戶明細-業務專用.xlsm") '這裡的"複製的路徑"是要可以開"客戶明細-業務專用.xlsm"的路徑
  11.     Windows("客戶明細-業務專用.xlsm").Activate
  12.    
  13.     EndRow = Workbooks("客戶明細-業務專用.xlsm").Sheets("五月").Cells(Rows.Count, "B").End(xlUp).Row + 1 '所有使用中的列數+1
  14.     'Cells(EndRow, "B").PasteSpecial Paste:=xlPasteValues '原本的程序
  15.     Cells(EndRow, "B").Resize(1, UBound(arr, 2)) = Application.Transpose(Application.Transpose(arr)) '目前使用中的分頁,的最下方空白列貼上值
  16.     'ActiveSheet.Paste Link:=True
  17.     Workbooks("客戶明細-業務專用.xlsm").Activate
  18.     'ActiveSheet.Hyperlinks.Add Anchor:=Cells(EndRow, "B"), Address:=ThisWorkbook.Name, SubAddress:=sht'原本的程序
  19.    
  20.     Workbooks("客戶明細-業務專用.xlsm").Sheets("五月").Hyperlinks.Add Anchor:=Cells(EndRow, "B"), Address:=本檔案的檔名, SubAddress:=sht '變更後的 '這裡的本檔案的路徑則是這個檔案所在的路徑
  21.     Workbooks("客戶明細-業務專用.xlsm").Close True

  22. End Sub
複製代碼

TOP

回復 23# lpk187

SubAddress:=sht & "!Q2" 再修改     

TOP

回復 19# starry1314

Q1.1.Sheets("五月")<請問關於妳所說的變數
假如在個別客戶明細(Q3)做一個清單 一~十二月,那有什麼指令可以讓"五月" 去讀取那個位置變成動態呢?  cells(Q3) 這樣嗎?

回答上面這問題:
A1.之前我有做一個類似的檔案,但因為考慮使用時間的問題(不用每年的一開始就修改程式或更改檔案名稱以及很多相關的問題),所以我改用資料庫的做法,把像你月份的工作表改成只有用一個資料庫的工作表
然後再做一個可以查詢的工作表來查詢相關的目的,當然我在資料庫有放所謂年度月份的欄位,以利查詢用。
所以像Sheets("五月")做變數,則是要牽涉到使用的目的才能下方法,而我做的巨集是用工作表事件來代替你的按鈕,而且把月份的數字改成阿拉伯數字,這樣則可以用你日期欄來抓取月份來做變數例如
日期 = Format([B3], "M""月")

A2.若在Q3做清單這也是一個好方法,其變數直指它就可以如:xxx=Range("Q3") 或xxx=[Q3]<<這裡要用中括號(你檔案中的第一個巨集用小括號就不對了),又或是xxx=Cells(3,"Q"),"不是cells(Q3)"

TOP

本帖最後由 lpk187 於 2015-5-10 17:24 編輯

回復 46# starry1314


    上面stillfish00大大的程式中就有明示的寫入讀取"本檔的路徑加檔案名稱==>"ThisWorkbook.FullName
以及目前"做用中的工作表名稱"==>ThisWorkbook.ActiveSheet.Name
他的程式你若有用F8一步一步執行,再用區域變數視窗去觀察,不懂的在說明F1中都有很明確的說明,你會學到很多東西,像ThisWorkbook.FullName這句,我也是從stillfish00大大程式中學的
以你PO的這個程式碼是利用錄製的動作寫成的,其實只要你了解了從哪裡來"ThisWorkbook.FullName"然後去哪裡,很多不用寫的像錄製的程式碼那麼的煩雜的

1.以下面這句來說
Windows("出餐單(請先另存新檔).xlsm").Activate
Sheets("出餐單").Select
Range("H1:I1").Select
Selection.Copy
可以把Select、Activate和Selection拿走寫成  Workbooks("出餐單(請先另存新檔).xlsm").Sheets("出餐單").Range("H1:I1").Copy  <<<==這是來源地方

2.下面這句則是目的地方
Windows("小餐單-S.xlsm").Activate
Range("B2").Select
ActiveSheet.Paste Link:=True,因為這裡你是用ActiveSheet所以我並不知道工作表名是什麼所以假設是 Sheets("小餐單")

可以寫成  Workbooks("小餐單-S.xlsm").Sheets("小餐單").Range("B2")
把來源和目的寫在一起是
Workbooks("出餐單(請先另存新檔).xlsm").Sheets("出餐單").Range("H1:I1").Copy Workbooks("小餐單-S.xlsm").Sheets("小餐單").Range("B2")
若是用變數呢?
只能知道目前程式碼的所在檔案也就是ThisWorkbook和目前作用中的工作表ActiveSheet變數如下:

路徑檔名=ThisWorkbook.FullName <<<這個是讀取路徑和檔名的
檔名=ThisWorkbook.Name  <<<<這個只有讀取檔名,這和上面的用途不同
工作表名=ThisWorkbook.ActiveSheet.Name

我在用變數來處理這段 Workbooks("出餐單(請先另存新檔).xlsm").Sheets("出餐單").Range("H1:I1").Copy Workbooks("小餐單-S.xlsm").Sheets("小餐單").Range("B2")
就可以寫成 Workbooks(檔名).Sheets(工作表名).Range("H1:I1").Copy Workbooks("小餐單-S.xlsm").Sheets("小餐單").Range("B2")
甚至我只要把Workbooks("出餐單(請先另存新檔).xlsm").Sheets("出餐單").Range("H1:I1")的值付給 Workbooks("小餐單-S.xlsm").Sheets("小餐單").Range("B2:??")<<這裡的??我假設是C2

可以寫成 Workbooks("小餐單-S.xlsm").Sheets("小餐單").Range("B2:C2")=Workbooks("出餐單(請先另存新檔).xlsm").Sheets("出餐單").Range("H1:I1").Value

上面這2句的不同是   來源.copy  目的
                    目的 = 來源 (來源有2個以上儲存格必須加上.Value)

這樣寫的話不用Activate來Activate去的,執行的速度也會比較快,前題是2個檔案須同時開著

TOP

回復 46# starry1314

再以stillfish00大大的程式來說明ThisWorkbook.FullName的補充

    With wsTarget
        .Hyperlinks.Add Anchor:=.Cells(lTargetRow, "R"), _
                        Address:=ThisWorkbook.FullName, _
                        SubAddress:=ThisWorkbook.ActiveSheet.Name & "!" & Rows(lSourceRow).Address, _
                        TextToDisplay:=ThisWorkbook.FullName
        .Cells(lTargetRow, "R").HorizontalAlignment = xlLeft
    End With
上面程式中的 Address:=ThisWorkbook.FullName 的用途和上篇的 ThisWorkbook.Name 用途不一樣的地方
Address必須指出明確的路徑,所以必須使用 ThisWorkbook.FullName
若是使用 ThisWorkbook.Name 則必須加前面加上路徑 ,例如"D:\資料夾\" & ThisWorkbook.Name

TOP

回復 49# starry1314


    我先回複這問題
Sheets("快速輸入").Select"  '因為這裡已選取Sheets("快速輸入")這個工作表所以下面不能這樣寫,ThisWorkbook.Sheets("出餐單")是程式碼所在的地方,除非你的程式碼是放在.ThisWorkbook.Sheets("出餐單")這個工作表否則不能這樣寫
    Workbooks("小餐單-S.xlsx").Sheets("快速輸入").Range("B2") = ThisWorkbook.Sheets("出餐單").Range("H1:I1").Value
我假設你的程式碼放在ThisWorkbook.Sheets("出餐單")這裡,而你先又做了Sheets("快速輸入").Select,你的程式可以簡寫成   Range("B2") = ThisWorkbook.Sheets("出餐單").Range("H1:I1").Value
若是沒做Sheets("快速輸入").Select選取的話,也就是畫面是停留在ThisWorkbook.Sheets("出餐單")這個工作表中則可以簡寫成Workbooks("小餐單-S.xlsx").Sheets("快速輸入").Range("B2") =.Range("H1:I1").Value

TOP

回復 50# starry1314


    版主出來回複了。不過我再補充一下你因為不知道你所輸入的值是否對錯可以用變數來觀看
也是說,以Workbooks("小餐單-S.xlsx").Sheets("快速輸入").Range("B2") = ThisWorkbook.Sheets("出餐單").Range("H1:I1").Value來說
可以用
AA=ThisWorkbook.Sheets("出餐單").Range("H1:I1").Value'來看你的程式碼是右有輸入錯誤再列下面這行
你可以在區域變數視窗中明白的看出AA這個變數的變化了
Workbooks("小餐單-S.xlsx").Sheets("快速輸入").Range("B2") = ThisWorkbook.Sheets("出餐單").Range("H1:I1").Value
然後再用一個變數來觀看Workbooks("小餐單-S.xlsx").Sheets("快速輸入").Range("B2")輸入對不對依此法類推,就可以很清楚的了解怎麼來怎麼去了
還有 ThisWorkbook.Sheets("出餐單").Range("H1:I1").Value的"H1:I1"是合併儲存格的話可以只用"H1就可以了例如"ThisWorkbook.Sheets("出餐單").Range("H1").Value

TOP

呵呵呵!版主大大太強了,說真的當初我沒看到
ActiveSheet.Paste Link:=True這行
還再想怎麼回starry1314這個程式碼,版主大大就出手相助,這程式碼也讓我受易良多

TOP

本帖最後由 lpk187 於 2015-5-25 09:38 編輯

回復 64# starry1314


    我不知道你原活頁簿的工作表名稱是什麼,我假設它是"出餐單"這的工作表
ThisWorkbook.Sheets("出餐單").Activate
"ThisWorkbook"是原程式所在的活頁簿

TOP

        靜思自在 : 有心就有福,有願就有力,自造福田,自得福緣。
返回列表 上一主題