Dùng một đoạn code cho tất cả các sub thay vì viết đi viết lại

Liên hệ QC

phuoclocvl

Thành viên thường trực
Tham gia
28/3/12
Bài viết
220
Được thích
32
Xin Chào Các Anh , Chị và các Bạn ,

Mình có 1 thắc mắc là, có cách nào viết 1 code gì đó riêng và sẽ dùng chung tất cả các sub.

Ví dụ như:

Mình muốn dùng lại cái này cho tất cả sub.
Uname = GetSetting("Mapic", "Login", "Usr")
Upass = GetSetting("Mapic", "Login", "Pw")

Trong mỗi đoạn sub đều dùng lại "Uname" và "Upass" như bên dưới:

Set Db = New Connection
Db.CursorLocation = adUseClient

If Db.State = 1 Then Db.Close
On Error GoTo loi
Db.Open "Provider =IBMDASQL.DataSource.1" & _
";Catalog Library List=JDETSTDTA" & _
";Persist Security Info=True" & _
";Force Translate=0" & _
";Data Source = WFVNPROD" & _
";User ID =" & Uname & "" & _
";Password =" & Upass

Mong nhận được sự trợ giúp của các Anh, Chị và các Bạn.
Xin cảm ơn,
 
Có hai cách. Hai cách này không tương đương nhau, cho nên không thể gọi là tuỳ chọn, sử dụng cách nào là tuỳ theo hoàn cảnh:

1. Nếu các trị đó không thay đổi trong suốt thời gian sử dụng bảng tính:
- Đặt chúng là biến toàn cục
Public UName, UPass ' ngay đầu mô đun chính
- Đặt code trong sự kiện WorkBook_Open để gán trị cho chúng
UName = ...
UPass = ...

2. Nếu các trị đó có khả năng thay đổi. Ví dụ điển hình là chúng dựa vào một trị khác.
- Đặt chúng là hàm. Code trong mô đun chính
Public Function UName()
UName = ...
End Function
Public Function UPass()
UPass = ...
End Function
 
Upvote 0
Có hai cách. Hai cách này không tương đương nhau, cho nên không thể gọi là tuỳ chọn, sử dụng cách nào là tuỳ theo hoàn cảnh:

1. Nếu các trị đó không thay đổi trong suốt thời gian sử dụng bảng tính:
- Đặt chúng là biến toàn cục
Public UName, UPass ' ngay đầu mô đun chính
- Đặt code trong sự kiện WorkBook_Open để gán trị cho chúng
UName = ...
UPass = ...

2. Nếu các trị đó có khả năng thay đổi. Ví dụ điển hình là chúng dựa vào một trị khác.
- Đặt chúng là hàm. Code trong mô đun chính
Public Function UName()
UName = ...
End Function
Public Function UPass()
UPass = ...
End Function
Xin đa tạ Bác , nhưng sao cái
Uname=""
Upass=""
trong sub hén bác, còn phải gán thêm gì nữa hong?

mình dùng cách 2:
Public Function Uname()
Uname = GetSetting("Mapic", "Login", "Usr")
End Function

Public Function Upass()
Upass = GiaiMa(GetSetting("Mapic", "Login", "Pw"))
End Function
Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Xin dẫn ra cặp macro cha & con ngõ hầu góp vui:
PHP:
Sub PhamCongCa()
Dim J As Long, W As Integer
Dim Ca As String
For J = 3 To [B3].End(xlDown).Row
    W = W + 1
    If W Mod 3 = 0 Then
        Ca = "S"
    ElseIf W Mod 3 = 1 Then
        Ca = "C"
    Else
        Ca = "T"
    End If
    ThoiGianLamViec Cells(J, "B").Value, Ca
Next J
End Sub
Mã:
Sub ThoiGianLamViec(MaNV As String, Ca As String)
Dim Col As Integer, Gio As Integer
Dim Rng As Range, sRng As Range
Col = Switch(Ca = "S", 7, Ca = "C", 9, Ca = "T", 11, Ca = "GPE.COM", 17)
Gio = Switch(Ca = "S", 7, Ca = "C", 15, Ca = "T", 23)
Set Rng = Range([c4], [c4].End(xlDown))
Set sRng = Rng.Find(MaNV, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
    Cells(sRng.Row, Col) = TimeSerial(Gio, 0, 0)
End If
End Sub
 
Upvote 0
Xin góp vui:
PHP:
Sub PhamCongCa()
Dim J As Long, W As Integer
Dim Ca As String
For J = 3 To [B3].End(xlDown).Row
    W = W + 1
    If W Mod 3 = 0 Then
        Ca = "S"
    ElseIf W Mod 3 = 1 Then
        Ca = "C"
    Else
        Ca = "T"
    End If
    ThoiGianLamViec Cells(J, "B").Value, Ca
Next J
End Sub
Mã:
Sub ThoiGianLamViec(MaNV As String, Ca As String)
Dim Col As Integer, Gio As Integer
Dim Rng As Range, sRng As Range
Col = Switch(Ca = "S", 7, Ca = "C", 9, Ca = "T", 11, Ca = "GPE.COM", 17)
Gio = Switch(Ca = "S", 7, Ca = "C", 15, Ca = "T", 23)
Set Rng = Range([c4], [c4].End(xlDown))
Set sRng = Rng.Find(MaNV, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
    Cells(sRng.Row, Col) = TimeSerial(Gio, 0, 0)
End If
End Sub
hình như nhầm topic bác kakaka
 
Upvote 0
Tiêu đề bài của bạn làm mình hiểu là như vậy!
 
Lần chỉnh sửa cuối:
Upvote 0
Tiêu đền của bạn làm mình hiểu là như vậy!
Thật Ra ý mình đơn giản là :

Thay vì mỗi đầu sub phải ghi lại

Uname = GetSetting("Mapic", "Login", "Usr") 'dòng lập đi lập lại mỗi sub
Upass = GetSetting("Mapic", "Login", "Pw") 'dòng lập đi lập lại mỗi sub

'Có cách nào ko cần bỏ dòng này ở mỗi sub mà để nó ở 1 Module nào đó nhưng bên sub khác vẫn hiểu bác. chỉ cần ghi Uname và Upass như bên dưới thôi. có cách nào xin giúp giùm nha. Xin cảm ơn

Set Db = New Connection
Db.CursorLocation = adUseClient

If Db.State = 1 Then Db.Close
On Error GoTo loi
Db.Open "Provider =IBMDASQL.DataSource.1" & _
";Catalog Library List=JDETSTDTA" & _
";Persist Security Info=True" & _
";Force Translate=0" & _
";Data Source = WFVNPROD" & _
";User ID =" & Uname & "" & _
";Password =" & Upass
 
Upvote 0
Thật Ra ý mình đơn giản là :

Thay vì mỗi đầu sub phải ghi lại

Uname = GetSetting("Mapic", "Login", "Usr") 'dòng lập đi lập lại mỗi sub
Upass = GetSetting("Mapic", "Login", "Pw") 'dòng lập đi lập lại mỗi sub

'Có cách nào ko cần bỏ dòng này ở mỗi sub mà để nó ở 1 Module nào đó nhưng bên sub khác vẫn hiểu bác. chỉ cần ghi Uname và Upass như bên dưới thôi. có cách nào xin giúp giùm nha. Xin cảm ơn

Set Db = New Connection
Db.CursorLocation = adUseClient

If Db.State = 1 Then Db.Close
On Error GoTo loi
Db.Open "Provider =IBMDASQL.DataSource.1" & _
";Catalog Library List=JDETSTDTA" & _
";Persist Security Info=True" & _
";Force Translate=0" & _
";Data Source = WFVNPROD" & _
";User ID =" & Uname & "" & _
";Password =" & Upass
Khai báo public username...
 
Upvote 0
Web KT
Back
Top Bottom