返回列表 上一主題 發帖

是否有人可協助開發 ?

回復 1# oliwa


    各位說的都沒錯 , 錄製也有試過 , 但整合起來就是不能正常運作 ,
    網上有不少範例 , 但COPY來COPY去就是無法正運作 , 因為參數引用不同自然無法連貫使用 ,
    有些語法有說明 , 有些沒有 , 自然是看不懂 , 叫好再繼續看範例找解說了 .....

TOP

本帖最後由 lpk187 於 2015-3-29 22:19 編輯

回復 11# oliwa

oliwa 不用恢心!其實大家不是不幫你,而是你自己要一步一步去訂目標然後去完成你的目標,畢竟以後你寫的程式必須你自已去維護所以就算別人寫給你的程式如果達不到你的目標那時怎麼辦?
VBA是程式碼,所以COPY來COPY去,若沒修改你所需要的再怎麼COPY也沒用,我來先開個頭來說你的目標好了

新增
        A)按下後新增一列 , 跳出視窗輸入公司代號 , 檢查是否已存在對應此代號的Sheet
        B)複製Form Sheet , 及更名為該公司代號為Sheet名


上面的"新增"你是要利用你上傳檔案的儲存格或者是利用一個按鈕來表示?兩者所寫的代碼會有些許的不同,但利用儲存格則會留下缺點(必須跳出那一格後再點選那個儲存格)
利用"儲存格"方式大約可以這麼寫,""你必須了解每一條式子的意義才行""
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  '此事件是當你選取某個儲存格後發生
If Target.Address = Cells(Target.Row, "A").Address Then'下面判斷是先在"A欄"尋找有"新增"字樣的儲存格
    If Target = "新增" Then
        msg = MsgBox("是否新增一筆資料", 4)
        If msg = vbNo Then End         '判斷若按下右按鈕後則離開程式
        inp = InputBox("請輸入代號", "新增") '跳出視窗輸入公司代號
        '以下是你要的目標代碼
        '代碼(下次再演練)
        '''''''''''''''''''''''''''''''''''''''''''''''''
    End If
End If
End Sub
以上是部份代碼,你可以利用"F9"鍵來中斷第一個"IF",再利用"F8"鍵來逐行執行,你會很容易的了解程式的運作過程
以後的代碼我們再慢慢的來討論
1

評分人數

    • GBKEE: 精品文章金錢 + 4

TOP

回復 12# lpk187


    收到 , 我試玩玩看這組 .....

TOP

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Cells(Target.Row, "J").Address Then
    If Target.Select Then
       MsgBox "Hello !"
      
    End If
End If
End Sub

感謝協助 , 我改成如此的方式來運作 , 點選該該儲存格後即出現 MsgBox , 感謝 ...
用 MsgBox 改成 Call Sub , 即可達成選說即執行的動作了 ,

那請問 , 在點選後要取得該列某儲存格內容 , 是否可以用 Cells(Target.Row,1).Value ?

TOP

回復 14# oliwa

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = .Address Then
    If Target.Select Then''''''''''這一個 IF...End If 是不必要的,只要第一個IF就可以達成你要的MsgBox的結果
       MsgBox "Hello !"
      
    End If
End If
End Sub
另Cells(Target.Row,1).Value    是可以讀取該儲存格的值,而且  .Value 是可以省略的

TOP

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    LastRow = Sheets("List").Cells(1, "A").End(xlDown).Row
    If Target.Row < LastRow + 1 And Target.Row > 1 Then
        If Target.Address = Cells(Target.Row, "J").Address Then
            If Target.Select Then
                Id_Comp = Cells(Target.Row, "A").Value
                Id_Year = Cells(Target.Row, "D").Value
                MsgBox Id_Comp & Id_Year
            End If
        End If
    End If
End Sub

用 lpk187 的例子 + 說明後 , 試完如上的內容 , 可以達成按下某儲存格後即呼叫的動作 , 感謝 .......

TOP

回復 16# oliwa

寫VBA本來就是要練習,而且要多看說明,
說實在的我並不是高手,只是自己公司有用到VBA去做進銷存,所以會的其實也不多!
我們再來以下的說明
新增
        A)按下後新增一列 , 跳出視窗輸入公司代號 , 檢查是否已存在對應此代號的Sheet
        B)複製Form Sheet , 及更名為該公司代號為Sheet名
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. If Target.Address = Cells(Target.Row, "A").Address Then
  3.     If Target = "新增" Then
  4.         msg = MsgBox("是否新增一筆資料", 4)
  5.         If msg = vbNo Then End
  6.         inp = InputBox("請輸入代號", "新增")
  7.         If inp = "" Then End
  8.         For Each sh In Sheets ' 找尋所有工作表
  9.             If sh.Name = inp Then '如果有工作表名稱相同的,就結束此程序
  10.                 MsgBox "已有此代號存在,請重新輸入"
  11.                 End '結束 Sub
  12.             End If
  13.         Next
  14.         Sheets("From").Copy Before:=Sheets(2) '複製From工作表放在第2個位置
  15.         Sheets("From (2)").Name = inp '工作表各稱更改為InputBox輸入的代號
  16.         Sheets("List").Select
  17.         Rows(Target.Row).Insert '上面 For...Next 若沒找到InputBox相同代號則在"新增"的這個儲存格新增一列
  18.         Cells(Target.Row - 1, "A") = inp '新增一則後,在A欄的新增出來的儲存格其為InputBox輸入的代號
  19.     End If
  20. End If
  21. End Sub
複製代碼

TOP

回復 17# lpk187


    收到 , 我來玩玩看 ..............

TOP

謝謝 lkp187 的例子 , 我瞭解新增部分的語法了 , 感恩 ....
轉Web資料 , 經由錄製方式後也瞭解及運用 ,
目前讀取資料時 ,
I :
Offset(A1, Match("應收帳款淨額", Range("A2:A2000"), 0), 2)
Offset(A1, Match("應收帳款淨額", "A2:A2000", 0), 2)
Offset(A1, Match("應收帳款淨額", Range("A2:A2000"), 0), 2)
Offset(A1, Match("應收帳款淨額", "$A$2:$A$2000, 0), 2)
以上語法都說錯 , 不知如何修改 ?
不然就是說 Match 沒有定義 ??

II:
看網路介紹 Match 用法時 , 有提到資料要先排序 , 但 Web轉出來的資料 , 沒有排序 , 還有空行 , 也有相關欄位名稱 , 但前面一個四空格 , 另一個五格 ,
這種資料要如何下語法 , 才能正確比對出正確資料後回傳 ?

TOP

回復 19# oliwa


    借用工作表函數必須要加上Application.WorksheetFunction或簡寫Application
例如Application.Offset(A1, Application.Match("應收帳款淨額", Range("A2:A2000"), 0), 2)

另外,工作表函數在 Visual Basic 中並不是很好用,用程式碼來表示有時會比工作表函數還要好用的多!

TOP

        靜思自在 : 並非有錢魷是快樂,問心無愧心最安。
返回列表 上一主題