Chuyên mục xử lý, gỡ rối code VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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,970
Nhờ AE chỉnh sửa hoặc thêm code (code này mình tìm được trên diền đàn)
1. Hiện tại code không lấy được dữ liệu bên sheet CSDL DM ở cột D nếu có dấu = ở trước.
2. Nếu bổ dầu bằng thì lấy được dữ liệu nhưng ở cột G lại thiếu dấu = để chạy công thức. nhờ ae xem giúp.
Có ai không?
 
Upvote 0
Dữ liệu được thêm vào sheet TonVatTu, lấy dữ liệu từ 3 sheet BTP1, Son_PX1, Son_cty. Dữ liệu trong sheet Son_PX1 trùng mã vật tư với sheet BTP1 và cột Sơn tím thuộc sheet Son_PX1 trùng với cột BTP2.7S1 trong sheet BTP1 thì sẽ lấy dữ liệu trong sheet Son_PX1. Tương tự trong sheet Son_cty nếu trùng như thế thì sẽ lấy dữ liệu trong sheet Son_cty và bỏ qua dữ liệu trong sheet BTP1 ạ.

PHP:
 ' LAY SO LIEU SHEET BTP1
 wsBTP1.Select
    Cells(csHangTieuDe, csCotMaVatTu).End(xlDown).Select
    intSoLuongHang = ActiveCell.Row - csHangTieuDe

    Cells(csHangTieuDe, csCotBatDauChuyen).End(xlToRight).Select
    intSoLuongCot = ActiveCell.Column - csCotBatDauChuyen + 1

    For H = 0 To intSoLuongHang - 1
        For C = 0 To intSoLuongCot - 1

            Set rgDuLieu = Cells(csHangTieuDe + 1 + H, csCotBatDauChuyen + C)

            If (rgDuLieu.Value <> 0) Then
                intCount = intCount + 1

                rgTieuDe_NgayChot.Offset(intCount, 0).Value = NgayChot

                MaBeMat = "_"
                rgTieuDe_MaBeMat.Offset(intCount, 0).Value = MaBeMat

                ' Chuyen doi ma Phoi sang ma chi tiet thuong
                MaVatTu = Cells(rgDuLieu.Row(), csCotMaVatTu)
                MaKho = Cells(csHangTieuDe, rgDuLieu.Column())

                Call DieuChinhMa(MaVatTu, "", MaKho, MaVatTuDC, "", MaKhoDC)
                rgTieuDe_MaVatTu.Offset(intCount, 0).Value = MaVatTuDC
                rgTieuDe_MaKho.Offset(intCount, 0).Value = MaKhoDC

                ' So luong
                DonVi = Cells(rgDuLieu.Row(), csCotDonVi)
                SoLuong = rgDuLieu.Value
                If SoLuong < 0 Then
                    MsgBox ("Bang BTP1, kiem tra lai ma " & MaVatTu & " tai kho " & MaKho & " bi am " & SoLuong)
                End If
                If DonVi <> "kg" Then
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = SoLuong
                Else
                    'Quy doi so luong
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = QuyDoiVatTuTuKgSangCai(MaVatTu, SoLuong)
                End If
            End If
NextC1:
    Next C
NextH1:
    Next H

     ' LAY SO LIEU SHEET Son_Cty
      
    wsSonMaCty.Select
    Cells(csHangTieuDe, csCotMaVatTu).End(xlDown).Select
    intSoLuongHang = ActiveCell.Row - csHangTieuDe

    Cells(csHangTieuDe, csCotBatDauChuyen).End(xlToRight).Select
    intSoLuongCot = ActiveCell.Column - csCotBatDauChuyen + 1

    For H = 0 To intSoLuongHang - 1
        For C = 0 To intSoLuongCot - 1

            Set rgDuLieu = Cells(csHangTieuDe + 1 + H, csCotBatDauChuyen + C)

            If (rgDuLieu.Value <> 0) Then
                intCount = intCount + 1

                rgTieuDe_NgayChot.Offset(intCount, 0).Value = NgayChot

                MaVatTu = Cells(rgDuLieu.Row(), csCotMaVatTu)
                ' DOI TEN BE MAT SANG MA BE MAT
                MaBeMat = WorksheetFunction.VLookup(Cells(csHangTieuDe, rgDuLieu.Column()), tblMaBeMatChiTiet, 2, 0)
                MaKho = csMaKhoSonCty

                ' Chuyen doi ma Phoi sang ma chi tiet thuong
                Call DieuChinhMa(MaVatTu, MaBeMat, MaKho, MaVatTuDC, MaBeMatDC, MaKhoDC)
                rgTieuDe_MaVatTu.Offset(intCount, 0).Value = MaVatTuDC
                rgTieuDe_MaBeMat.Offset(intCount, 0).Value = MaBeMatDC
                rgTieuDe_MaKho.Offset(intCount, 0).Value = MaKhoDC

                ' So luong
                DonVi = Cells(rgDuLieu.Row(), csCotDonVi)
                SoLuong = rgDuLieu.Value
                If SoLuong < 0 Then
                    MsgBox ("Bang Son_Cty, kiem tra lai ma " & MaVatTu & "-" & MaBeMat & " tai kho " & MaKho & " bi am " & SoLuong)
                End If
                If DonVi <> "kg" Then
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = SoLuong
                Else
                    'Quy doi so luong
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = QuyDoiVatTuTuKgSangCai(MaVatTu, SoLuong)
                End If

            End If
NextC3:
    Next C
NextH3:
    Next H


    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' LAY SO LIEU SHEET Son_PX1
    wsSonMaPX1.Select
    Cells(csHangTieuDe, csCotMaVatTu).End(xlDown).Select
    intSoLuongHang = ActiveCell.Row - csHangTieuDe

    Cells(csHangTieuDe, csCotBatDauChuyen).End(xlToRight).Select
    intSoLuongCot = ActiveCell.Column - csCotBatDauChuyen + 1

    For H = 0 To intSoLuongHang - 1
        For C = 0 To intSoLuongCot - 1

            Set rgDuLieu = Cells(csHangTieuDe + 1 + H, csCotBatDauChuyen + C)

            If (rgDuLieu.Value <> 0) Then
                intCount = intCount + 1

                rgTieuDe_NgayChot.Offset(intCount, 0).Value = NgayChot

                MaVatTu = Cells(rgDuLieu.Row(), csCotMaVatTu)
                ' DOI TEN BE MAT SANG MA BE MAT
                MaBeMat = WorksheetFunction.VLookup(Cells(csHangTieuDe, rgDuLieu.Column()), tblMaBeMatChiTiet, 2, 0)
                MaKho = csMaKhoSonPX1

                ' Chuyen doi ma Phoi sang ma chi tiet thuong
                Call DieuChinhMa(MaVatTu, MaBeMat, MaKho, MaVatTuDC, MaBeMatDC, MaKhoDC)
                rgTieuDe_MaVatTu.Offset(intCount, 0).Value = MaVatTuDC
                rgTieuDe_MaBeMat.Offset(intCount, 0).Value = MaBeMatDC
                rgTieuDe_MaKho.Offset(intCount, 0).Value = MaKhoDC

                ' So luong
                DonVi = Cells(rgDuLieu.Row(), csCotDonVi)
                SoLuong = rgDuLieu.Value
                If SoLuong < 0 Then
                    MsgBox ("Bang Son_PX1, kiem tra lai ma " & MaVatTu & "-" & MaBeMat & " tai kho " & MaKho & " bi am " & SoLuong)
                End If
                If DonVi <> "kg" Then
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = SoLuong
                Else
                    'Quy doi so luong
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = QuyDoiVatTuTuKgSangCai(MaVatTu, SoLuong)
                End If

            End If
NextC4:
    Next C
NextH4:
    Next H
Xem kết quả mẫu mà vẫn không hiểu dữ liệu kết quả từ đâu có.
Nếu chỉ tìm mã thì được 5 mã:
KE07.N ----------200
KE03.O ----------1000
KE03.TAY ----------1000
KE07.N -----------150
KEEX07.TS -----------192
 
Upvote 0
Xem kết quả mẫu mà vẫn không hiểu dữ liệu kết quả từ đâu có.
Nếu chỉ tìm mã thì được 5 mã:
KE07.N ----------200
KE03.O ----------1000
KE03.TAY ----------1000
KE07.N -----------150
KEEX07.TS -----------192
File của em nặng quá không tải lên được, dữ liệu thì lấy ở 5 sheet khác nhưng chỉ có dữ liệu trung ở 3 sheet em nói ở trên. Hiện tại thì mỗi lần chạy xong là em phải chạy thêm 1 macro để lọc dữ liệu trùng nữa nên hơi mất thời gian nên em muốn viết thêm vào phần lấy dữ liệu để chạy 1 lần là có kết quả luôn. Anh có mail không em gửi qua mail cho anh để xem cho rõ hơn.
 
Upvote 0
Xem kết quả mẫu mà vẫn không hiểu dữ liệu kết quả từ đâu có.
Nếu chỉ tìm mã thì được 5 mã:
KE07.N ----------200
KE03.O ----------1000
KE03.TAY ----------1000
KE07.N -----------150
KEEX07.TS -----------192
Anh ơi, anh xem hộ em file đính kèm, hiện tại ở cột mã vật tư có 2 mã là KEEX03_MDO là trùng nhau, bây giờ em muốn xóa dòng KEEX03_MDO có mã bề mặt là "_" thì làm thế nào ạ. Em cảm ơn.
 

File đính kèm

Upvote 0
tôi có vòng lặp

PHP:
sub news()
'
If vianboolean = True Then Exit Sub

' code

Application.OnTime Now + TimeValue("00:10:00"), "News"
end sub

và button thay đổi trạng thái

PHP:
Private Sub CommandButton1_Click()
vianboolean = True
ens sub

button gọi marco chạy lại

PHP:
Sub viannews()
vianboolean = False
Call News
End Sub

Vấn đề ở đây là macro của tôi sẽ bị lỗi nếu như tôi chạy sub viannews trước khi sub news trước bị exit thì nó chạy 2 cái sub song song, cái này giải quyết như thế nào mọi người giúp tôi với!!![/PHP]
 
Upvote 0
Mình tham khảo một đoạn codec của một bạn cao thủ trên diễn đàn rồi xào lại nhưng lại bị lỗi ở dòng If data1(i, 2).Value = data2(1, 1).Value Then mà mình không hiểu vì sao, mong mọi người giải thích giúp. Cảm ơn mọi người!
Sub DropDown1_Change()
Dim data(), data1()
Dim data2()
data2 = Sheet2.Range("P6:Q6").Value
iR = Sheet1.Range("D" & Rows.Count).End(xlUp).Row
If iR < 4 Then Exit Sub
data = Sheet1.Range("B5:M" & iR).Value
iR = UBound(data, 1)
ReDim data1(1 To iR, 1 To 12)
For i = 1 To iR
If data1(i, 2).Value = data2(1, 1).Value Then
Sheet1.Range("B" & i & ":M" & i).Value = data1()
End If
Sheet2.Range("B" & i & ":M" & i).Value = data1()
Next i
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Mình tham khảo một đoạn codec của một bạn cao thủ trên diễn đàn rồi xào lại nhưng lại bị lỗi ở dòng If data1(i, 2).Value = data2(1, 1).Value Then mà mình không hiểu vì sao, mong mọi người giải thích giúp. Cảm ơn mọi người!
PHP:
 Sub DropDown1_Change()
     ' . . . . . . . . . '
 End Sub

Thường thì các macro tác dụng lên trang tính nào đó; & macro này của bạn cũng không ngoại lệ
Nhưng bạn chưa đưa trang tính lên thì bạn giống như bảo mọi người làm thầy bói rồi còn gì?

 
Upvote 0
Bỏ .Value đi thì hết lỗi dòng đó nhưng mấy dòng dưới lỗi tiếp...

Mình cần tìm hiểu và nắm chắc căn bản đã.
Từ cách dùng biến, điều khiển đối tượng Range (thuộc tính, phương thức), rồi đến Array.

Đọc tạm bài #4-6-10.

Cần học cách cẩn thận với từ ngữ trước đã. Chỉ riêng có từ "code" mà cũng không biết đánh vần thì căn bản quái gì nữa.
Mình tham khảo một đoạn codec của một bạn cao thủ trên diễn đàn rồi xào lại ...
 
Upvote 0
Mình tham khảo một đoạn code của 1 cao thủ trên diễn đàn rồi xào lại nhưng lại bị lỗi ở dòng If data1(i, 2).Value = data2(1, 1).Value Then
mà mình không hiểu vì sao, mong mọi người giải thích giúp.
PHP:
Sub DropDown1_Change()
 Dim data(), data1(), data2()

 data2 = Sheet2.Range("P6:Q6").Value
 iR = Sheet1.Range("D" & Rows.Count).End(xlUp).Row
 If iR < 4 Then Exit Sub
 data = Sheet1.Range("B5:M" & iR).Value
 iR = UBound(data, 1)
 ReDim data1(1 To iR, 1 To 12)
 For i = 1 To iR
    If data1(i, 2).Value = data2(1, 1).Value Then
      Sheet1.Range("B" & i & ":M" & i).Value = data1()
    End If
    Sheet2.Range("B" & i & ":M" & i).Value = data1()
 Next i
End Sub
Thứ nhất: Bạn chưa cho biết nó báo lỗi như thế nào?
Hình như bạn chưa nạp dữ liệu cho mảng data1() mà, fải không? Vậy làm sao thỏa câu lệnh đó được?
 
Upvote 0
Thứ nhất: Bạn chưa cho biết nó báo lỗi như thế nào?
Hình như bạn chưa nạp dữ liệu cho mảng data1() mà, fải không? Vậy làm sao thỏa câu lệnh đó được?

Như bài #1320 đã nêu ra, đoạn code ấy sai nhiều lắm, về cả thuật toán lẫn thuật ngữ.
Thuật ngữ:
data1(i,2).Value là thuật ngữ truy vấn thuộc tính Value của phần tử dòng i, cột 2 của mảng data1
Mảng data1 là mảng 2 chiều. Vì không được xác định kiểu cho nên phần tử data1(i,2) sẽ có kiểu Variant. Vì chưa gán trị cho nên VBA chưa xác định được kiểu của nó sẽ có thuộc tính Value hay không.
Thuật toán:
như bạn đã nêu ra, data1 chưa được gán trị cho nên đem nó ra so sánh chả có nghĩa lý gì cả.
 
Upvote 0
Hiện tại em có 2 file excel, em muốn copy mã nhân viên và tên nhân viên từ file PXKhoan_2017 sang file PXKhoan_Test thì làm thế nào ạ. Và cho em hỏi là có cách nào copy mà không cần mở file không ạ. Em cảm ơn.
 

File đính kèm

Upvote 0
Em có dữ liệu dạng aaxbbbW trong đó 2 chữ màu đỏ là không đổi, aa, bbb là số (có thể là 1x18W, 10x200W). Kết quả em cần là tích của 2 số aa và bbb
Trong excel thì em dùng hàm FIND để tìm vị trí của x W rồi từ đó dùng hàm MID, LEFT, RIGHT để tách các số ra.

Chuyển sang VBA thì phương thức tìm kiếm FIND trong VBA lại không như trong excel. Các bác trợ giúp em trường hợp này với
 
Upvote 0
Bạn xài hàm tự tạo này:
PHP:
Function Tich(StrC As String) As Double
 Dim VTr As Byte, GPE As Double, COM As Double

 VTr = InStr(StrC, "x")
 If VTr Then
    GPE = CDbl(Left(StrC, VTr - 1))
    StrC = Mid(StrC, VTr + 1, Len(StrC))
    COM = CDbl(Left(StrC, Len(StrC) - 1))
    Tich = GPE * COM
 End If
End Function

Tich(25.5x13.5W) => 334.25
 
Upvote 0
Chắc bạn copy từ sheet BangLuong & Paste vào sheet đó luôn hả?
Mã:
Public Sub GPE_()
Dim cn As Object, Str, Path As String
Path = ThisWorkbook.Path & "\PXKhoan_201712.xlsx"
Set cn = CreateObject("ADODB.Connection")
Str = "Select * from [BangLuong$B5:C] where f1 is not null"
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Path & ";Extended Properties=""Excel 12.0;HDR=No"";"
Sheets("BangLuong").Range("B5").CopyFromRecordset cn.Execute(Str)
End Sub
Vâng anh, copy mã nhân viên và tên nhân viên từ sheet BangLuong của PXKhoang_2017 vào sheet BangLuong của PXKhoan_Test. À anh cho em hỏi thêm là, bây giờ em có 10 file của mỗi phân xưởng riêng thì có cách nào chạy 1 lần mà tự động copy theo từng phân xưởng không anh. Hiện tại mỗi phân xưởng nằm cùng một thư mục quản lý và chia ra từng thư mục theo phân xưởng. Có một vấn đề nữa là 2 file cần copy dữ liệu không nằm trong một thư mục, như hình ở dưới thì dữ liệu cần copy nằm trong các phân xưởng, còn file để paste dữ liệu thì nằm trong thư mục Templates anh ạ.
Capturef.png
 
Lần chỉnh sửa cuối:
Upvote 0
Em chào mọi người!
Nhờ mọi người giải đáp giúp em thắc mắc này ạ!
Em có một bảng dữ liệu muốn dùng lệnh auto sort theo thứ tự tăng dần. Em dùng code bên dưới.
Giá trị cột B em cần sort vlookup từ sheet khác, sẽ thay đổi theo thời gian chứ em không tự nhập tay giá trị này trực tiếp vào B.

Tuy nhiên em gặp vấn đề là khi giá trị cột B thay đổi thì code không chạy. Chỉ khi nào em nhấp chuột hoặc bấm enter hay nhập trực tiếp vào một ô bất kỳ ở cột B thì code mới chạy sort lại theo đúng thứ tự.

Vậy em làm cách nào để chỉ cần thay đổi giá trị ở bảng mà cột B vlookup qua thì code chạy luôn chứ không cần em bấm chuột vào cột B ạ?

Mong mọi người chỉ giáo giúp em với!!!!
Em cảm ơn ạ!!!!!!!

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Range("B:B")) Is Nothing Then
Range("B1").Sort Key1:=Range("B2"), _
Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom
End If
End
 
Upvote 0
Sếp nào vô lý thế. Sao phải "ma cà rồng". Tôi làm sao là việc của tôi miễn xong việc là được... (Sếp có trên GPE không? mời vào đây tiếp chuyện.)
Sếp của em thì không có ở trên này anh ạ, bởi vì cái này hàng tháng em đều phải copy 1 lần. Sau khi copy xong thì có đoạn macro đẩy kế hoạch cho các phân xưởng nữa nên làm tự động thì hay hơn ạ.
 
Upvote 0
Tôi dị ứng với cái kiểu "Sếp bắt em làm" lắm

Tôi thích làm gì là việc của tôi. Tôi thấy hợp lý, thuận lợi cho tôi tôi làm. Thế thôi....

Chứ đừng ở đây nói là "Sếp bắt em làm như vậy". Dị ứng lắm.


Thế bạn trả lời sao???
Em thấy làm bằng macro cũng thuận tiện hơn mà anh. Sếp giao thì em làm thôi. Thôi để em tự nghiên cứu, em cảm ơn anh.
 
Upvote 0
Upvote 0
Em thấy làm bằng macro cũng thuận tiện hơn mà anh. Sếp giao thì em làm thôi. Thôi để em tự nghiên cứu, em cảm ơn anh.
Ghi trên bảng mô tả công việc (khi tuyển dụng) khác với giao việc nha bạn.
Những công việc trên bảng mô tả công việc là trách nhiệm của bạn, bạn phải làm những việc đó để hưởng mức lương đó.
Còn khi giao việc phải phù hợp với bảng mô tả công việc, giao những việc ngoài bảng mô tả công việc bạn có thể từ chối (nguyên tắc là vậy :D)
 
Upvote 0
Trên bảng mô tả công việc của bạn có mục nào ghi kiểu như "thực hiện các công việc trên excel bằng macro" không :D

Người thực sự có công việc như thế này sẽ không hỏi code từ a đến z như thế. Người ta sẽ tự viết gần hết, và chỉ hỏi 1 vài chỗ bí.

Ghi trên bảng mô tả công việc (khi tuyển dụng) khác với giao việc nha bạn.
Những công việc trên bảng mô tả công việc là trách nhiệm của bạn, bạn phải làm những việc đó để hưởng mức lương đó.
Còn khi giao việc phải phù hợp với bảng mô tả công việc, giao những việc ngoài bảng mô tả công việc bạn có thể từ chối (nguyên tắc là vậy :D)

Cũng có khi sếp bắt làm công việc ngoài bảng mô tả. Nhưng "ngoài" đến mức như thế này thì ngừoi hỏi nên đi kiếm việc khác là vừa. Bởi vì đáp ứng xong thì sếp sẽ tiếp tục được voi đòi tiên.
 
Upvote 0
Topic Những câu hỏi về code, xin giải thích các code... đã quá dài nên mình đóng nó lại và mở topic khác
Tất cả những bài viết liên quan đến việc nhờ giải thích, xử lý và gỡ rối code VBA, các bạn vui lòng đăng tại đây!
Cảm ơn
Chào Thầy

em co code ben dưới hiện tại sử dụng tìm kiếm được 2 file giờ e muốn thêm 1 file nữa ví dụ tên file đó là "3.xls" thầy thêm code giùm với

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode.Value = 13 Then
With Sheet1
If Len(TextBox1.Text) = 0 Then
.Range("A2:K20").ClearContents
Exit Sub
End If
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open ("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 8.0")
.Range("A2:K20").ClearContents
.Range("A2").CopyFromRecordset cn.Execute("select * from [EXCEL 8.0;Database=" & ThisWorkbook.Path & "\1.xls].[A1:K] where [SO]=" & Sheet1.TextBox1.Text & " Union all select * from [EXCEL 8.0;Database=" & ThisWorkbook.Path & "\2.xls].[A1:K] where [SO]=" & Sheet1.TextBox1.Text)
End With
End If

End Sub
Topic Những câu hỏi về code, xin giải thích các code... đã quá dài nên mình đóng nó lại và mở topic khác
Tất cả những bài viết liên quan đến việc nhờ giải thích, xử lý và gỡ rối code VBA, các bạn vui lòng đăng tại đây!
Cảm ơn
 
Upvote 0
Kính thưa các Thầy cô, anh chị trong diễn đàn.
Em là người đam mê tin học, đặc biệt là excel. Em đã học hỏi được rất rất nhiều từ diễn đàn. Hôm nay em có một câu hỏi đưa lên đây không biết có đúng chỗ không, rất mong Thầy cô, anh chị thông cảm.
Em có cóp một đoạn code trên diễn đàn về ứng dụng. Trong quá trình sử dụng em thấy khi bấm nút coppy thì nó dán tất cả kể cả định dạng. Nay nhờ Thầy cô, anh chi giúp em chỉnh lại để nó chỉ dán số liệu thôi (Paste ->PasteSpecial->Values). Cảm ơn Thầy cô, anh chị nhiều ạ.
code:
Sub copy_6()
On Error Resume Next
Dim basebook As String
Dim mybook As Workbook
Dim fname As String
Dim Mypath As String
Application.ScreenUpdating = False
Mypath = Application.ActiveWorkbook.Path
basebook = ActiveWorkbook.Name
ChDrive Mypath
ChDir Mypath
fname = Application.GetOpenFilename(filefilter:="Execel files (*.xls), *.xls", Title:="Chon file nguon", MultiSelect:=False)
Set mybook = Workbooks.Open(fname)
mybook.Worksheets(GKI).Activate
Range("a9:aa33").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows(basebook).Activate
Sheet6.Select
Range("a7").Select
ActiveSheet.Paste
Range("aa41").Select
Application.CutCopyMode = False
mybook.Close False
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Xin nhờ thầy xem giúp có cách nào tính THNXT nhanh hơn không, khi dữ liệu lên tới 60000 dòng, xin cảm ơn!
 
Upvote 0
PHP:
Dim cn As Object, Str, Path As String
    Path = PathFolderQuanLy & TenPX & "\" & TenFileBangQDThangTruoc
    Set cn = CreateObject("ADODB.Connection")
    Str = "Select * from [BangChamCong$B5:C] where f1 is not null"
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Path & ";Extended Properties=""Excel 12.0;HDR=No"";"
    FileBangQD.Sheets("BangLuong").Range("B5").CopyFromRecordset cn.Execute(Str)
    cn.Close
Các anh cho em hỏi đoạn điều kiện "where f1 is not null" là gì ạ.
 
Upvote 0
Hỏi "2 Lúa Long An" í; Mình xa thứ này từ 1995 rồi!
 
Upvote 0
Thuộc tính mở rộng "Excel 12.0" là dùng cho excel 2007 trở lên đúng không ạ. Còn cái "HDR=No" hoặc "HDR=Yes" có gì khác nhau ạ.
Bạn xem thử!
Column headings: By default, it is assumed that the first row of your Excel data source contains columns headings that can be used as field names. If this is not the case, you must turn this setting off, or your first row of data "disappears" to be used as field names. This is done by adding the optional HDR= setting to the Extended Properties of the connection string. The default, which does not need to be specified, is HDR=Yes. If you do not have column headings, you need to specify HDR=No; the provider names your fields F1, F2, etc. Because the Extended Properties string now contains multiple values, it must be enclosed in double quotes itself, plus an additional pair of double quotes to tell Visual Basic to treat the first set of quotes as literal values, as in the following example (where extra spaces have been added for visual clarity).
 
Upvote 0
Thuộc tính mở rộng "Excel 12.0" là dùng cho excel 2007 trở lên đúng không ạ. Còn cái "HDR=No" hoặc "HDR=Yes" có gì khác nhau ạ.

Hình như có bạn gì ở bài #1357 giải thích cho bạn kìa. Tôi học dốt, chữ nghĩa không nhiều nên cũng không biết bạn ấy viết gì. Hi vọng bạn sẽ hiểu hơn tôi.
 
Upvote 0
Chào Thầy

em co code ben dưới hiện tại sử dụng tìm kiếm được 2 file giờ e muốn thêm 1 file nữa ví dụ tên file đó là "3.xls" thầy thêm code giùm với

Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
   If KeyCode.Value = 13 Then
       With Sheet1
           If Len(TextBox1.Text) = 0 Then
               .Range("A2:K20").ClearContents
               Exit Sub
           End If
1           Dim cn As Object
           Set cn = CreateObject("ADODB.Connection")
           cn.Open ("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 8.0")
           .Range("A2:K20").ClearContents
2           .Range("A2").CopyFromRecordset cn.Execute("select * from [EXCEL 8.0;Database=" & ThisWorkbook.Path & "\1.xls].[A1:K] where [SO]=" & Sheet1.TextBox1.Text & " Union all select * from [EXCEL 8.0;Database=" & ThisWorkbook.Path & "\2.xls].[A1:K] where [SO]=" & Sheet1.TextBox1.Text)
       End With
   End If
 
End Sub

Mã:
1           Dim cn As Object
           Dim truyVan As String
           truyVan = " select * from [EXCEL 8.0;Database=" & ThisWorkbook.Path & "\<tenFile>].[A1:K] where [SO]=" & Sheet1.TextBox1.Text
           truyVan = Replace(truyVan, "<tenFile>", "1.xls") & " UNION ALL " & Replace(truyVan, "<tenFile>", "2.xls") & " UNION ALL " & Replace(truyVan, "<tenFile>", "3.xls")
           Set cn = CreateObject("ADODB.Connection")
           cn.Open ("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 8.0")
           .Range("A2:K20").ClearContents
2           .Range("A2").CopyFromRecordset cn.Execute(truyVan)
 
Upvote 0
Upvote 0
Bạn xem thử!
Column headings: By default, it is assumed that the first row of your Excel data source contains columns headings that can be used as field names. If this is not the case, you must turn this setting off, or your first row of data "disappears" to be used as field names. This is done by adding the optional HDR= setting to the Extended Properties of the connection string. The default, which does not need to be specified, is HDR=Yes. If you do not have column headings, you need to specify HDR=No; the provider names your fields F1, F2, etc. Because the Extended Properties string now contains multiple values, it must be enclosed in double quotes itself, plus an additional pair of double quotes to tell Visual Basic to treat the first set of quotes as literal values, as in the following example (where extra spaces have been added for visual clarity).
Em hiểu rồi, em cảm ơn ạ :D
 
Upvote 0
E có 1 form, và các TextBox trong đó, dùng 1 button để kiểm tra xem TextBox nào để trống thì báo. Nhưng chẳng nhẽ bao nhiu TextBox là bấy nhiêu Code. Xin nhờ các A/c giúp cho code gọn hơn ạ. E xin cảm ơn !
Mã:
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
        TextBox1.BackStyle = 1
        TextBox1.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox2 = "" Then
        TextBox2.BackStyle = 1
        TextBox2.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox3 = "" Then
        TextBox3.BackStyle = 1
        TextBox3.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
End Sub
 

File đính kèm

Upvote 0
E có 1 form, và các TextBox trong đó, dùng 1 button để kiểm tra xem TextBox nào để trống thì báo. Nhưng chẳng nhẽ bao nhiu TextBox là bấy nhiêu Code. Xin nhờ các A/c giúp cho code gọn hơn ạ. E xin cảm ơn !
Mã:
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
        TextBox1.BackStyle = 1
        TextBox1.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox2 = "" Then
        TextBox2.BackStyle = 1
        TextBox2.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox3 = "" Then
        TextBox3.BackStyle = 1
        TextBox3.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"    
End If
End Sub
Anh thử như thế này xem sao:
PHP:
Private Sub CommandButton1_Click()
    Dim Tb
For Each Tb In UserForm1.Controls
    If UCase(TypeName(Tb)) = "TEXTBOX" Then
        If Tb = "" Then
            Tb.BackStyle = 1
            Tb.BackColor = RGB(255, 128, 128)
            MsgBox "KHONG DUOC DE TRONG"        
        End If
    End If
Next Tb
End Sub
 
Upvote 0
Anh thử như thế này xem sao:
PHP:
Private Sub CommandButton1_Click()
    Dim Tb
For Each Tb In UserForm1.Controls
    If UCase(TypeName(Tb)) = "TEXTBOX" Then
        If Tb = "" Then
            Tb.BackStyle = 1
            Tb.BackColor = RGB(255, 128, 128)
            MsgBox "KHONG DUOC DE TRONG"       
        End If
    End If
Next Tb
End Sub

ủa em thấy ở trên có mấy chữ Exit Sub mà, sao xuống đây mất tiu rồi chị ơi ?
 
Upvote 0
Nếu form của bạn nhiều textbox, có cái yêu cầu không để trống, cái có thể để trống thì bạn có thể dùng đoạn code dưới.
Chịu khó test từng textbox không được để trống thôi.
Mã:
Private Sub CheckTextBoxEmpty(txt As MSForms.TextBox)
    If Len(Trim$(txt.Text)) = 0 Then
        txt.BackStyle = 1
        txt.BackColor = RGB(255, 128, 128)
        txt.SetFocus
        Err.Raise vbObjectError + 1, "", "KHONG DUOC DE TRONG " & txt.Name
    End If
End Sub

Private Sub CommandButton1_Click()
    On Error GoTo ErrHandler
 
    CheckTextBoxEmpty TextBox1
    CheckTextBoxEmpty TextBox2
    CheckTextBoxEmpty TextBox3
 
    MsgBox "All textboxes OK :)"
 
    ' Your code here
    Exit Sub

ErrHandler:
    MsgBox Err.Description, vbCritical Or vbOKOnly, "Error"
End Sub
Đoạn code của bạn PacificPR sẽ bị lỗi là nếu có bao nhiêu textbox rỗng thì Excel sẽ quăng MsgBox bao nhiêu lần.
MsgBox này tôi đã cố tránh trong code của tôi. Lúc đầu dùng function return Boolean thì do Excel VBA không có tính năng kiểm tra tắt điều kiện logic nên bị MsgBox nhiều lần. Vì vậy tôi mới dùng cách raise Err.

Mạo muội code lại code của bạn PacificPR như sau, dùng cách duyệt qua các TextBox, TextBox nào có Tag property khác rỗng thì check nó có empty hay không. Cách dùng Tag property này chúng tôi hay dùng hồi xưa.
Mã:
Private Function CheckTextBoxEmptyByTag(frm As MSForms.UserForm) As Boolean
    Dim ctl As Control
  
    CheckTextBoxEmptyByTag = False
  
    For Each ctl In frm.Controls
        If TypeName(ctl) Like "TextBox" And Len(ctl.Tag) <> 0 Then
            If Len(Trim$(ctl.Text)) = 0 Then
                ctl.BackStyle = 1
                ctl.BackColor = RGB(255, 128, 128)
                ctl.SetFocus

                MsgBox "KHONG DUOC DE TRONG TEXTBOX " & ctl.Tag, vbCritical Or vbOKOnly, "Error"

                CheckTextBoxEmptyByTag = True
                Exit Function
            End If
        End If
    Next
End Function

Private Sub CommandButton1_Click()
    If CheckTextBoxEmptyByTag(UserForm1) = True Then Exit Sub
  
    MsgBox "All textboxes OK :)"
End Sub

Vãi, bao nhiêu năm rồi mới ngồi gõ lại code, mà là code Vê Bê mới ngán chứ, báo lỗi tùm lum :)
Có gì bỏ qua, đừng cười em nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Em không biết. Chắc nó đi chơi mất rồi " Chị " à. Hì hì ......

Không đơn giản là câu hỏi "nó đâu mất tiu" đâu bạn ạ. Đấy là bài học kinh nghiệm cho bạn đấy. Bài ở trên có người đã nói cho bạn biết rồi. Hi vọng bạn hiểu.
 
Upvote 0
Anh thử như thế này xem sao:
PHP:
Private Sub CommandButton1_Click()
    Dim Tb
For Each Tb In UserForm1.Controls
    If UCase(TypeName(Tb)) = "TEXTBOX" Then
        If Tb = "" Then
            Tb.BackStyle = 1
            Tb.BackColor = RGB(255, 128, 128)
            MsgBox "KHONG DUOC DE TRONG"      
        End If
    End If
Next Tb
End Sub
Nếu form của bạn nhiều textbox, có cái yêu cầu không để trống, cái có thể để trống thì bạn có thể dùng đoạn code dưới.
Chịu khó test từng textbox không được để trống thôi.
Mã:
Private Sub CheckTextBoxEmpty(txt As MSForms.TextBox)
    If Len(Trim$(txt.Text)) = 0 Then
        txt.BackStyle = 1
        txt.BackColor = RGB(255, 128, 128)
        txt.SetFocus
        Err.Raise vbObjectError + 1, "", "KHONG DUOC DE TRONG " & txt.Name
    End If
End Sub

Private Sub CommandButton1_Click()
    On Error GoTo ErrHandler
 
    CheckTextBoxEmpty TextBox1
    CheckTextBoxEmpty TextBox2
    CheckTextBoxEmpty TextBox3
 
    MsgBox "All textboxes OK :)"
 
    ' Your code here
    Exit Sub

ErrHandler:
    MsgBox Err.Description, vbCritical Or vbOKOnly, "Error"
End Sub
Đoạn code của bạn PacificPR sẽ bị lỗi là nếu có bao nhiêu textbox rỗng thì Excel sẽ quăng MsgBox bao nhiêu lần.
MsgBox này tôi đã cố tránh trong code của tôi. Lúc đầu dùng function return Boolean thì do Excel VBA không có tính năng kiểm tra tắt điều kiện logic nên bị MsgBox nhiều lần. Vì vậy tôi mới dùng cách raise Err.

Mạo muội code lại code của bạn PacificPR như sau, dùng cách duyệt qua các TextBox, TextBox nào có Tag property khác rỗng thì check nó có empty hay không. Cách dùng Tag property này chúng tôi hay dùng hồi xưa.
Mã:
Private Function CheckTextBoxEmptyByTag(frm As MSForms.UserForm) As Boolean
    Dim ctl As Control
 
    CheckTextBoxEmptyByTag = False
 
    For Each ctl In frm.Controls
        If TypeName(ctl) Like "TextBox" And Len(ctl.Tag) <> 0 Then
            If Len(Trim$(ctl.Text)) = 0 Then
                ctl.BackStyle = 1
                ctl.BackColor = RGB(255, 128, 128)
                ctl.SetFocus

                MsgBox "KHONG DUOC DE TRONG TEXTBOX " & ctl.Tag, vbCritical Or vbOKOnly, "Error"

                CheckTextBoxEmptyByTag = True
                Exit Function
            End If
        End If
    Next
End Function

Private Sub CommandButton1_Click()
    If CheckTextBoxEmptyByTag(UserForm1) = True Then Exit Sub
 
    MsgBox "All textboxes OK :)"
End Sub

Vãi, bao nhiêu năm rồi mới ngồi gõ lại code, mà là code Vê Bê mới ngán chứ, báo lỗi tùm lum :)
Có gì bỏ qua, đừng cười em nhé
Không đơn giản là câu hỏi "nó đâu mất tiu" đâu bạn ạ. Đấy là bài học kinh nghiệm cho bạn đấy. Bài ở trên có người đã nói cho bạn biết rồi. Hi vọng bạn hiểu.

Cám ơn các Anh chị nhiều !
 
Upvote 0
Em chào anh chị, em có một vấn đề cần anh, chị giúp đỡ ạ. Hiện tại em có danh sách khoảng 15 xưởng, hàng ngày em đều phải cập nhập kế hoạch xuống cho các xưởng, mỗi lần cập nhật mất khá nhiều thời gian. Phương pháp hiện tại em đang dùng là chọn lần lượt tên các xưởng trong listbox và đẩy dữ liệu đi. Em muốn hỏi anh chị là có cách nào chỉ cần chạy marco 1 lần dữ liệu tự động đẩy lần lượt đến các xưởng mà không phải chọn lần lượt trong listbox không ạ. Mong anh chị gợi ý phương pháp làm cho em ạ. Em cảm ơn.
 
Upvote 0
Anh thử như thế này xem sao:
PHP:
Private Sub CommandButton1_Click()
    Dim Tb
For Each Tb In UserForm1.Controls
    If UCase(TypeName(Tb)) = "TEXTBOX" Then
        If Tb = "" Then
            Tb.BackStyle = 1
            Tb.BackColor = RGB(255, 128, 128)
            MsgBox "KHONG DUOC DE TRONG"       
        End If
    End If
Next Tb
End Sub

Muốn đi qua controls thì dùng tên của nó, dễ điều khiển hơn:

For Each cNme In Array("TextBox1", "TextBox2", ...)
Set ctrl = UserForm1.Controls(ctrl)
If ctrl.Text = "" Then
...
End If
Next ctrl
 
Upvote 0
Muốn đi qua controls thì dùng tên của nó, dễ điều khiển hơn:

For Each cNme In Array("TextBox1", "TextBox2", ...)
Set ctrl = UserForm1.Controls(ctrl)
If ctrl.Text = "" Then
...
End If
Next ctrl
Chỗ em bôi đỏ phải là cNme chứ a nhỉ
 
Upvote 0
E có 1 form, và các TextBox trong đó, dùng 1 button để kiểm tra xem TextBox nào để trống thì báo. Nhưng chẳng nhẽ bao nhiu TextBox là bấy nhiêu Code. Xin nhờ các A/c giúp cho code gọn hơn ạ. E xin cảm ơn !
Mã:
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
        TextBox1.BackStyle = 1
        TextBox1.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox2 = "" Then
        TextBox2.BackStyle = 1
        TextBox2.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
If TextBox3 = "" Then
        TextBox3.BackStyle = 1
        TextBox3.BackColor = RGB(255, 128, 128)
        MsgBox "KHONG DUOC DE TRONG"
        Exit Sub
End If
End Sub
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
 
Upvote 0
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
Em đoán nhà họ đặt cái màu đỏ choét đó để kiểm soát. Nhưng có bài #1367 thì không cần cái đó nữa. Chị #1368 chả mắng cho còn rồi( Mà cái Bà đó khó tính mà vẫn đẹp gái thế mới sợ chứ ... :D:D:D)
 
Upvote 0
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?

Chỉ 1 lúc đủ 100% ngừoi ta hổng nhớ đâu. Cứ để đỏ toét loét một thời gian rồi tự động nhớ nguyên tắc "khi tô màu phải nghĩ đến lúc cần xoá đi."

Nhưng mà biết đâu người ta đã có chuyện khôi phục trong cái sự kiện focus hay change gì gì đó rồi.
 
Upvote 0
Nhờ anh chị giúp!
Em có 02 combobox trong sheet FORMNHAPLIEU, trong đó 1 combobox ở ô $B$5 và 1 ở ô $B$8.
Hiện em muốn combobox ở ô B5 có chức năng giống ở ô B8 với linkrange sheet CONGTHUC! A3:B
linkedcell tại B5: Tendonvi, B13: madonvi
Cám ơn nhiều ạ!
 

File đính kèm

Upvote 0
Mình dùng lệnh "ActiveSheet.PrintPreview" thì nó ra cái form như thế này Reality.JPG
Có lệnh nào để cho nó hiện ra form "Print" giống như ở trong tab "File" không Wanted.JPG
Mình dùng Excel 2000.
 
Upvote 0
Gợi ý thêm một khả năng mới.

Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
Cái đó mình tạo 1 form nhỏ để lấy hướng test và nhờ các a/c giúp đỡ. Còn sau mình áp dụng vào của mình thì đã dùng sự kiện để bỏ cái đỏ choét đó rùi ý, k nó ngứa mắt chết luôn :D
 
Upvote 0
Upvote 0
Mình có đoạn codec sau nhưng không biết sai như thế nào, nhờ mọi người xem giúp với.

Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
Dayso(i) = Sheet1.Range("A" & i).Value
Next i
Max = 0
For j = 1 To UBound(Dayso, 1)
If Dayso(j) > Max Then
Sheet1.Range("B" & j) = Dayso(j)
Max = Sheet1.Range("B" & j).Value
Sheet1.Range("B" & j).ClearContents
End If
Next j
Sheet1.Range("B1") = Max
End Sub
 
Upvote 0
Mình có đoạn codec sau nhưng không biết sai như thế nào, nhờ mọi người xem giúp với.

Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
Dayso(i) = Sheet1.Range("A" & i).Value
Next i
Max = 0
For j = 1 To UBound(Dayso, 1)
If Dayso(j) > Max Then
Sheet1.Range("B" & j) = Dayso(j)
Max = Sheet1.Range("B" & j).Value
Sheet1.Range("B" & j).ClearContents
End If
Next j
Sheet1.Range("B1") = Max
End Sub
Cái này hình như đang tìm số lớn nhất thì phải. Thay vì bạn đưa Code thì đính kèm file và yêu cầu thì dễ hình dung hơn là đọc và dich Code trên :p
 
Upvote 0
Mình gửi file lên mong mọi người góp ý giúp. Cảm ơn
Thế thì viết như thế này cho gọn hơn
PHP:
Sub Rectangle2_Click()
    Dim sArr(), I As Long, Max As Long
With Sheet1
    sArr = .Range("A1", .Range("A" & Rows.Count).End(3)).Value
    Max = 0
    For I = 1 To UBound(sArr)
        If sArr(I, 1) > Max Then Max = sArr(I, 1)
    Next I
    .Range("B1") = Max
End With
End Sub
 
Upvote 0
Mình có đoạn codec sau nhưng không biết sai như thế nào, nhờ mọi người xem giúp với.

Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
Dayso(i) = Sheet1.Range("A" & i).Value
Next i
Max = 0
For j = 1 To UBound(Dayso, 1)
If Dayso(j) > Max Then
Sheet1.Range("B" & j) = Dayso(j)
Max = Sheet1.Range("B" & j).Value
Sheet1.Range("B" & j).ClearContents
End If
Next j
Sheet1.Range("B1") = Max
End Sub
Tôi viết lại như sau
PHP:
Sub Rectangle2_Click()
Dim Dayso()
Dim Max As Integer
Dim iR As Integer
iR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
ReDim Dayso(iR)
For i = 1 To iR
    Dayso(i) = Sheet1.Range("A" & i).Value
    Next i
'Max = 0     'Luu y 1
Max = Dayso(1)
'For j = 1 To UBound(Dayso, 1)
For j = 2 To UBound(Dayso, 1)
    If Dayso(j) > Max Then
'        Sheet1.Range("B" & j) = Dayso(j)  'Lệnh này thừa
'        Max = Sheet1.Range("B" & j).Value
        Max = Dayso(j)
 '       Sheet1.Range("B" & j).ClearContents    'Lệnh này thừa
        End If
    Next j
Sheet1.Range("B1") = Max
End Sub

và nó cho max của dãy số trong cột A. Chú ý
Luu y 1 Phải thay
Max = 0 bằng Max = Dayso(1,1) để tránh khi dãy số toàn số âm[/PHP]

Có thể kg cần biến Dayso và chỉ cần 1 vòng For
 
Upvote 0
Thế thì viết như thế này cho gọn hơn


Điểm mấu chốt là biến max để là long hoặc integer rất dễ gây lỗi bị chàn, vì chúng chỉ chứa được giá trị khoảng 2 tỷ, chưa kể sẽ có hiện tượng ép kiểu do vậy kết quả sẽ bị làm tròn. Vả lại cũng phải khởi tạo cho biến max hợp lý.

Mã:
Sub Rectangle20_Click()
    Dim sArr, vTemp As Variant, dblMax As Double
    
    

    sArr = Sheet1.Range("A1", Sheet1.Range("A" & Rows.Count).End(3)).Value
    If Not IsArray(sArr) Then
        dblMax = sArr
        'de phong truong hop chi co mot o.
    Else
        dblMax = sArr(1, 1)
        For Each vTemp In sArr
            If vTemp > dblMax Then
                dblMax = vTemp
            End If
        Next
    End If
 
    Sheet1.Range("B1") = dblMax



End Sub

Cứ dùng cái hàm Max trong excel hóa lại đơn giản.
 
Upvote 0
Sub Rectangle2_Click()
Dim sArr(), I As Long, Max As Long
With Sheet1
sArr
= .Range("A1", .Range("A" & Rows.Count).End(3)).Value
Max
= 0
For I = 1 To UBound(sArr)
If
sArr(I, 1) > Max Then Max = sArr(I, 1)
Next I
.Range("B1") = Max
End With
End Sub
Uổi, mà làm sao để có cái code màu xanh này thế chị?
 
Upvote 0
Vãi, em vốn ghét thằng variant mà cuối cùng phải bắt buộc dùng nó. Chỉ có cái hàm Max thôi mà viết sai lên sai xuống, test linh tinh dữ liệu bị quăng error vô mặt.
Code này em thấy tạm chấp nhận được thôi, bà con có code # hay hơn góp ý.
Trên các cell cột A, bà con nhập thỏa mái, càng linh tinh càng tốt, rỗng, số, số bự bà cố, chuỗi, chuỗi và số, biểu thức...

Mã:
Option Explicit

Sub Rectangle2_Click()
    Dim vArr() As Variant
    Dim vMax As Variant, vTemp As Variant
    Dim lR As Long, I As Long
 
    ' Truong hop cot A khong co du lieu hay chi cell A1 co du lieu rong, text, number hay linh tinh
    vMax = Val([A1])
    lR = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
  
    If (lR > 1) Then
        ' Có dữ liệu từ A2 trở đi
        vArr = Sheet1.Range("A1:A" & lR).Value ' If lR = 1 thì lệnh này nó quăng error vô mặt em cái đùng
        For I = 2 To UBound(vArr)       ' Bo qua cell A1
            vTemp = Val(vArr(I, 1))     ' Truong hop cell A[I] la du lieu rong, text, number hay linh tinh, không dùng Val thì bị quăng error cái đùng lần nữa :')
            If vTemp > vMax Then
                vMax = vTemp
            End If
        Next I
    End If
 
    Sheet1.Range("B1") = vMax
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm Val là hàm nguy hiểm bỏ bố
A1 = "1,000.0"
A2 = "2.000,0"
A3 = "1.000,0"
A4 = "2,000.0"
Thiệt ra là thằng nào lớn hơn thằng nào?
 
Upvote 0
Mình có code 1 đoạn này. Input 1 mảng từ 1 bảng có sẵn. Transpose ra được dữ liệu rồi nhưng khi so sánh biến nhập vào với từng giá trị của mảng thì chỉ ra được 1 giá trị đầu. Còn lại báo lỗi Subscript out of Range 404. Máy báo lỗi ở dòng.

If Sheets("CleanerSheet").Cells(d, "B").Value > data(i, 1) And Sheets("CleanerSheet").Cells(d, "B").Value <= data(i + 1, 1) Then


Cảm ơn mọi người trước ạ

PHP:
Option Explicit

Sub Button1_Click()
Dim a, b, c, d, i As Integer
Dim data(1 To 80, 1 To 2) As Variant
Dim LastRow As Integer

    With ActiveSheet
        LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
    End With
 
c = 1
For a = 2 To 16
For b = 12 To 8 Step -1
    data(c, 1) = Sheets("2018").Cells(b, a).Value
    c = c + 1
Next b
Next a

c = 1
For a = 2 To 16
For b = 12 To 8 Step -1
    data(c, 2) = Sheets("2018").Cells(13, a).Value & Sheets("2018").Cells(b, "A").Value
    c = c + 1
Next b
Next a

Sheets("CleanerSheet").Range("E6:F99").Value = Worksheets.Application.Transpose(data)

For d = 3 To LastRow

     Sheets("CleanerSheet").Cells(d, "B").Select
     For i = 1 To 80
       If Sheets("CleanerSheet").Cells(d, "B").Value > data(i, 1) And Sheets("CleanerSheet").Cells(d, "B").Value <= data(i + 1, 1) Then
          Sheets("CleanerSheet").Cells(d, "C").Value = data(i + 1, 1)
          Sheets("CleanerSheet").Cells(d, "D").Value = data(i + 1, 2)
          i = i + 1
       End If
     Next i
Next d

End Sub
 
Upvote 0
Định bôi nhưng code không cho bôi nên đành trích dẫn luôn :D.
Tềnh hềnh là hơi căng...
1. Lỗi dòng này:
Mã:
Sheets("CleanerSheet").Cells(d, "B").Select
khi Sheets("CleanerSheet") không hiện hành.
Khắc phục:
PHP:
Sheets("CleanerSheet").Select 'Thêm dòng này'
For d = 3 To LastRow
2. Lỗi gọi phần tử của biến mảng data():
Mã:
For i = 1 To 80
       If sal > data(1, i) And sal <= data(1, i + 1) Then
vì khai báo:
Mã:
Dim data(1 To 80, 1 To 2)
Khai báo chỉ số chiều thứ hai của mảng data chạy từ 1 tới 2, còn khi gọi tới phần tử của nó thì lại chạy từ 1 tới 80, nên i>=3 là tèo téo teo.

Lỗi tới chỗ đó là hết hiểu để sửa.

Có lẽ mình dành thời gian đọc tham khảo mấy bài sau: Bài 0-10.
 
Upvote 0
Tềnh hềnh là hơi căng...
1. Lỗi dòng này:
Mã:
Sheets("CleanerSheet").Cells(d, "B").Select
khi Sheets("CleanerSheet") không hiện hành.
Khắc phục:
PHP:
Sheets("CleanerSheet").Select 'Thêm dòng này'
For d = 3 To LastRow
2. Lỗi gọi phần tử của biến mảng data():
Mã:
For i = 1 To 80
       If sal > data(1, i) And sal <= data(1, i + 1) Then
vì khai báo:
Mã:
Dim data(1 To 80, 1 To 2)
Khai báo chỉ số chiều thứ hai của mảng data chạy từ 1 tới 2, còn khi gọi tới phần tử của nó thì lại chạy từ 1 tới 80, nên i>=3 là tèo téo teo.

Lỗi tới chỗ đó là hết hiểu để sửa.

Có lẽ mình dành thời gian đọc tham khảo mấy bài sau: Bài 0-10.

Em cũng mới chuyển code từ VB sang VBA nên cũng có nhiều chỗ chưa hiểu. Cái mảng em đặt theo biến như trên theo em hiểu là fix cố định gồm 80 dòng và 2 cột nhưng khi transpose ra thì lại là 80 cột và 2 dòng. Thế khi mình khai báo như trên thì mảng của mình là 80 cột 2 dòng hay là 80 dòng 2 cột ạ?
 
Upvote 0
PHP:
FileQLSX.Sheets("BANG_TINH").Range("B22:Z" & LastRowNo).SpecialCells(xlCellTypeVisible).Copy
 
 FileBangQD.Sheets("CongLamKH").Range("D3").PasteSpecial xlPasteValues
Anh, chị cho em hỏi, em có đoạn code copy như trên, chỉ copy những dữ liệu hiển thị không copy dữ liệu ẩn. Em muốn chuyển sang dùng ADO mà không biết trong ADO bỏ qua giá trị ẩn như nào. Anh, chị giúp em với ạ. Em cảm ơn. Dữ liệu của em không theo thứ tự nhất định.
PHP:
Str5 = "Select * from [BANG_TINH$B22:Z] where F1 is not null"
    FileBangQD.Sheets("ThongSo").Range("D3").CopyFromRecordset cnn.Execute(Str5)
Em có dùng đoạn code trên để thay thế mà chỉ copy được một dòng.
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác hướng dẫn giúp em sửa lỗi add value từ text input vào header.
Em dùng hàm UNItoVBA chuyển chuỗi nhập từ txtcongty mà nó không hiển thị ra. trong khi gán cứng thì nó lại ra. Em cám ơn.
Em gửi kèm file và code ạ.
Code đây ạ:
==================
Private Sub btnbrowser_Click()
' Sub GettingFolder()
Dim SelectedFolder As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Select folder"
.ButtonName = "Confirm"
.InitialFileName = "C:\"

If .Show = -1 Then
'ok clicked
SelectedFolder = .SelectedItems(1)
txtduongdan.Value = SelectedFolder
'MsgBox (SelectedFolder)
Else
'cancel clicked
End If
End With
End Sub
Private Sub btnnext_Click()
Dim chuoi, chuoimoi, congty, gdv As String
Dim i, j As Integer

'==== chuyen bien so sang format chung
chuoi = UCase(txtbks.Text)
chuoimoi = ""

For i = 1 To Len(chuoi)
If Mid(chuoi, i, 1) <> "-" And Mid(chuoi, i, 1) <> "." And Mid(chuoi, i, 1) <> "_" Then
chuoimoi = chuoimoi + Mid(chuoi, i, 1)
End If
Next i

If Len(chuoimoi) = 8 Then
chuoimoi = Left(chuoimoi, 3) + "-" + Mid(chuoimoi, 4, 3) + "." + Right(chuoimoi, 2)
Else
chuoimoi = Left(chuoimoi, 3) + "-" + Right(chuoimoi, 4)
End If
'=====================================
congty = UNItoVBA(txtcongty.Value)
' congty = "C" & ChrW(212) & "NG TY B" & ChrW(7842) & "O HI" & ChrW(7874) & "M NGH" & ChrW(7878) & " AN"
gdv = "Gi" & ChrW(225) & "m " & ChrW(273) & ChrW(7883) & "nh vi" & ChrW(234) & "n: "


ActiveWindow.View = xlPageLayoutView
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.LeftHeader = "&""Times New Roman,Bold""&12" & congty _
& Chr(10) & "&""Times New Roman,Regular""&12" & gdv _
' & Chr(10) & "&""Times New Roman,Regular""&12 Ngay giam dinh: " & "20/12/2017 BKS: "
.LeftMargin = Application.InchesToPoints(0.7)
.RightMargin = Application.InchesToPoints(0.7)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.ScaleWithDocHeaderFooter = True
.AlignMarginsHeaderFooter = True
End With
Application.PrintCommunication = True
Range("A1").Select

'===========================================================


With Sheets("Data")

.Range("A3") = txtcongty.Text

.Range("A4") = txtgdv.Text
.Range("A5") = txtnggd.Text
.Range("A6") = chuoimoi
.Range("A7") = txtanhdau.Text
.Range("A8") = txtanhcuoi.Text
.Range("A9") = UNItoVBA(txtcongty.Text)

End With

UserForm1.Hide
End Sub
'=====================================================
'Chuyen chuoi tu UNICODE sang Code VBA
Function UNItoVBA(ByVal MyStr As String) As String

Dim Str As String, i As Integer, CStart As Integer, CCount As Integer, Status As Boolean
Str = "-225-224-7843-227-7841-259-7855-7857-7859-7861-7863-226-7845-7847-7849-7851-7853-273-233-232-7867-7869-7865-234-7871-7873-7875-7877-7879-237-236-7881-297-7883-243-242-7887-245-7885-244-7889-7891-7893-7895-7897-417-7899-7901-7903-7905-7907-250-249-7911-361-7909-432-7913-7915-7917-7919-7921-253-7923-7927-7929-7925-193-192-7842-195-7840-258-7854-7856-7858-7860-7862-194-7844-7846-7848-7850-7852-272-201-200-7866-7868-7864-202-7870-7872-7874-7876-7878-205-204-7880-296-7882-211-210-7886-213-7884-212-7888-7890-7892-7894-7896-416-7898-7900-7902-7904-7906-218-217-7910-360-7908-431-7912-7914-7916-7918-7920-221-7922-7926-7928-7924-10-"
For i = 1 To Len(MyStr)
If InStr(Str, "-" & AscW(Mid(MyStr, i, 1)) & "-") = 0 Then
If Not Status Then
CStart = i: Status = True
End If
CCount = CCount + 1
Else
If Status Then UNItoVBA = UNItoVBA & IIf(UNItoVBA = "", "", " & ") & """" & Replace(Mid(MyStr, CStart, CCount), """", """""") & """"
Status = False
CCount = 0
UNItoVBA = UNItoVBA & IIf(UNItoVBA = "", "", " & ") & "ChrW(" & AscW(Mid(MyStr, i, 1)) & ")"
End If
Next
If Status Then UNItoVBA = UNItoVBA & IIf(UNItoVBA = "", "", " & ") & """" & Replace(Mid(MyStr, CStart, CCount), """", """""") & """"
End Function
'===========================================
Private Sub Label1_Click()
End Sub
'============================================
 

File đính kèm

Upvote 0
Chào các sư huynh!
Nhờ các sư huynh viết giúp code VBA: Công việc của em có liên quan đến việc lọc dữ liệu thỏa mãn yêu cầu cho trước. Bình thường em toàn nhặt thủ công, chia dữ liệu làm nhiều phần cho nhiều người làm, rất mất thời gian công sức mà không chính xác. Em có mày mò vài hàm cơ bản nhưng không nhanh hơn là bao. Nói ra thì hơi khó diễn tả, em up file để các huynh giúp đỡ.
Em cảm ơn!
 

File đính kèm

Upvote 0
Bạn muốn lọc cái gì & ở trang nào; Kết quả lọc cho hiện ở đâu
Túm lại chỉ là:
Cái gì?
Khi nào?
Ở đâu
 
Upvote 0
Ad ơi cuwps mình với, mình tạo 1 Form nhập và khai báo với dữ liệu đã có ở sheet này qua Sheet khác, mà nó cứ báo lỗi, mong Ad giúp mình với
 

File đính kèm

  • LỖI CODE.png
    LỖI CODE.png
    191.1 KB · Đọc: 9
Upvote 0
Xài hàm VLOOKUP() thì cần bảy lỗi, kể cả trong VBA.
 
Upvote 0
Nhờ anh chị sửa lỗi khi import form bị lỗi sau:
"errors during load refer to"
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là form đính kèm lỗi. Bài #1415
Nội dung file log:
Line 8: Property OleObjectBlob in FormDonGia had an invalid file reference.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hóng, các anh chị đổi đuôi xls thành frm rồi xem lỗi giúp e với nhé. Thank1
 
Lần chỉnh sửa cuối:
Upvote 0
OleObjectBlob = "FormDonGia.frx":0000
Kiểm tra file FormDonGia.frx có không bạn
 
Upvote 0
File frx ko có bạn ơi. Theo mình tìm hiểu trên diễn đàn thì file đó ko có cũng được. Ko biết có đúng ko?
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom