hathanh349
Thành viên mới 

			
		- Tham gia
 - 3/5/19
 
- Bài viết
 - 33
 
- Được thích
 - 5
 

 On Error Resume Next
	 On Error Goto LoiCT
' . . . .  Các Dòng Lênh  '
Err_:    Exit Sub
LoiCT: 
 If Err>0 Then
   MsgBox Err,, Error()
   Resume Err_
 End If
End Sub
	    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.DisplayAlerts = False
    Application.Calculation = xlManual
	Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.Calculation = xlAutomatic
	 Sub ManHinh (CN As  Boolean)
  Application.ScreenUpdating = CN
    Application.EnableEvents = CN
    Application.DisplayAlerts = CN
If CN Then
   '. . . .'
End If
End Sub
	
Vâng. Cảm ơn bạn đã nhận xét và đúng luân. Mình chỉ xem và cop vào. Nên nhiều lúc chưa logicNhận xét sơ bộ & có thể làm bạn phật ý:
→ Nếu đúng trình độ VBA của bạn là 'sao chép' thì chưa nên xài câu lệnh:
Cứ để nó thể hiện (những) chỗ sai sót (nếu có) để còn tìm cách khắc phụcMã:On Error Resume Next
Còn 1 cách nữa là
PHP:On Error Goto LoiCT ' . . . . Các Dòng Lênh ' Err_: Exit Sub LoiCT: If Err>0 Then MsgBox Err,, Error() Resume Err_ End If End Sub
→ Bạn có 3 trang tính mà trang nào cũng có trộn ô theo cột;
Tuy nó diêm dúa hơn đó, như khó cho bạn khi viết VBA
Theo mình thì phải có chí ít 1 trang (thu thập dữ liệu) không ô nào bị trộn như vậy
→ Các câu lệnh trong 2 nhóm
&Mã:Application.ScreenUpdating = False Application.EnableEvents = False Application.DisplayAlerts = False Application.Calculation = xlManualMã:Application.ScreenUpdating = True Application.EnableEvents = True Application.DisplayAlerts = True Application.Calculation = xlAutomatic
Nên tách riêng thành 1 macro con nhận tham biến True & False
Như
PHP:Sub ManHinh (CN As Boolean) Application.ScreenUpdating = CN Application.EnableEvents = CN Application.DisplayAlerts = CN If CN Then '. . . .' End If End Sub
Điều này tuy có vẻ dài dòng, nhưng không làm 'loãng' chương trình chính của bạn'
 On Error Goto LoiCT                    'Thay Cho Câu Lệnh Đã Xóa đi   '
' . . . .  Các Dòng Lênh của bạn  '
Err_:    Exit Sub
LoiCT:
 If Err>0 Then
   MsgBox Erl(),, Error()
   Resume Err_
 End If
End Sub
	
Cảm ơn bác đã phản hồi. Để e cố gắng tếp ahMình chỉ có khả năng giúp bạn các bước tiến hành phát hiện lỗi thôi nha:
B1: Bạn vô hiệu hóa dòng lệnh On Error Resume next
& chạy Code xem có lỗi gì không;
Trường hợp không bị báo lỗi mà kết quả sai thì mình khó giúp tiếp;
Bằng ngược lại ta sang B2:
B2: Bạn có hơn 13 dòng lệnh bắt đầu bằng With. . .
Bạn đánh số các dòng lệnh này & chú í là số không đính liền với W trong With à nha;
Sau đó sửa lại các câu lệnh của bài trên của mình như sau:
PHP:On Error Goto LoiCT 'Thay Cho Câu Lệnh Đã Xóa đi ' ' . . . . Các Dòng Lênh của bạn ' Err_: Exit Sub LoiCT: If Err>0 Then MsgBox Erl(),, Error() Resume Err_ End If End Sub
Hàm Erl() sẽ báo ta biết đang lỗi đầu tiên đang ở dòng lệnh nào (trong 'khổ ' With nào)
'. . . . . .             '
        With ActiveSheet
            .Range("B9:I300").Delete shift:=xlUp
            .Range("B9").Resize(k, 8).Value = Res
3            Lr = .Range("E" & Rows.Count).End(xlUp).Row
            For i = 9 To Lr
                If .Cells(i, 2) = .Cells(i + 1, 2) Then
                    a = i - t:              t = t + 1
4                Else
41                    .Range("B" & a & ":B" & a + t).Merge:   .Range("A" & a & ":A" & a + t).Merge
42                    .Range("C" & a & ":C" & a + t).Merge:   .Range("D" & a & ":D" & a + t).Merge
                    .Range("I" & a & ":I" & a + t).Merge:   .Range("J" & a & ":J" & a + t).Merge
                    .Range("H" & i) = .Range("G" & i):      .Range("H" & a & ":H" & a + t).Merge
                    .Range("H" & a) = Application.Sum(.Range("G" & a & ":G" & a + t))
                        t = 0: a = 0
                End If
            Next i
         End With
    ' Danh So TT
	
dòng 41 lỗi là khi gộp ô. nhưng khi e chạy code bỏ lệnh On Error Resume Next, khi ra dữ liệu nó đã lấy sai rồi. Ở tên Nông văn Quý này là chỉ đế dòng 74 thôi. nhưng ở đây lấy đến tận dòng 105. nhờ bác xem giúpDòng lệnh mang số 41 đang bị lỗi 1004:
PHP:'. . . . . . ' With ActiveSheet .Range("B9:I300").Delete shift:=xlUp .Range("B9").Resize(k, 8).Value = Res 3 Lr = .Range("E" & Rows.Count).End(xlUp).Row For i = 9 To Lr If .Cells(i, 2) = .Cells(i + 1, 2) Then a = i - t: t = t + 1 4 Else 41 .Range("B" & a & ":B" & a + t).Merge: .Range("A" & a & ":A" & a + t).Merge 42 .Range("C" & a & ":C" & a + t).Merge: .Range("D" & a & ":D" & a + t).Merge .Range("I" & a & ":I" & a + t).Merge: .Range("J" & a & ":J" & a + t).Merge .Range("H" & i) = .Range("G" & i): .Range("H" & a & ":H" & a + t).Merge .Range("H" & a) = Application.Sum(.Range("G" & a & ":G" & a + t)) t = 0: a = 0 End If Next i End With ' Danh So TT

| STT | Ho & Ten | Mã GV | ||||
| 1 | Cao Thị Huệ | CTH00 | ||||
| 2 | Cù Thị Thu | CTT00 | ||||
| 3 | Chảo Thị Vân | CTV00 | ||||
| 4 | Đoàn Thị Kiều Trang | FKT00 | ||||
| 5 | Đinh Thanh Hải | FTH00 | ||||
| 6 | Đặng Thị Ngoãn | FTN00 | ||||
| 7 | Đèo Văn An | FVA00 | ||||
| 8 | Hà Lương Thanh | HLT00 | ||||
| 9 | Hù Văn Tìm | HVT00 | ||||
| 10 | Lò Thị Xoán | LTX00 | ||||
| 11 | Lý Văn Mằn | LVM00 | ||||
| 12 | Lê Việt Phương | LVP00 | ||||
| 13 | Mai Thị Ngọc Ánh | MNA00 | ||||
| 14 | Nguyễn Đức Long | NFL00 | ||||
| 15 | Nguyễn Quý Tùng | NQT00 | ||||
| 16 | Nguyễn Thế Giang | NTG00 | ||||
| 17 | Nguyễn Thị Thuận | NTT00 | ||||
| 18 | Nông Văn Quý | NVQ00 | ||||
| 19 | Nguyễn Văn Thịnh | NVT00 | ||||
| 20 | Phạm Như Sinh | PNS00 | ||||
| 21 | Phạm Thị Liên | PTL00 | ||||
| 22 | Phạm Văn Hiệu | PVH00 | ||||
| 23 | Trần Thị Hương Xen | THX00 | ||||
| 24 | Trần Thị Mỹ Hạnh | TMH00 | ||||
| 25 | Trịnh Thị Thanh Huyền | TTH00 | ||||
| 26 | Thùng Thị Nguyệt | TTN00 | ||||
| 27 | Vũ Ngọc Hà | VNH00 | ||||
| 28 | Vương Văn Hoàn | VVH00 | ||||
| 29 | Vũ Văn Sơn | VVS00 | 
Dúng 1 sheet lưu mẩu báo cáo, code copy sheet nầy cho từng tuầnNhơ các bác xem giúp lỗi gì mà khi e xuất dữ liệu ra thì bị gộp dữ liệu từ dòng 67 đến 105. khi mà dữ liệu gốc ở sheet1 là từ dòng 82 đến 147. Càm ơn các bác nhiều ah. code em từ mày mò sao chép. các bác thông cảm
Option Explicit
Sub XYZ()
  Dim sh As Worksheet, arr(), aTuan(), res()
  Dim sRow&, i&, j&, k&, r&, t&, stt&, STuan, tuan$
  arr = Sheet1.Range("B9:X" & Sheet1.Range("F" & Rows.Count).End(xlUp).Row).Value
  aTuan = Sheet1.Range("B7:X7").Value
  STuan = Application.InputBox(Prompt:="Hay nhap so", Type:=1)
  For t = 6 To UBound(aTuan, 2)
    If STuan = aTuan(1, t) Then Exit For
  Next t
  If t > UBound(aTuan, 2) Then MsgBox ("Không tim thay tuan: " & STuan): Exit Sub
 
  Call TangToc(False)
  tuan = "Tuan" & aTuan(1, t)
  For j = 1 To Sheets.Count
    If Sheets(j).Name = tuan Then Exit For
  Next j
  If j > Sheets.Count Then
    Sheets("MauBC").Copy After:=Sheets(Sheets.Count)
    ActiveSheet.Name = tuan
  End If
  Set sh = Sheets(tuan)
  i = sh.Range("F" & Rows.Count).End(xlUp).Row
  If i > 9 Then sh.Range("A10:J" & i + 3).Clear
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 9)
  For i = 1 To sRow
    If arr(i, 1) <> Empty Then
      stt = stt + 1
      r = k + 1
      res(k + 1, 1) = stt
      res(k + 1, 2) = arr(i, 1)
      res(k + 1, 3) = arr(i, 2)
      res(k + 1, 4) = arr(i, 3)
    End If
    If arr(i, t) <> Empty Then
      If arr(i, 5) <> Empty Then
        k = k + 1
        res(k, 5) = arr(i, 4): res(k, 6) = arr(i, 5)
        res(k, 7) = arr(i, t)
        res(r, 8) = res(r, 8) + res(k, 7)
        res(r, 9) = res(r, 9) + 1
      End If
    End If
  Next i
 
  sh.Range("A9").Resize(k, 8) = res
  sh.Range("A9:J9").Copy
  sh.Range("A9").Resize(k, 10).PasteSpecial Paste:=xlPasteFormats
  Application.CutCopyMode = False
  For i = 1 To k
    If res(i, 9) > 1 Then
      For j = 1 To 10
        If j < 5 Or j > 7 Then sh.Cells(i + 8, j).Resize(res(i, 9)).Merge
      Next j
    End If
  Next i
  Call TangToc(True)
End Sub
Private Sub TangToc(ByVal bCham As Boolean)
  Application.ScreenUpdating = bCham
  Application.EnableEvents = bCham
  Application.DisplayAlerts = bCham
  If bCham Then
    Application.Calculation = xlCalculationAutomatic
  Else
    Application.Calculation = xlManual
  End If
End Sub
	Mình dự định để giành mà chừ chàng HieuCD phá bể nồi niêu hết rồi!Dúng 1 sheet lưu mẩu báo cáo, code copy sheet nầy cho từng tuần
. . . .
Xin lỗi nhé, thấy rê qua rê lại lâu quá chưa chịu cạn ly, mình không chờ được nên nhảy vào góp vuiMình dự định để giành mà chừ chàng HieuCD phá bể nồi niêu hết rồi!![]()
![]()
![]()
  
  
