Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,946
Cứ sau mỗi mệnh đề gán trị vô biến bạn hỏi xem VBA nó báo cho bạn trị trong biến đó là bao nhiêu?
Ví dụ:
Mã:
 Giam = ThisWorkbook.Worksheets(1).Range("I15").Value
  MsgBox Giam, , "GPE.COM Xin Cho Biêt'

& nếu cần thì lấy giấy bút ra mà ghi lại lần lượt từng em nó một.
cảm ơn bạn, bạn xem giúp mình code đó sai ở đâu đc không ban
 
Upvote 0
hjx .... vừa đọc vừa học vừa làm vừa hỏi nên gà lắm anh ạ. Anh thông cảm tí đi

Gà nó siêng năng bới đất chứ đâu có nằm chờ sung rụng.
Bạn đã làm theo lời bài #1172 chưa? Ghi được ra những kết quả thế nào? Nếu không chạy được thì báo lỗi ra sao và ở dòng nào?

Gợi ý: nếu không chạy được thì tạm xoá cái dòng Option Explicit
 
Upvote 0
Gợi í nên vô hiệu hóa dòng lệnh thôi; Ai lại kêu xóa tạm bao giờ, lỡ mất luôn thì sao.

Gợi í bạn: Có chí ít 2 cách vô hiệu hóa 1 dòng lệnh trong VBA; . . . .
 
Upvote 0
Gà nó siêng năng bới đất chứ đâu có nằm chờ sung rụng.
Bạn đã làm theo lời bài #1172 chưa? Ghi được ra những kết quả thế nào? Nếu không chạy được thì báo lỗi ra sao và ở dòng nào?

Gợi ý: nếu không chạy được thì tạm xoá cái dòng Option Explicit
mình thử làm theo bỏ function đi và nhập nó sẽ lần lượt báo các giá trị ở các ô tương ứng của biến đã khai. Có lẽ sai ở function. Mình không biết sai ở đâu :(. Bỏ option explicit đi cũng k được luôn bạn ạ
 
Upvote 0
Một trong những bước đầu tiên và căn bản của lập trình là "TẬP BỎ THÓI QUEN VIẾT TẮT"
Những từ m, n, k dùng để đặt tên cho các trị số nguyên. Đang đọc câu hỏi mà thấy chúng bị vướng như ăn bánh đúc gặp sợi tóc.

Cái function của bạn đượng nhiên là có vấn đề rồi. Bạn muốn có mọt cái kiểu tên là formular thì bạn phải tự viết code định nghĩa kiểu này chớ VBA đâu có cách nào hiểu giùm cho bạn.

Function chenhlech(ByVal Ttruoc, ByVal Tnay, ByVal tang, ByVal giam) As formular
chenhlech = Ttruoc - Tnay + tang - giam
End Function"

Cách gọi function cũng sai luôn. Function định nghĩa là sẽ yêu cầu 4 tham mà lúc gọi thì trổng không chả nạp tham nào.
 
Upvote 0
Mong được giải đáp
Tôi có làm các checkbox để ẩn hiện các cột cho tiện (như file đính kèm).
Việc sử dụng thì không sao. Tuy nhiên khi mở file ra, cấu hình trong form không đúng với thực tế. Cụ thể là khi bấm dấu kiểm nào đó vào thì 1 số cột tương ứng bị ẩn, nếu đóng file lại và có save sau đó mở ra, cột vẫn bị ẩn mà dấu kiểm không còn.
Có cách nào lưu giữ dấu kiểm khi mở file tương ứng với khi đóng file ?
Xin cảm ơn
Không ai giúp được vấn đề này ạ ?
 
Upvote 0
@VetMini ; @SA_DQ ; @Hoang2013 cảm ơn các bác đã reply, em đã sửa được rồi. em làm function và nó cho ra kết quả rồi.
Code em làm như sau:
Function ChenhLech(Ttruoc As Long, Tnay As Long, tang As Long, giam As Long) As Long
Ttruoc = ThisWorkbook.Worksheets(1).Range("I12").Value
Tnay = ThisWorkbook.Worksheets(1).Range("I13").Value
tang = ThisWorkbook.Worksheets(1).Range("I14").Value
giam = ThisWorkbook.Worksheets(1).Range("I15").Value
ChenhLech = Ttruoc - Tnay + tang - giam
MsgBox ChenhLech, , "So chenh lech thang truoc so voi thang nay la"
End Function
Vấn đề là để chạy được cái này bên excel em sẽ phải viết công thức =chenhlech(I12;I13;I14;I15) vào một cell.
Giả dụ bjo em muốn gán nó vào cái hình oval có tên là tính biến động để sau chỉ ấn vào đó là nó ra kết quả thì làm thế nào ạ? Em mới chỉ biết gán macro thôi ạ. Các bác làm ơn chỉ em với ạ. Em cảm ơn nhiều
 
Upvote 0
Code em làm như sau:
PHP:
Function ChenhLech(Ttruoc As Long, Tnay As Long, Tang As Long, Giam As Long) As Long
1 Ttruoc = ThisWorkbook.Worksheets(1).Range("I12").Value
 Tnay = ThisWorkbook.Worksheets(1).Range("I13").Value
 Tang = ThisWorkbook.Worksheets(1).Range("I14").Value
4 Giam = ThisWorkbook.Worksheets(1).Range("I15").Value
 ChenhLech = Ttruoc - Tnay + Tang - Giam
  MsgBox ChenhLech, , "Só Chênh lêch Tháng Truóc So Vói Tháng Này Là:"
End Function
Vấn đề là để chạy được cái này bên excel em sẽ phải viết công thức =chenhlech(I12;I13;I14;I15) vào một cell.

Bạn vô hiệu hóa 4 dòng lệnh từ 1 => 4 cũng sẽ không ảnh hưởng gì đến kết quả hàm cho mà xem!
 
Upvote 0
Bạn vô hiệu hóa 4 dòng lệnh từ 1 => 4 cũng sẽ không ảnh hưởng gì đến kết quả hàm cho mà xem!
à vâng, đã thử và đúng vậy. Thế chỗ em hỏi thì sao anh? có cách nào gán đoạn công thức "=chenhlech(I12;I13;I14;I15)" vào hình kia để ấn vô thì nó thực thi không anh
 
Upvote 0
Em xin hỏi! vòng for
ô A1 giá trị = 100, làm cách nào để ô A1 chạy 100, 101..110
 
Upvote 0
Tăng tốc thì mình đọc bài sau xem...
PHP:
If Min > 42004 And Max < 44196 Then
    If Min <= Max Then
      Min = CLng(Min): Max = CLng(Max)
        Dim a(), i As Long
        ReDim a(1 To Max - Min + 1, 1 To 1)
        For dem = Min To Max
            i = i + 1
            a(i, 1) = dem
        Next
        .Cells(1, 2).Resize(UBound(a, 1), 1) = a
    End If
End If
Đã áp dụng được cái của bác befaint, cảm ơn bác nhiều, sau khi đọc link dẫn của bác về mảng thì có vấn đề này tôi chưa làm được . Đang chập chững mày mò mà làm mãi không được. Mong các anh chị em giúp đỡ, xin cảm ơn
 

File đính kèm

  • Chay ngay thang.xlsm
    21.9 KB · Đọc: 10
Upvote 0
Đã áp dụng được cái của bác befaint, cảm ơn bác nhiều, sau khi đọc link dẫn của bác về mảng thì có vấn đề này tôi chưa làm được . Đang chập chững mày mò mà làm mãi không được. Mong các anh chị em giúp đỡ, xin cảm ơn
Bạn chạy thử Code này xem sao
PHP:
Sub Miccpro()
    Dim Dic As Object, sArr(), dArr(1 To 65535, 1 To 2)
    Dim I As Long, J As Date, K As Long, R As Long
    Dim Rng As Range, Nmin As Date, Nmax As Date
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    Set Rng = .Range("B2", .Range("B65535").End(3)).Resize(, 2)
    Nmin = Application.Min(Rng): Nmax = Application.Max(Rng)
End With
sArr = Rng.Value2
For I = 1 To UBound(sArr)
    For J = sArr(I, 1) To sArr(I, 2)
        Dic.Item(J) = 1
    Next J
Next I
For I = Nmin To Nmax
    K = K + 1
    dArr(K, 1) = I
    R = Dic.Item(I)
    If R = 0 Then dArr(K, 2) = "Ngh" & ChrW$(7881)
Next I
With Sheet2
    Range("B2").Resize(K, 2) = dArr
End With
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xưng hô xã giao thì gọi là anh/ chị có được không?
Cho dù biết rõ người đối thoại với mình nhỏ tuổi hơn mình cả chục tuổi đi nữa, mình gọi là anh/ chị xem có bị thiệt miếng thịt nào không?
------
PHP:
Sub bebe()
    Dim a(), arr(), b(), N As Long, Res(), D As Long
    Dim i As Long, k As Long
    a = Sheet1.Range("B2:C6").Value2
    b = Sheet2.Range("B2:B15").Value2
    N = UBound(b, 1)
    ReDim Res(1 To N, 1 To 1)
    For i = 1 To UBound(a, 1)
        If a(i, 1) <= a(i, 2) Then
            For D = a(i, 1) To a(i, 2)
                k = k + 1
                ReDim Preserve arr(1 To k)
                arr(k) = D
            Next D
        End If
    Next i
    For i = 1 To N
        If IsError(Application.Match(b(i, 1), arr, 0)) = True Then Res(i, 1) = "Ngh" & ChrW(7881)
    Next i
    Sheet2.Range("C2").Resize(N, 1) = Res
End Sub
 
Upvote 0
Giả dụ bjo em muốn gán nó vào cái hình oval có tên là tính biến động để sau chỉ ấn vào đó là nó ra kết quả thì làm thế nào ạ? Em mới chỉ biết gán macro thôi ạ. Các bác làm ơn chỉ em với ạ.
. . . . Thế chỗ em hỏi thì sao anh? có cách nào gán đoạn công thức "=chenhlech(I12;I13;I14;I15)" vào hình kia để ấn vô thì nó thực thi không anh
Bạn đã biết "gán" macro vô hình; Giờ thay nội dung đó lại là được;
Ví dụ
Mã:
 Sub GPE  
  [I16].Value= ChenhLech([I12], [I13], [I14], [I15])
End Sub
 
Upvote 0
@VetMini ; @SA_DQ ; @Hoang2013 cảm ơn các bác đã reply, em đã sửa được rồi. em làm function và nó cho ra kết quả rồi.
...
Giả dụ bjo em muốn gán nó vào cái hình oval có tên là tính biến động để sau chỉ ấn vào đó là nó ra kết quả thì làm thế nào ạ? Em mới chỉ biết gán macro thôi ạ. Các bác làm ơn chỉ em với ạ. Em cảm ơn nhiều

Thứ nhất, tôi không tiếp xúc theo kiểu vừa tiếng Việt vừa tiếng Anh. Nếu bạn dốt tiếng Việt thì cứ dùng tiếng Anh thuần túy, tôi đủ khả năng hầu tiếp (nhưng nếu trường hợp này mà bạn cho thấy dốt cả tiếng Anh thì tôi mạt sát ngay)

Thứ hai, tôi đã cảnh báo về vấn đề viết tắt. Tôi chỉ khuyến khích người hiếu học. Đối với tôi, người hiếu học khong có thói quen viết tắt.

(*) Chớ có bắt chước theo lời nhơn vật nọ lý luận rằng thời buổi bây giờ phải tập dùng tiếng Anh cho quen. Lý luận như vậy là ngụy biện. Nói thẳng ra đây tôi là người song ngữ, tiếng Anh tôi dùng không khác gì tiếng Việt. Nhưng trong suốt quá trình học, tôi không bao giờ lẫn lộn 2 cái vào nhau,
 
Upvote 0
Thứ nhất, tôi không tiếp xúc theo kiểu vừa tiếng Việt vừa tiếng Anh. Nếu bạn dốt tiếng Việt thì cứ dùng tiếng Anh thuần túy, tôi đủ khả năng hầu tiếp (nhưng nếu trường hợp này mà bạn cho thấy dốt cả tiếng Anh thì tôi mạt sát ngay)

Thứ hai, tôi đã cảnh báo về vấn đề viết tắt. Tôi chỉ khuyến khích người hiếu học. Đối với tôi, người hiếu học khong có thói quen viết tắt.

(*) Chớ có bắt chước theo lời nhơn vật nọ lý luận rằng thời buổi bây giờ phải tập dùng tiếng Anh cho quen. Lý luận như vậy là ngụy biện. Nói thẳng ra đây tôi là người song ngữ, tiếng Anh tôi dùng không khác gì tiếng Việt. Nhưng trong suốt quá trình học, tôi không bao giờ lẫn lộn 2 cái vào nhau,
Híc, cảm ơn bác góp ý. E sẽ rút kinh nghiệm
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xưng hô xã giao thì gọi là anh/ chị có được không?
Cho dù biết rõ người đối thoại với mình nhỏ tuổi hơn mình cả chục tuổi đi nữa, mình gọi là anh/ chị xem có bị thiệt miếng thịt nào không?
------
PHP:
Sub bebe()
    Dim a(), arr(), b(), N As Long, Res(), D As Long
    Dim i As Long, k As Long
    a = Sheet1.Range("B2:C6").Value2
    b = Sheet2.Range("B2:B15").Value2
    N = UBound(b, 1)
    ReDim Res(1 To N, 1 To 1)
    For i = 1 To UBound(a, 1)
        If a(i, 1) <= a(i, 2) Then
            For D = a(i, 1) To a(i, 2)
                k = k + 1
                ReDim Preserve arr(1 To k)
                arr(k) = D
            Next D
        End If
    Next i
    For i = 1 To N
        If IsError(Application.Match(b(i, 1), arr, 0)) = True Then Res(i, 1) = "Ngh" & ChrW(7881)
    Next i
    Sheet2.Range("C2").Resize(N, 1) = Res
End Sub
Cảm ơn bác đã nhắc nhở, em sẽ rút kinh nghiệm.
Em xin hỏi bấc vấn đề này:
PHP:
    a = Sheet1.Range("B2:C6").Value2
    b = Sheet2.Range("B2:B15").Value2
Giả sử em thay Sheet1.Range("B2:C6").Value2 thành Sheet1.Range("B2:C5000").Value2 chẳng hạn thì nó chạy rất chậm bác ạ. Có cách gì nhanh hơn không? Mong các bác giúp đỡ
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

Bài viết mới nhất

Back
Top Bottom