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
Code bạn sai hoàn toàn thì tính tổng là sao bạn, mà tôi có thấy code bạn dùng Sumifs chổ nào đâu. Mục đích của bạn là gì có thể giải thích để anh em giúp cho.
Cám ơn Anh nhiều
Em muốn áp dụng giống code giống link sau nhưng thêm điều kiện ở cột E
http://www.giaiphapexcel.com/dienda...f-để-giảm-dung-lượng-file.101899/#post-828952
Em gửi lại file kết quả mong muốn giống cột J.
 

File đính kèm

  • Book1.xlsm
    20.1 KB · Đọc: 7
Upvote 0
Cám ơn Anh nhiều
Em muốn áp dụng giống code giống link sau nhưng thêm điều kiện ở cột E
http://www.giaiphapexcel.com/diendan/threads/code-thay-thế-hàm-sumif-để-giảm-dung-lượng-file.101899/#post-828952
Em gửi lại file kết quả mong muốn giống cột J.
Bạn xem lại 2 chỗ ghi chú trong code:
PHP:
Private Sub CommandButton1_Click()
Dim Dic As Object, sArr(), dArr(), I As Long, Tem As String
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([C8], [C8].End(xlDown)).Resize(, 6).Value2
ReDim dArr(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1) & sArr(I, 3) '<-------Chỗ này---------'
    If Not Dic.Exists(Tem) Then
        Dic.Add Tem, sArr(I, 6)
    Else
        Dic.Item(Tem) = Dic.Item(Tem) + sArr(I, 6)
    End If
Next I
For I = 1 To UBound(sArr, 1)
    dArr(I, 1) = Dic.Item(sArr(I, 1) & sArr(I, 3)) '<------và chỗ này-------------'
Next I
[I8].Resize(I - 1) = dArr
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn có nhiều vấn đề quá. Khong thể giải quyết tất cả cùng 1 lúc. Làm tham lam tức là tự phình -> tự mình bị "out of memory"
Trước mắt cứ lo vấn đề #1. Mấy cái khác tính sau.
a/ hàm đệ quy rất khó debug. Bạn có thể tìm hiểu cách kiểm soát xem nó được gọi bao nhiêu lần.
b/ string thì xem lại những chỗ lập string bằng biểu thức kiểu s = s & abc, và kiểm soát độ lớn của nó.
ví dụ:
If (Len(s) Mod 1000 = 0) Then MsgBox "Đã phình ra thêm 1000 ký tự: " & Len(s)
Em đã giải quyết được vấn đề của mình. Lỗi ở 1 dòng code khiến nó không hoạt động được như ý.
Do em thiết lập cái Application.EnableEvents = False đầu tiên và Application.EnableEvents =True tận cuối tất cả code nên đã gây lỗi. Giờ em bỏ cả hai luôn chạy như ý rồi. Dù sao thì em cũng cảm ơn anh nhiều vì đã giúp em mở rộng kiến thức và cho em lời khuyên khi gặp vấn đề :)
 
Upvote 0
Tại sheet HD em muốn xóa các cell và khối cell : "B11:B14", "F3", "A3", "B19", "E29", "C31"
Em có viết code như sau, nhưng nó báo lỗi, nhờ các anh/chị giúp đỡ
PHP:
Sub XoaSoLieu()
    Sheets("HD").Select
    Range("B11:B14", "F3", "A3", "B19", "E29", "C31").Select
    Selection.ClearContents
    Range("F1").Select
End Sub
Em cảm ơn
 
Upvote 0
Tại sheet HD em muốn xóa các cell và khối cell : "B11:B14", "F3", "A3", "B19", "E29", "C31"
Em có viết code như sau, nhưng nó báo lỗi, nhờ các anh/chị giúp đỡ
PHP:
Sub XoaSoLieu()
    Sheets("HD").Select
    Range("B11:B14", "F3", "A3", "B19", "E29", "C31").Select
    Selection.ClearContents
    Range("F1").Select
End Sub
Em cảm ơn
Dòng này:
Range("B11:B14", "F3", "A3", "B19", "E29", "C31")
Thử bỏ các dấu nháy kép giữa chỉ chừa lại 2 dấu đầu và cuối thôi.
 
Upvote 0
Em có file tính dùng VBA dùng được rồi, bài toán em đặt ra là cần tách file dữ liệu (data) thành 1 file riêng. Nhưng em không rõ phải sửa code VBA như thế nào.
Các bác hỗ trợ em với.
File đính kèm có 2 sheet thì em cần tách sheet "Data_cable" thành file riêng tên là e-data.xls
 

File đính kèm

  • Cable-CONDO.xls
    1,015 KB · Đọc: 9
Upvote 0
Em có file tính dùng VBA dùng được rồi, bài toán em đặt ra là cần tách file dữ liệu (data) thành 1 file riêng. Nhưng em không rõ phải sửa code VBA như thế nào.
Các bác hỗ trợ em với.
File đính kèm có 2 sheet thì em cần tách sheet "Data_cable" thành file riêng tên là e-data.xls
Trong ổ D, tạo 1 Folder mới với tên là DIEN_2018.
Tại sheet Cable cho nó một Shapes rồi gán code sau vào thử xem:
Lưu ý: Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu.

Mã:
Sub ThuXuatFile_Moi()
    Dim Path As String
    Dim filename As String
    Dim FileMoi
 
    Path = "D:\DIEN_2018\"
    filename = Sheet1.Range("K4") 'gõ tên File càn luu vào K4
    Set FileMoi = Workbooks.Add
    Sheet1.Copy Before:=FileMoi.Sheets(1)
 
    ActiveWorkbook.SaveAs filename:=Path & filename & ".xls", FileFormat:=xlNormal
    ActiveWindow.Close

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Trong ổ D, tạo 1 Folder mới với tên là DIEN_2018.
Tại sheet Cable cho nó một Shapes rồi gán code sau vào thử xem:
Lưu ý: Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu.

Mã:
Sub ThuXuatFile_Moi()
    Dim Path As String
    Dim filename As String
    Dim FileMoi
 
    Path = "D:\DIEN_2018\"
    filename = Sheet1.Range("K4") 'gõ tên File càn luu vào K4
    Set FileMoi = Workbooks.Add
    'ThisWorkbook.Sheets("Data_Cable").Copy Before:=FileMoi.Sheets(1)
    Sheet1.Copy Before:=FileMoi.Sheets(1)
 
    ActiveWorkbook.SaveAs filename:=Path & filename & ".xls", FileFormat:=xlNormal
    ActiveWindow.Close
       Sheet2.Range("J4").Select
    Set FileMoi = Nothing
End Sub
em cần 2 file đặt chung 1 folder, và không cố định đường dẫn (như bác đang là D:\Dien2018...) để có thể linh hoạt hơn trong sử dụng (share cho người khác, đặt trong folder dự án khác nhau...)
bác xem có thể sửa lại giúp em được không?
 
Upvote 0
em cần 2 file đặt chung 1 folder, và không cố định đường dẫn (như bác đang là D:\Dien2018...) để có thể linh hoạt hơn trong sử dụng (share cho người khác, đặt trong folder dự án khác nhau...)
bác xem có thể sửa lại giúp em được không?
Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu, khi lưu thì nó hiện hộp thoại bạn muốn lưu chỗ nào là tùy bạn.

Mã:
Sub Luu_TuyChon()
    Dim TenFile As String
    Dim FileMoi As Object
    TenFile = Sheet1.Range("K4")
    Set FileMoi = Workbooks.Add
    Sheet1.Copy Before:=FileMoi.Sheets(1)
    Application.Dialogs(xlDialogSaveAs).Show TenFile
    ActiveWindow.Close
End Sub
 
Upvote 0
Tại K4 của sheet Data_Cable bạn gõ tên File cần lưu, khi lưu thì nó hiện hộp thoại bạn muốn lưu chỗ nào là tùy bạn.

Mã:
Sub Luu_TuyChon()
    Dim TenFile As String
    Dim FileMoi As Object
    TenFile = Sheet1.Range("K4")
    Set FileMoi = Workbooks.Add
    Sheet1.Copy Before:=FileMoi.Sheets(1)
    Application.Dialogs(xlDialogSaveAs).Show TenFile
    ActiveWindow.Close
End Sub

Em hỏi thêm chút nữa,

Nếu đã tách 2 file riêng cùng folder(1 là bảng tra, 1 là data riêng tên e-data.xls). VBA nằm ở file bảng tra thì sửa code này như thế nào để nó lấy dữ liệu để tra trong file data kia.

Mã:
ThisWorkbook.Worksheets("Data_Cable")
 
Upvote 0
Em hỏi thêm chút nữa,

Nếu đã tách 2 file riêng cùng folder(1 là bảng tra, 1 là data riêng tên e-data.xls). VBA nằm ở file bảng tra thì sửa code này như thế nào để nó lấy dữ liệu để tra trong file data kia.

Mã:
ThisWorkbook.Worksheets("Data_Cable")
Trong code trên:
- Tôi dùng Sheet1 (gọi là CodeName).
- Tôi dùng Data_Cable (gọi là Sheet Name hay Tab Sheet)

2 dòng code này sử dụng cái nào cũng được, nhưng phải gõ dấu nháy phía trước nó để bỏ đi 1 dòng code (nó hiện màu xanh), như hình.
Mã:
'ThisWorkbook.Sheets("Data_Cable").Copy Before:=FileMoi.Sheets(1)

    Sheet1.Copy Before:=FileMoi.Sheets(1)

A_LuuSheet.JPG
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • Ladder size Calculation v1.xls
    53 KB · Đọc: 8
  • e-Data.xls
    953.5 KB · Đọc: 7
Upvote 0
hi bác @be09

Em có mò sửa lại code file trên để tách rời 2 file: bảng tính - data.
Nhưng gặp vấn đề ở đây là file data file luôn mở khi chạy bảng tính.
Em có đọc bài này http://www.giaiphapexcel.com/vbb/sh...-liệu-từ-1-file-đang-đóng&p=260991#post260991
Nhưng không rõ áp dụng trong trường hợp của em thì nên sử dụng như thế nào?
Bác có thể hướng 1 chút giúp em được không?
Vấn đề không đơn giản như đã trình bầy ở chủ đề này - vài dòng code tách sheet sang tập tin mới..
1. Với code hiện có thì bạn tách được sheet Data_cable sang tập tin mới e-data.xls. Nhưng sheet Data_Cable vẫn tồn tại trên tập tin cũ và code hàm DK vẫn lấy giá trị từ sheet Data_Cable của tập tin cũ. Vậy tạo thêm e-data.xls để làm cảnh?
2. Bạn có thể sửa code của DK để lấy dữ liệu từ sheet Data_Cable của tập tin e-data.xls, thậm chí là lấy từ tập tin đóng, nhưng nếu vẫn để lại sheet Data_Cable trong tập tin cũ thì tách thêm nó ra tập tin mới e-data.xls để làm gì?
3. Nếu bạn đã tách Data_Cable sang tập tin e-data.xls và bỏ Data_Cable trong tập tin cũ thì bạn sẽ có thực trạng như ở tập tin Ladder size calculation vă.xls. Tức các danh sách thả trong cột E mất tác dụng. Bạn không chọn được gì khác. Nguyên nhân là các Name mà bạn có (Formulas -> Name Manager) bị lỗi hết do tham chiếu tới sheet Data_Cable mà bạn đã xóa.
4. Có thể viết code làm: tách Data_Cable sang e-data.xls -> sửa DK để lấy dữ liệu từ e-data.xls -> xóa Data_Cable trong tập tin cũ -> sửa name để tham chiếu sang e-data.xls. Nhưng lúc đó để có thể dùng danh sách thả trong cột E thì vẫn phải mở tập tin e-data.xls. Nếu tập tin đóng thì danh sách mất tác dụng, không chọn được gì mới. Nếu chấp nhận luôn luôn mở tập tin e-data.xls khi làm việc với tập tin cũ thì tại sao phải sửa thành code lấy dữ liệu từ tập tin đóng?

Tôi chỉ lưu ý để ý thức cho bạn cái mà bạn vẫn chưa nhìn thấy. Tôi không tham gia viết code.
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề không đơn giản như đã trình bầy ở chủ đề này - vài dòng code tách sheet sang tập tin mới..
...
Tôi chỉ lưu ý để ý thức cho bạn cái mà bạn vẫn chưa nhìn thấy. Tôi không tham gia viết code.

Tks bác đã góp ý. Chúc bác năm mới an khang, thịnh vượng!
Mục đích chính của việc tách riêng Data là để gửi bảng tính cho người khác (khi họ yêu cầu file excel). Tách riêng data thì họ sẽ chỉ xem file tính mà không thể chỉnh sửa (giữ bản quyền bảng tính của em). Thực ra nếu không cần viết VBA thì tham chiếu (reference) nó dễ dàng hơn, nhưng em thấy là nếu viết bằng công thức-hàm của excel khá phức tạp, sau cần sửa đổi gì đó mất công dò lại.

Có thể viết code làm: tách Data_Cable sang e-data.xls -> sửa DK để lấy dữ liệu từ e-data.xls -> xóa Data_Cable trong tập tin cũ -> sửa name để tham chiếu sang e-data.xls. Nhưng lúc đó để có thể dùng danh sách thả trong cột E thì vẫn phải mở tập tin e-data.xls. Nếu tập tin đóng thì danh sách mất tác dụng, không chọn được gì mới. Nếu chấp nhận luôn luôn mở tập tin e-data.xls khi làm việc với tập tin cũ thì tại sao phải sửa thành code lấy dữ liệu từ tập tin đóng?[
Bác nhắc em mới để ý đến, để em sửa lại phần Name. Nếu phương án sửa tham chiếu về tập tin đóng chạy được thì em sẽ chuyển phần Name (phục vụ cho Data Validation) về chung file bảng tính chọn, file Data chỉ để thông số của dây cáp. Em cũng muốn bảng tính nó hoàn thiện dần, tốt hơn. Em cũng không kinh nghiệm nhiều về code (thời sinh viên em cũng mày mò 1 ít Matlab) nên mong các bác chỉ bảo thêm.
 
Upvote 0
hi bác @be09

Em có mò sửa lại code file trên để tách rời 2 file: bảng tính - data.
Nhưng gặp vấn đề ở đây là file data file luôn mở khi chạy bảng tính.
Em có đọc bài này http://www.giaiphapexcel.com/vbb/sh...-liệu-từ-1-file-đang-đóng&p=260991#post260991
Nhưng không rõ áp dụng trong trường hợp của em thì nên sử dụng như thế nào?
Bác có thể hướng 1 chút giúp em được không?
Tôi thấy bạn đưa cái File này: Ladder size Calculation v1, khác với sheet gốc mà không diễn giải nên chẳng hiểu gì ráo.
Còn đưa cái Link lấy dữ liệu File đang đóng, cả 2 vấn đề thấy không có liên quan gì với nhau nên cũng chẳng hiểu gì luôn.

Bạn nên mở Topic mới có ví dụ thực tế và giải thích cái cần rỏ ràng hơn, để các thành viên có hiểu mới giúp được tập trung hơn.
 
Upvote 0
Em chào các anh, em mong các anh giúp em vấn đề này với ạ :
Em cần gửi email phiếu lương cho khoảng 500 anh em. Em có sưu tầm được 1 code về tự động gửi email trong excel, tuy nhiên code đó gửi mail theo từng sheet riêng rẽ một. Mà file dữ liệu gửi của em nó nằm trong 1 sheet, và dữ liệu của 1 người đều đồng nhất mỗi người 31 dòng. Em muốn gửi thông tin từng người tới từng địa chỉ email của người đó. ( Em dùng OUTLOOK ạ )
Em mong các anh giúp em ạ
Mã:
Sub Send_Files()
'Working in 2000-2007
Dim OutApp As Object
Dim OutMail As Object
Dim sh As Worksheet
Dim cell As Range, FileCell As Range, rng As Range
With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With
Set sh = Sheets("Sheet1")
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
For Each cell In sh.Columns("B").Cells.SpecialCells(xlCellTypeConstants)
    'Enter the file names in the C:Z column in each row
    Set rng = sh.Cells(cell.Row, 1).Range("C1:Z1")
    If cell.Value Like "?*@?*.?*" And Application.WorksheetFunction.CountA(rng) > 0 Then
        Set OutMail = OutApp.CreateItem(0)
        With OutMail
            .To = cell.Value
            .Subject = "Testfile"
            .Body = "Hi " & cell.Offset(0, -1).Value
            For Each FileCell In rng.SpecialCells(xlCellTypeConstants)
                If Trim(FileCell) <> "" Then
                    If Dir(FileCell.Value) <> "" Then
                        .Attachments.Add FileCell.Value
                    End If
                End If
            Next FileCell
            .Send
            'Or use Display
        End With
        Set OutMail = Nothing
    End If
Next cell
Set OutApp = Nothing
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub
 

File đính kèm

  • File mẫu test.xlsx
    12.3 KB · Đọc: 4
Upvote 0
Trong File mình đang sử dụng có nhiều sub nó giống nhau ... giờ mình muốn viết lại nó thành một cái Hàm bao quát nhất có thể sử dụng cho nhiều trường hợp khác nhau ... mà đang lúng túng xử lý For next xong nối các chuỗi lại ... Vì vậy Úp bài nhờ các bạn trợ giúp xử lý dùm

1/ Code mẫu nếu sử dụng 1 Vòng For thì Ok ... nhưng khi Mình mở rộng Mảng Arr() thì phải điều chỉnh lại code mất công quá
chuỗi Qry sau mỗi lần For tại F1
Mã:
Private Sub Test_Mau()
    Dim Arr(), i As Long, x1, x2
    Dim Qry As String
    Arr = Range("A4:B100").Value
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 1) <> "" Then
            x1 = GetValue(Arr(i, 1))
            x2 = GetValue(Arr(i, 2))
            MsgBox x1
            Qry = "INSERT INTO Manh2 VALUES(" _
                & i & ", " & x1 & ", " & x2 & ")"
            Range("F1").Value = Qry
        End If
    Next
End Sub
2/ Code sau Mình muốn cho nó vào Mảng Động .... có nghĩa mình muốn thêm hay bớt cột thì duyệt For ở dưới nó tự lấy theo và nối chuỗi đó vào Qry giống như sub Trên ... Chuỗi nối theo thứ tự tại F2
Mã:
Private Sub Test_NhoXuLy()
    Dim Arr(), i As Long, j As Long, n
    Dim Res(), x1, x2
    Dim Qry As String
    Arr = Range("E4:I100").Value                            ''mang nay co the then nhieu cot hay giam bot
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 1) <> "" Then
            For j = 1 To UBound(Arr, 2)                     ''duyet For i, J lam sao cho no lay tuong ung voi so cot cua mang
                'x1 = GetValue(Arr(i, 1))
                'x2 = GetValue(Arr(i, 2))                   ''Bo het kieu nay
                'MsgBox " OK"                               ''Gan mang Arr(i,j) lam sao vao Qry noi cac chuoi lai voi nhau nhu sub Test_Mau
                Qry = "INSERT INTO Manh2 VALUES(" _
                    & i & ", " & x1 & ", " & x2 & ")"
                Range("F2").Value = Qry                     ''Cac chuoi sau khi noi lai trong mang
            Next
        End If
    Next
End Sub
Mình đang lúng túng xử lý ở Mục 2 làm sao duyệt For mà bỏ hết x1,x2,... xn đi mà nó tự nối chuỗi vào Qry như mục 1
Xin cản ơn
 

File đính kèm

  • Test.rar
    14.4 KB · Đọc: 6
Upvote 0
Qry = " INSERT INTO Manh2 VALUES( " & i
For j = 1 To UBound(Arr, 2) 'duyet For i, J lam sao cho no lay tuong ung voi so cot cua mang
Qry = Qry & ", " & GetValue(Arr(i, j))
Next
Qry = Qry & " )"
Range("F2").Value = Qry 'Cac chuoi sau khi noi lai trong mang

1. đây là giả sử câu insert của bạn khong cần tên trường (số trường insert tương đương với mặc định)

2. cũng giả sử rằng cái hàm GetValue của bạn nó tự biết thêm dấu nháy cho các dữ liệu chuỗi.
 
Lần chỉnh sửa cuối:
Upvote 0
Qry = " INSERT INTO Manh2 VALUES( " & i
For j = 1 To UBound(Arr, 2) 'duyet For i, J lam sao cho no lay tuong ung voi so cot cua mang
Qry = Qry & ", " & GetValue(Arr(i, j))
Next
Qry = Qry & " )"
Range("F2").Value = Qry 'Cac chuoi sau khi noi lai trong mang

1. đây là giả sử câu insert của bạn khong cần tên trường (số trường insert tương đương với mặc định)

2. cũng giả sử rằng cái hàm GetValue của bạn nó tự biết thêm dấu nháy cho các dữ liệu chuỗi.
Mình đang suy nghĩ là nếu ta không sử dụng phương thức insert ... mà ta sử dụng phương thức sau
Mã:
Rst.Open tableName, MyString, adOpenStatic, adLockOptimistic
For i = 1 To UBound(Res, 1)  
        Rst.AddNew
        For j = 1 To Rst.Fields.Count - 1
            Rst.Fields(j) = Res(i, j)
        Next j  
Next i
Rst.Update
Thì giữa 2 cái đó áp dụng cho trường hợp nào sẻ yêu việt hơn vv...
Tại vì code két mình tự học và bắt trước người ta làm sao mình làm vậy nếu chạy thấy lỗi thì tìm cách sửa nên ko hiểu hết được bản chất thật sự của 2 cách trên
Mong bạn chỉ thêm ... Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom