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,932
em mới bắt đầu học vba, giờ muốn làm 1 bài đánh số thứ tự từ trên xuống theo nhóm liên tục.
+ giả sử cột dữ liệu cần đánh stt là A, và cột đánh stt là B thì từ :B1 B2 B3 = 111 tiếp theo B4 B5 B6 = 222........ chạy liên tục cho đến hàng cuối cùng cột A
+ Em đã viết được 1 sub để chạy, nhưng sub chỉ đúng khi cột dữ liệu bắt đầu từ A1 hoặc A2 tương ứng bắt đầu đánh số thứ tự là B1 hoặc B2. còn từ hàng tiếp theo sub chạy sai ( ví dụ cột dữ liệu từ A3 và hàng đánh stt bắt đầu từ B3)
Nhờ các bác xem và sửa lại code theo file đính kèm sao cho code có thể chạy nếu nhập vào hàng bất kỳ. Nếu code sửa như nào, các bác giải thích cho e hiểu với. thanks all
 

File đính kèm

  • danhstt.xlsm
    30.5 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Quá đơn giản, nó cho biết rằng tất cả các biến cục bộ trong sub đều là static ( được giữ lại giá trị sau các lần gọi). nếu thủ tục cần có 10 biến static, nếu gõ 10 cái static cũng lâu, thay vào đó gõ một cái là được.
static thì mình biết ... Còn bạn giải thích nghe chưa thuyết phục lắm
1/ Căn cứ vào đâu ???
2/ Tài liệu nào trích dẫn ???
3/ Nếu câu 1 & 2 không có Thì: VD chứng minh Bạn giải thích là đúng !!! ???
 
Upvote 0
bị
static thì mình biết ... Còn bạn giải thích nghe chưa thuyết phục lắm
1/ Căn cứ vào đâu ???
2/ Tài liệu nào trích dẫn ???
3/ Nếu câu 1 & 2 không có Thì: VD chứng minh Bạn giải thích là đúng !!! ???
sư phụ em bảo thế. lúc nào rảnh viết code là hiểu liền
 
Upvote 0
Thay vì họanh họe người có chút thành ý chia sẻ , tôi bỏ ra 30s thử viết cái này
PHP:
Static Sub ton30sthuthoi()
    Dim a, b
    a = a + 1
    b = b + 1
    Debug.Print a, b
End Sub
và thu được kết quả sau 6 phát run
1 1
2 2
3 3
4 4
5 5
6 6
Hay phết NguyenNgocThuHien nhở! Cơ mà sư phụ của cô là ai thế? :D
 
Lần chỉnh sửa cuối:
Upvote 0
Thay vì họanh họe người có chút thành ý chia sẻ , tôi bỏ ra 30s thử viết cái này
PHP:
Static Sub ton30sthuthoi()
    Dim a, b
    a = a + 1
    b = b + 1
    Debug.Print a, b
End Sub
và thu được kết quả sau 6 phát run
1 1
2 2
3 3
4 4
5 5
6 6
Hay phết NguyenNgocThuHien nhở! Cơ mà sư phụ của cô là ai thế? :D
Mình mới Thử Run 1 cái nó ra như hình nè ...Run cái nữa nó + 1Capture.PNG
 
Upvote 0
Thay vì họanh họe người có chút thành ý chia sẻ , tôi bỏ ra 30s thử viết cái này
PHP:
Static Sub ton30sthuthoi()
    Dim a, b
    a = a + 1
    b = b + 1
    Debug.Print a, b
End Sub
và thu được kết quả sau 6 phát run
1 1
2 2
3 3
4 4
5 5
6 6
Hay phết NguyenNgocThuHien nhở! Cơ mà sư phụ của cô là ai thế? :D
dùng static trong class thì còn nhiều điều hấp dẫn hơn nhiều.
 
Upvote 0
Cái ni chắc lại réo anh VetMini lên thôi :D

VBA là ngôn ngữ rất tuỳ thuộc vào moi trường dịch. Lúc xem code, ngừoi ta luôn luôn chú ý đến cái phần Options ở đầu mô đun. Kế đó là để ý các tiền tố của khai báo.

VBA có cái luật rất vô duyên là cha mẹ có quyền điều khiển con cái.
Điển hình này là 1: Để khỏi mất công chỉnh từng lệnh Dim trong hàm thành Static, ngừoi ta chỉ cần khai báo hàm Static là tất cả các biến nội của hàm trở thành static.
Tôi đoán lý do MS ra cái luật vô duyên này là vì nếu bạn không Option Explicit thì các biến trong hàm có thể dùng mà không cần khai báo; khi bạn muốn sửa chúng thành static thì phải lục từng cái ra để khai báo, cái nào sót là tèo; giải pháp của MS là cho cha mẹ (hàm) ép chúng static luôn cho tiện.

- Cái này dùng để In ra Số phiếu tiếp theo, giống như ở các Bệnh viện, bệnh nhân lấy Số Phiếu liên tục ấy nhỉ.

Tầm bậy. Làm việc kiểu này thì bệnh viện phá sản.
 
Upvote 0
em mới bắt đầu học vba, giờ muốn làm 1 bài đánh số thứ tự từ trên xuống theo nhóm liên tục.
+ giả sử cột dữ liệu cần đánh stt là A, và cột đánh stt là B thì từ :B1 B2 B3 = 111 tiếp theo B4 B5 B6 = 222........ chạy liên tục cho đến hàng cuối cùng cột A
+ Em đã viết được 1 sub để chạy, nhưng sub chỉ đúng khi cột dữ liệu bắt đầu từ A1 hoặc A2 tương ứng bắt đầu đánh số thứ tự là B1 hoặc B2. còn từ hàng tiếp theo sub chạy sai ( ví dụ cột dữ liệu từ A3 và hàng đánh stt bắt đầu từ B3)
Nhờ các bác xem và sửa lại code theo file đính kèm sao cho code có thể chạy nếu nhập vào hàng bất kỳ. Nếu code sửa như nào, các bác giải thích cho e hiểu với. thanks all

Ai giúp e bài này với ah.
 
Upvote 0
Các bác giúp em giải quyết lỗi này với:
Em có 3 class module là class1,class2,class3 và 1 module chính chạy 3 class như sau
Public Sub chinh()
Dim so As Byte
so = Worksheets("nhap").Range("a1").Value
Dim c1 As Object
If so = 1 Then
Set c1 = New Class1
c1.nhap
ElseIf so = 2 And Worksheets("nhap").Range("j1") = 0 Then
Set c1 = New Class2
c1.lcttt
ElseIf so = 2 And Worksheets("nhap").Range("j1") > 0 Then
Set c1 = New Class3
c1.chitiet
End If
Set c1 = Nothing
End Sub
Nhưng khi chạy thì nó báo lỗi "run time error 5 invalid procedure call or argument" tại dòng c1.chitiet.Nên có bác nào biết cách khắc phục thì xin chỉ giúp.Thanks
 
Upvote 0
Các bác giúp em giải quyết lỗi này với:
Em có 3 class module là class1,class2,class3 và 1 module chính chạy 3 class như sau
Public Sub chinh()
Dim so As Byte
so = Worksheets("nhap").Range("a1").Value
Dim c1 As Object
If so = 1 Then
Set c1 = New Class1
c1.nhap
ElseIf so = 2 And Worksheets("nhap").Range("j1") = 0 Then
Set c1 = New Class2
c1.lcttt
ElseIf so = 2 And Worksheets("nhap").Range("j1") > 0 Then
Set c1 = New Class3
c1.chitiet
End If
Set c1 = Nothing
End Sub
Nhưng khi chạy thì nó báo lỗi "run time error 5 invalid procedure call or argument" tại dòng c1.chitiet.Nên có bác nào biết cách khắc phục thì xin chỉ giúp.Thanks
Kiểm tra lại Class3, thành viên chitiet xem có lỗi gì không?
 
Upvote 0
em mới bắt đầu học vba, giờ muốn làm 1 bài đánh số thứ tự từ trên xuống theo nhóm liên tục.
+ giả sử cột dữ liệu cần đánh stt là A, và cột đánh stt là B thì từ :B1 B2 B3 = 111 tiếp theo B4 B5 B6 = 222........ chạy liên tục cho đến hàng cuối cùng cột A
+ Em đã viết được 1 sub để chạy, nhưng sub chỉ đúng khi cột dữ liệu bắt đầu từ A1 hoặc A2 tương ứng bắt đầu đánh số thứ tự là B1 hoặc B2. còn từ hàng tiếp theo sub chạy sai ( ví dụ cột dữ liệu từ A3 và hàng đánh stt bắt đầu từ B3)
Nhờ các bác xem và sửa lại code theo file đính kèm sao cho code có thể chạy nếu nhập vào hàng bất kỳ. Nếu code sửa như nào, các bác giải thích cho e hiểu với. thanks all

Có bác nào giúp e với, 5 ngày rồi mà e vẫn chưa nghĩ ra cách giải quyết. E up lại file ạ, file này vs bài cũ giống nhau, chưa tiến triển gì thềm.
 

File đính kèm

  • danhstt.xlsm
    34.1 KB · Đọc: 5
Upvote 0
Nhờ mọi người chỉnh giúp code sau bị trễ giây với ạ, khi có âm thanh kêu lên thì thời gian bị trễ ạ. Có cách nào để chạy âm thanh độc lập mà âm thanh vẫn đảm bảo đúng thơi gian khi bắt đầu chạy và kết thúc không ạ?
-------
Private Sub DisplayTimer()
Dim i As Long
If Not Pause Then
If Min = 0 And Sec = 0 Then
Display_Off
SubBeep
iArrTimeInfo = iArrTimeInfo + 1
If iArrTimeInfo <= UBound(ArrTimeInfo, 2) Then
BangDiem.LB_ThoiGian.Caption = ArrTimeInfo(1, iArrTimeInfo) & ":" & Format(ArrTimeInfo(2, iArrTimeInfo), "00")
If Round(iArrTimeInfo Mod 2, 0) = 0 Then
Call BatDauVaKetThucHiep
Display_On
BangDiem.LB_ThoiGian.ForeColor = &H8000&
Else
BangDiem.LB_Hiep.Caption = ThongTin.Range(Hiep).Value & "" & Round((iArrTimeInfo + 1) / 2, 0)
Call HetThoiGianNghi
BangDiem.LB_TrangThai.Caption = ThongTin.Range(SanSang).Value
BangDiem.LB_ThoiGian.ForeColor = &HFF&
End If
Else
Call BatDauVaKetThucHiep
BangDiem.LB_ThoiGian.Caption = "0:00"
BangDiem.LB_TrangThai.Caption = ThongTin.Range(KetThuc).Value
BangDiem.CB_DangThiDau.Value = False
End If
Exit Sub
ElseIf Sec = 0 And Min > 0 Then
Sec = 59: Min = Min - 1
Else
Sec = Sec - 1
End If
BangDiem.LB_ThoiGian.Caption = Min & ":" & Format(Sec, "00")
End If
End Sub
----------
Còn đây là cái code khai báo Call âm thanh bên module 2:
Declare Function sndPlaySound Lib "winmm.dll" _
Alias "sndPlaySoundA" ( _
ByVal SoundName As String, _
ByVal Flags As Long) As Long
Sub PlayWav(ByVal WavFileName As String)
Call sndPlaySound(WavFileName, 0)
End Sub
Sub BatDauVaKetThucHiep()
Call PlayWav(ThisWorkbook.Path + "\AmThanh\Moi\BatDauVaKetThuc.wav")
End Sub
----------
 
Upvote 0
Mình có làm combobox theo bài viết trên forum. Hiện tại sau khi nhập liệu ấn enter thì nó đứng im ở ô nhập nhưng mình muốn sau khi nhập xong ấn enter nó sẽ nhảy sang ô bên cạnh (xuống dưới hoặc sang phải tùy theo thiết đặt trong option) để tiếp tục nhập liệu. Mọi người giúp thêm code giúp mình với
 

File đính kèm

  • combobox (2).xls
    54 KB · Đọc: 3
Upvote 0
Chào cả nhà ạ, em có code như sau nhưng nó dài quá muốn nhờ các bạn rút gọn lại ạ.
Đây là code lấy vùng dữ liệu của 3 file excel nhập vào chung 1 sheet ở file excel khác em copy được ở trên mạng về chế biến thêm ạ ^^!

Mã:
Option Explicit
Sub noibang1()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky1.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("A1:G767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang2()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky2.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("I1:O767") = GetData(sFile, sSheet, sAddr)
End Sub

Sub noibang3()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\ky3.xlsx"
  sSheet = "G000141"
  sAddr = "C19:I785"
  Range("Q1:W767") = GetData(sFile, sSheet, sAddr)
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
  Dim pLink As String, iR As Long, iC As Long, Arr
  If Len(Dir(sFile)) Then
    Arr = Range(sAddr)
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    For iR = 1 To Range(sAddr).Rows.Count
      For iC = 1 To Range(sAddr).Columns.Count
        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr).Cells(iR, iC).Address(, , 2))
      Next iC
    Next iR
    GetData = Arr
  End If
End Function
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom