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,930
Tôi có cái code như này:
Mã:
Sub Chay()
Dim Min, Max As Date
Dim dem As Integer
Dim Rng As Range
   Set Rng = Sheet1.[B2:B3]
    Min = Application.Min(Rng)
    Max = Application.Max(Rng)
With Sheet2
    .Range("B1:B10000").ClearContents
     If Min > 42004 And Max < 44196 Then
       For dem = 0 To Max - Min
   .Cells(1 + dem, 2) = Min + dem
    Next
End If
End With
Application.ScreenUpdating = True
End Sub
Khi chạy khoảng Min đến Max mà dữ liệu khoảng trên 1000 dòng thì hơi bị chậm, mong anh chị em có cách gì giúp tăng tốc không ạ. Xin cảm ơn
 
Upvote 0
Sub tinh_so()
Dim Ttruoc As Long, Tnay As Long, tang As Long, giam As Long
Set Ttruoc = ThisWorkbook.Worksheets(1).I12
Set Tnay = ThisWorkbook.Worksheets(1).I13
Set tang = ThisWorkbook.Worksheets(1).I14
Set giam = ThisWorkbook.Worksheets(1).I15
MsgBox "So chenh lech thang nay so voi thang truoc la" & Ttruoc - Tnay + tang - giam
End Sub
Các bác giúp hộ e xem cái này sai ở đâu ạ
 
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
 
Lần chỉnh sửa cuối:
Upvote 0
Nhấn F5 mà vàng chỗ nào thì sai chỗ đó.
Đọc bài sau xem...
em xem thì nó bảo kiểu là vba nó không hiểu code em viết ấy, em không biết sai ở đâu cả ạ.
Em viết lại như sau mà vẫn k đc:
"Option Explicit
Sub tinh_chenh_lech()
Dim Ttruoc As Long, Tnay As Long, tang As Long, giam As Long
Set Ttruoc = ThisWorkbook.Worksheets(1).I12.Value
Set Tnay = ThisWorkbook.Worksheets(1).I13.Value
Set tang = ThisWorkbook.Worksheets(1).I14.Value
Set giam = ThisWorkbook.Worksheets(1).I15.Value
MsgBox "So chenh lech thang nay so voi thang truoc la" & chenhlech
End Sub
Function chenhlech(ByVal Ttruoc, ByVal Tnay, ByVal tang, ByVal giam)
chenhlech = Ttruoc - Tnay + tang - giam
End Function"
Muc đích của e là sẽ tính ra số chênh lệch và xuất ra màn hình, số chênh lệch = tháng trước (I12)- tháng này (I13) +tăng (I14)- giảm (I15).
Anh xem chỉ em với ạ
Nhấn F5 mà vàng chỗ nào thì sai chỗ đó.
Đọc bài sau xem...
 
Upvote 0
Hình như các câu lệnh này có vấn đề:
PHP:
Set Ttruoc = ThisWorkbook.Worksheets(1).I12.Value
Set Tnay = ThisWorkbook.Worksheets(1).I13.Value
Set tang = ThisWorkbook.Worksheets(1).I14.Value
Set giam = ThisWorkbook.Worksheets(1).I15.Value

Các biến này (Truoc, Thay, Tang, Giam) không là các biến đối tượng sao lại xài fép gán là 'Set'?; Từ khóa này chỉ dành cho các biến đối tượng mà thôi. Như:
Mã:
 Dim Rng as Range
Set Rng = ThisWorkbook.Worksheets("GPE").[I14]
Tang = Rng.Value

Các địa chỉ ô cần để trong ngoặt, như [I15]
Còn 1 vấn đề không quan trọng nữa, nhưng để sau
 
Upvote 0
Hình như các câu lệnh này có vấn đề:
PHP:
Set Ttruoc = ThisWorkbook.Worksheets(1).I12.Value
Set Tnay = ThisWorkbook.Worksheets(1).I13.Value
Set tang = ThisWorkbook.Worksheets(1).I14.Value
Set giam = ThisWorkbook.Worksheets(1).I15.Value

Các biến này (Truoc, Thay, Tang, Giam) không là các biến đối tượng sao lại xài fép gán là 'Set'?; Từ khóa này chỉ dành cho các biến đối tượng mà thôi. Như:
Mã:
 Dim Rng as Range
Set Rng = ThisWorkbook.Worksheets("GPE").[I14]
Tang = Rng.Value

Các địa chỉ ô cần để trong ngoặt, như [I15]
Còn 1 vấn đề không quan trọng nữa, nhưng để sau
mình sửa lại như sau nhưng vẫn k chạy được bạn ạ:
"Option Explicit
Sub tinh_chenh_lech()
Dim Ttruoc As Long, Tnay As Long, tang As Long, giam 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
MsgBox "So chenh lech thang nay so voi thang truoc la" & chenhlech
End Sub
Function chenhlech(ByVal Ttruoc, ByVal Tnay, ByVal tang, ByVal giam) As formular
chenhlech = Ttruoc - Tnay + tang - giam
End Function"
bạn chỉ mình sai ở đâu với
 
Upvote 0
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.
 
Upvote 0
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
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom