Hỏi nhanh - Đáp nhanh về macro (dành cho các thành viên mới học lập trình)

Liên hệ QC

tuananhya2

Thành viên mới
Tham gia
18/8/12
Bài viết
8
Được thích
0
Co ai chỉ dùm cách tạo pass marco với
 
Ở đây em muốn học VBA để phục vụ cho công việc của mình tuy nhiên khi xử lý chương trình của mình cho phù hợp ở Sheet(BIEU) là em có cột X là mã Loại đất và khi lấy dữ liệu bên cột MDSD Sheet(DATA) thì em phải khai báo thêm nhiều biến quá
Mã:
Cap_GCN1 = .[X5].Value: Cap_GCN2 = .[X6].Value: Cap_GCN3 = .[X7].Value: Cap_GCN4 = .[X8].Value: Cap_GCN5 = .[X9].Value: Cap_GCN6 = .[X10].Value .......

Và phải dùng nhiều lệnh If... Else... giờ em muốn các anh chị giúp là có cách nào truy xuất theo mảng để rút ngắn lài phần Code này của em không ạ
Mã:
If sArr(N, 5) = "LUC" Then
                dArr(K, 5) = Cap_GCN1
            ElseIf sArr(N, 5) = "LUK" Then
                dArr(K, 5) = Cap_GCN1
            ElseIf sArr(N, 5) = "LUN" Then
                dArr(K, 5) = Cap_GCN1
            ElseIf sArr(N, 5) = "COC" Then
                dArr(K, 5) = Cap_GCN2
            ElseIf sArr(N, 5) = "BHK" Then
                dArr(K, 5) = Cap_GCN3
            ElseIf sArr(N, 5) = "NHK" Then
                dArr(K, 5) = Cap_GCN3
            ElseIf sArr(N, 5) = "LNC" Then
                dArr(K, 5) = Cap_GCN4
            ElseIf sArr(N, 5) = "LNQ" Then
                dArr(K, 5) = Cap_GCN4
            ElseIf sArr(N, 5) = "LNk" Then
                dArr(K, 5) = Cap_GCN4
            ElseIf sArr(N, 5) = "TSL" Then
                dArr(K, 5) = Cap_GCN5
            ElseIf sArr(N, 5) = "TSN" Then
                dArr(K, 5) = Cap_GCN5
            ElseIf sArr(N, 5) = "LMU" Then
                dArr(K, 5) = Cap_GCN6
            ElseIf sArr(N, 5) = "NKH" Then
                dArr(K, 5) = Cap_GCN7
            ElseIf sArr(N, 5) = "RSN" Then
                dArr(K, 5) = Cap_GCN8
            ElseIf sArr(N, 5) = "RST" Then
                dArr(K, 5) = Cap_GCN8
            ElseIf sArr(N, 5) = "RSK" Then
                dArr(K, 5) = Cap_GCN8
            ElseIf sArr(N, 5) = "RSM" Then
                dArr(K, 5) = Cap_GCN8
            ElseIf sArr(N, 5) = "RPN" Then
                dArr(K, 5) = Cap_GCN9
            ElseIf sArr(N, 5) = "RPT" Then
                dArr(K, 5) = Cap_GCN9
            ElseIf sArr(N, 5) = "RPK" Then
                dArr(K, 5) = Cap_GCN9
            ElseIf sArr(N, 5) = "RPM" Then
                dArr(K, 5) = Cap_GCN9
            ElseIf sArr(N, 5) = "RDN" Then
                dArr(K, 5) = Cap_GCN10
            ElseIf sArr(N, 5) = "RDT" Then
                dArr(K, 5) = Cap_GCN10
            ElseIf sArr(N, 5) = "RDK" Then
                dArr(K, 5) = Cap_GCN10
            ElseIf sArr(N, 5) = "RDM" Then
                dArr(K, 5) = Cap_GCN10
            ElseIf sArr(N, 5) = "ONT" Then
                dArr(K, 5) = Cap_GCN11
            ElseIf sArr(N, 5) = "ODT" Then
                dArr(K, 5) = Cap_GCN12
            ElseIf sArr(N, 5) = "TSC" Then
                dArr(K, 5) = Cap_GCN13
            ElseIf sArr(N, 5) = "TSK" Then
                dArr(K, 5) = Cap_GCN14
            ElseIf sArr(N, 5) = "CQP" Then
                dArr(K, 5) = Cap_GCN15
            ElseIf sArr(N, 5) = "CAN" Then
                dArr(K, 5) = Cap_GCN16
            ElseIf sArr(N, 5) = "SKK" Then
                dArr(K, 5) = Cap_GCN17
            ElseIf sArr(N, 5) = "SKC" Then
                dArr(K, 5) = Cap_GCN18
            ElseIf sArr(N, 5) = "SKS" Then
                dArr(K, 5) = Cap_GCN19
            ElseIf sArr(N, 5) = "SKX" Then
                dArr(K, 5) = Cap_GCN20
            ElseIf sArr(N, 5) = "DGT" Then
                dArr(K, 5) = Cap_GCN21
            ElseIf sArr(N, 5) = "DTL" Then
                dArr(K, 5) = Cap_GCN22
            ElseIf sArr(N, 5) = "DNL" Then
                dArr(K, 5) = Cap_GCN23
            ElseIf sArr(N, 5) = "DBV" Then
                dArr(K, 5) = Cap_GCN24
            ElseIf sArr(N, 5) = "DVH" Then
                dArr(K, 5) = Cap_GCN25
            ElseIf sArr(N, 5) = "DYT" Then
                dArr(K, 5) = Cap_GCN26
            ElseIf sArr(N, 5) = "DGD" Then
                dArr(K, 5) = Cap_GCN27
            ElseIf sArr(N, 5) = "DTT" Then
                dArr(K, 5) = Cap_GCN28
            ElseIf sArr(N, 5) = "DKH" Then
                dArr(K, 5) = Cap_GCN29
            ElseIf sArr(N, 5) = "DXH" Then
                dArr(K, 5) = Cap_GCN30
            ElseIf sArr(N, 5) = "DCH" Then
                dArr(K, 5) = Cap_GCN31
            ElseIf sArr(N, 5) = "DDT" Then
                dArr(K, 5) = Cap_GCN32
            ElseIf sArr(N, 5) = "DRA" Then
                dArr(K, 5) = Cap_GCN33
            ElseIf sArr(N, 5) = "TON" Then
                dArr(K, 5) = Cap_GCN34
            ElseIf sArr(N, 5) = "TIN" Then
                dArr(K, 5) = Cap_GCN35
            ElseIf sArr(N, 5) = "NTD" Then
                dArr(K, 5) = Cap_GCN36
            ElseIf sArr(N, 5) = "SON" Then
                dArr(K, 5) = Cap_GCN37
            ElseIf sArr(N, 5) = "MNC" Then
                dArr(K, 5) = Cap_GCN38
            ElseIf sArr(N, 5) = "PNK" Then
                dArr(K, 5) = Cap_GCN39
            ElseIf sArr(N, 5) = "BCS" Then
                dArr(K, 5) = Cap_GCN40
            ElseIf sArr(N, 5) = "DCS" Then
                dArr(K, 5) = Cap_GCN40
            ElseIf sArr(N, 5) = "NCS" Then
                dArr(K, 5) = Cap_GCN40
            Else
                dArr(K, 5) = vbNullString
        End If

Đây chỉ có 40 mã nếu có nhiều hơn thì sao????
huuu
nhờ mọi người giúp đỡ ạ
thanks

Đây chỉ có 40 mã nếu có nhiều hơn thì sao????
Tìm đọc tài liệu về lệnh SELECT CASE...

huuu
Không hiểu. Hỏi thì chịu khó viết cho rõ ràng. Nửa nạc nửa mỡ là thế nào?

thanks
Cái nào không có tiếng Việt thì hãy dùng ngoại lai. Tập tành thói quen lai căng thì có gì là hay.

Tổng quan: code có hằng trăm nơi dùng mã cứng (hardcode). Code này gặp bảng sửa môt tí là viết lại lộn tùng phèo hết trơn. Thảo nào nghe bà con than thở "khổ nhất là khi gặp người dùng chèn thêm cột"
 
Upvote 0
khó thất...hihihi...........viết trực tiếp trên sheet dể hình dung hơn...............hehehe.
anh có thể giải thích thêm cái lệnh này giúp với
Mã:
Dic.Add KHO(i, 3), ""
có thể hiểu vậy được ko anh
==>Dic add, lệnh nạp vào dic
==>KHO(i, 3), là phần tử nạp
==> vậy còn "" có nghĩa là sao ạh?, thông thường tôi thấy người ta hay thêm cái lệnh k=k+1
và lệnh nạp vào dic là
Mã:
Dic.Add KHO(i, 3), k
thì tôi hiểu là qua mỗi lần lặp, k tăng lên một lần, và các phần tử được nạp nối tiếp nhau vào trong dic. còn như trường hợp anh viết thì ko biết hiểu như thế nào?
mong anh giải thích giúp

p/s: tôi học theo kiểu thợ đụng,"đụng đâu học đó", nên ko có bài bảng....hihihih
cám ơn

Add là "thêm vào". Ta thêm 1 key và 1 item tương ứng với nó. Tức thêm vào 1 cặp (key, item). Người ta không cần item (trong phần tiếp theo của code) nên người ta nhập item = "" (chuỗi rỗng). Người khác cần trong phần tiếp theo thì nhập item = k (số)

Nhiều khi bạn có một loạt tương quan "key - item" và khi có 1 key (từ khóa) nào đó bạn muốn đọc ra item tương ứng với nó. Lúc đó thì khi gọi Add bạn phải nhập key và item tương ứng với nó.

Giả sử bạn có dữ liệu từ điển ở dạng tập tin txt: có 10000 dòng, mỗi dòng có cấu trúc vd. [từ]TAB[nghĩa của từ]. Vd. loveTABtình yêu (TAB là ký tự có code = 9 - phím TAB)

Bây giờ code của bạn đọc vào: UserForm có 1 ListBox hiển thị các từ, và nếu chọn từ nào thì sẽ hiển thị nghĩa tiếng Việt của từ đó trong TextBox. Bạn làm thế nào. Giả sử bạn muốn dùng "đít thon". Thế thì khi Add bạn không chỉ chỉ ra "từ - key - từ khóa" mà phải chỉ ra cả "item - nghĩa của từ" nữa. Vậy thì bạn đọc tập tin txt --> tách mỗi dòng thành [từ] và [nghĩa] --> dic.Add [từ], [nghĩa] --> thêm từ vào ListBox.
Khi người ta chọn trong ListBox thì bạn đọc ra được [từ] --> bạn dùng dic.item("key") để đọc ra item là nghĩa để "nhồi" vào TextBox.

Ngoài việc làm từ điển thì bạn cũng có thể làm vd. "sách nấu ăn": key = tên món ăn", item = nguyên liệu, cách nấu. Sổ điện thoại: key = họ tên, item = địa chỉ, số dđ v...v

Chính vì để lưu trữ key (từ khóa) - item (giá trị), cấu trúc như từ điển mà "nó" có tên là Dictionary.
 
Upvote 0
Add là "thêm vào". Ta thêm 1 key và 1 item tương ứng với nó. Tức thêm vào 1 cặp (key, item). Người ta không cần item (trong phần tiếp theo của code) nên người ta nhập item = "" (chuỗi rỗng). Người khác cần trong phần tiếp theo thì nhập item = k (số)

Nhiều khi bạn có một loạt tương quan "key - item" và khi có 1 key (từ khóa) nào đó bạn muốn đọc ra item tương ứng với nó. Lúc đó thì khi gọi Add bạn phải nhập key và item tương ứng với nó.

Giả sử bạn có dữ liệu từ điển ở dạng tập tin txt: có 10000 dòng, mỗi dòng có cấu trúc vd. [từ]TAB[nghĩa của từ]. Vd. loveTABtình yêu (TAB là ký tự có code = 9 - phím TAB)

Bây giờ code của bạn đọc vào: UserForm có 1 ListBox hiển thị các từ, và nếu chọn từ nào thì sẽ hiển thị nghĩa tiếng Việt của từ đó trong TextBox. Bạn làm thế nào. Giả sử bạn muốn dùng "đít thon". Thế thì khi Add bạn không chỉ chỉ ra "từ - key - từ khóa" mà phải chỉ ra cả "item - nghĩa của từ" nữa. Vậy thì bạn đọc tập tin txt --> tách mỗi dòng thành [từ] và [nghĩa] --> dic.Add [từ], [nghĩa] --> thêm từ vào ListBox.
Khi người ta chọn trong ListBox thì bạn đọc ra được [từ] --> bạn dùng dic.item("key") để đọc ra item là nghĩa để "nhồi" vào TextBox.

Ngoài việc làm từ điển thì bạn cũng có thể làm vd. "sách nấu ăn": key = tên món ăn", item = nguyên liệu, cách nấu. Sổ điện thoại: key = họ tên, item = địa chỉ, số dđ v...v

Chính vì để lưu trữ key (từ khóa) - item (giá trị), cấu trúc như từ điển mà "nó" có tên là Dictionary.

cám ơn anh nhiều, để "tiêu hóa" được những điều anh giải thích, chắc là còn một quảng đường rất dài phía trước....@!##
 
Upvote 0
khó thất...hihihi...........viết trực tiếp trên sheet dể hình dung hơn...............hehehe.
anh có thể giải thích thêm cái lệnh này giúp với
Mã:
Dic.Add KHO(i, 3), ""
có thể hiểu vậy được ko anh
==>Dic add, lệnh nạp vào dic
==>KHO(i, 3), là phần tử nạp
==> vậy còn "" có nghĩa là sao ạh?, thông thường tôi thấy người ta hay thêm cái lệnh k=k+1
và lệnh nạp vào dic là
Mã:
Dic.Add KHO(i, 3), k
thì tôi hiểu là qua mỗi lần lặp, k tăng lên một lần, và các phần tử được nạp nối tiếp nhau vào trong dic. còn như trường hợp anh viết thì ko biết hiểu như thế nào?
mong anh giải thích giúp

p/s: tôi học theo kiểu thợ đụng,"đụng đâu học đó", nên ko có bài bảng....hihihih
cám ơn

Hãy tưởng tưởng 1 bảng tra cứu dùng cho hàm VLOOKUP gồm có 2 cột. Vậy cột đầu tiên đương nhiên là từ khóa để tra (Với dic thì nó là Key). Cột thứ 2 là giá trị cần tra cứu
Khi bạn dùng VLOOUP thì cái bảng tra ấy có sẵn, còn với Dictionary, hãy tưởng tượng rằng bảng tra ấy chưa có và ta đang xây dựng nó bằng cách nạp Dic vào 2 cột
Cú pháp nạp Dictionary là: Dic.Add Key, Item
Theo quy định của Dic thì Key không cho phép trùng, còn Item thì là cái giống gì cũng được.
Mỗi lần bạn nạp Dic thì Key là bắt buộc phải có còn Item là tùy ý. Nếu bạn không muốn dùng Item vào việc gì sau này thì cứ cho nó = ""
Sau khi đã náp xong Dic, xem như đã có bảng tra thì ta có thể truy xuất nó gần giống như hàm VLOOKUP: Dic.Item(Key) với Key là từ khóa để tra và kết quả tra về là Item tương ứng với Key (lúc trước ta đã nạp 1 cặp)
Vậy, nếu cần Item thì nạp vào, sau này có thể truy xuất ra để xài, không cần thì khỏi nạp (cho nó = ""), và khi ấy ta dùng Dic như 1 dạng bài toán lọc duy nhất mà thôi
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác có cách nào giúp em: Viết 1 hàm Excel để nó làm các công việc sau: Copy rồi Paste-Special-Value và Save file theo 1 khoảng thời gian chọn trước.



Ví dụ cụ thể: Ở ô C1 ta có hàm Pastevalue(A$1,$B$1) là làm việc sau: Nếu điều kiện A$1 thoả mãn thì copy ô $B$1 rồi paste-special-value vào ô C1 rồi save file. A$1 là 1 điều kiện thời gian (như 15-23 giờ ngày 21/2/2014 chẳng hạn), nếu hiện tại trước thời điểm này thì giá trị ở C1 = 0, sau thời điểm này thì hiển thị giá trị đã có lúc hàm chạy khi điều kiện thời gia A$1 thoả mãn.

Qua ô C2 ta có hàm Pastevalue(A$2,$B$1) và chạy tương tự.

Lưu ý rằng: Giá trị của B1 là thay đổi theo từng ngày nên cái mình cần ở C1, C2,... là giá trị cố định của $B$1 tại 1 thời điểm xác định trước thể hiện ở A1, A2,...




Mỗi khi mở file thì hàm tự động chạy hoặc nếu file đang mở rồi thì đến thời gian chọn trước hàm tự động chạy 1 lần!

Em cần hàm này vì e lấy data bảng giá chứng khoán từ web về và muốn nó lưu lại 1 số mã từng ngày để xử lý.

(em chưa biết j về macro, VBA,.. nên muốn biến những cái này thành hàm để xử lý cho đơn giản)
 
Lần chỉnh sửa cuối:
Upvote 0
Viết hàm căn bậc 3 trong vba

Em thử viết (-2) ^ (1/3) trong vba , nhưng đều báo lỗi, Vậy nếu em muốn tính căn bậc 3 của (-2) thì phải viết như thế nào !?
 
Upvote 0
Ừ hen! Giờ mới chú í chuyện này;
Trong cửa sổ trung gian thì được;
Còn trong VBA tạm thời có cách đi đường vòng:
PHP:
Function Can3(Num As Double) As Double
 If Num >= 0 Then
    Can3 = Num ^ (1 / 3)
 Else
    Can3 = -Abs(Num) ^ (1 / 3)
 End If
End Function
 
Upvote 0
Ừ hen! Giờ mới chú í chuyện này;
Trong cửa sổ trung gian thì được;
Còn trong VBA tạm thời có cách đi đường vòng:
PHP:
Function Can3(Num As Double) As Double
 If Num >= 0 Then
    Can3 = Num ^ (1 / 3)
 Else
    Can3 = -Abs(Num) ^ (1 / 3)
 End If
End Function
theo mình hiểu thì điều kiện để phép tính a^b có nghĩa là a > = 0
dó đó cách viết (-x) ^ (1/3) sẽ không có nghĩa, ta chỉ có thể viết -x ^ (1/3)
 
Upvote 0
Thưa ad, em đã gán macro vào nút như hình vẽ, vậy trong VBA có lệnh nào để di chuyển nút đó đến 1 ô (hoặc tọa độ) mình mong muốn không ạ? Ví dụ như chuyển nó xuống cell có chữ "Nhóm 1" chẳng hạn.
Mong ad giải đáp giùm em, em xin cảm ơn.
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    35.5 KB · Đọc: 45
Lần chỉnh sửa cuối:
Upvote 0
Thưa ad, em đã gán macro vào nút như hình vẽ, vậy trong VBA có lệnh nào để di chuyển nút đó đến 1 ô (hoặc tọa độ) mình mong muốn không ạ? Ví dụ như chuyển nó xuống cell có chữ "Nhóm 1" chẳng hạn.
Mong ad giải đáp giùm em, em xin cảm ơn.
Giả sử cái nút của bạn có tên shp và ô bạn muốn di chuyển là A5 thì đoạn code thực hiện theo yêu cầu là
Mã:
ActiveSheet.Shapes("Shp").Left = [A5].Left
ActiveSheet.Shapes("Shp").Top = [A5].Top
 
Upvote 0
Bảng excel mình có nhiều giá trị cần ấn f2 rùi enter mới hiện giá trị. mà làm thủ công mất thời gian quá. Mình muốn một đoạn VBA làm mới giá trị trong excell, như ấn f2 rùi ấn enter
Do mới học VBA nên chưa biết nhiều nhờ các bác chỉ giúp.
 
Upvote 0
Bảng excel mình có nhiều giá trị cần ấn f2 rùi enter mới hiện giá trị. mà làm thủ công mất thời gian quá. Mình muốn một đoạn VBA làm mới giá trị trong excell, như ấn f2 rùi ấn enter
Do mới học VBA nên chưa biết nhiều nhờ các bác chỉ giúp.
Thử với cái này xem:

Mã:
Sub AllRefresh()
    ActiveWorkbook.RefreshAll
End Sub
 
Upvote 0
Thưa ad, em đã gán macro vào nút như hình vẽ, vậy trong VBA có lệnh nào để di chuyển nút đó đến 1 ô (hoặc tọa độ) mình mong muốn không ạ? Ví dụ như chuyển nó xuống cell có chữ "Nhóm 1" chẳng hạn.
Mong ad giải đáp giùm em, em xin cảm ơn.
Mã:
Sub GPE()
    Dim cmdButton As OLEObject, rng As Range
        Set rng = Application.InputBox("Nhap dia chi Cell", , , , , , , 8)
        Set cmdButton = ActiveSheet.OLEObjects _
                        ([COLOR=#ff0000][B]" TEN CUA COMMAND BUTTON "[/B][/COLOR])
        With cmdButton
            .Left = rng.Left
            .Top = rng.Top
            rng.RowHeight = .Height
        End With
End Sub
 
Upvote 0
Giả sử cái nút của bạn có tên shp và ô bạn muốn di chuyển là A5 thì đoạn code thực hiện theo yêu cầu là
Mã:
ActiveSheet.Shapes("Shp").Left = [A5].Left
ActiveSheet.Shapes("Shp").Top = [A5].Top
Cho em hỏi làm sao để biết tên của shape ạ? Em mò thử cũng chỉ thấy tên của Macro gán vào thôi.
 
Upvote 0
Mã:
Sub GPE()
    Dim cmdButton As OLEObject, rng As Range
        Set rng = Application.InputBox("Nhap dia chi Cell", , , , , , , 8)
        Set cmdButton = ActiveSheet.OLEObjects _
                        ([COLOR=#ff0000][B]" TEN CUA COMMAND BUTTON "[/B][/COLOR])
        With cmdButton
            .Left = rng.Left
            .Top = rng.Top
            rng.RowHeight = .Height
        End With
End Sub
Thưa anh, em đã tạo 1 button như hình vẽ, nhưng khi chạy thử thì bị lỗi "Unable to get the OLEObjects property of the worksheet class", tại sao lại như vậy ạ? Hay do em nhập tên button sai? Em nhập tên Button là cái tên hiện ra trên button khi mới tạo luôn .
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    37.3 KB · Đọc: 31
Upvote 0
Thưa anh, em đã tạo 1 button như hình vẽ, nhưng khi chạy thử thì bị lỗi "Unable to get the OLEObjects property of the worksheet class", tại sao lại như vậy ạ? Hay do em nhập tên button sai? Em nhập tên Button là cái tên hiện ra trên button khi mới tạo luôn .

Điều này có nghĩa là: Bạn phải đưa file + code lên đây thì người ta mới biết, đúng không nào?
 
Upvote 0
Web KT
Back
Top Bottom