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
MINH THỬ DC RỒI MẤY BẠN AH DO SHEET MÌNH ĐẶT TÊN TIẾNG VIỆT NÊN LỖI
CẢM ƠN TẤT CẢ ANH EM ĐÃ GIÚP MÌNH
 
Upvote 0
chào cả nhà tình hình là e đang muốn lọc dữ liệu excel tự động lên mạng kiếm thì có một dòng lên như sau mà e ứng dụng thì không chạy nhờ các Anh xem giúp e cảm ơn mã như sau:
Private Sub textbox1_change()
ActiveSheet.ListObjects("bang").Range.AutoFilter Field:=1, _
Criterial:="*" & [b2] & "*", Operator:=x1filterValues
End Sub
 
Upvote 0
chào cả nhà tình hình là e đang muốn lọc dữ liệu excel tự động lên mạng kiếm thì có một dòng lên như sau mà e ứng dụng thì không chạy nhờ các Anh xem giúp e cảm ơn mã như sau:
Private Sub textbox1_change()
ActiveSheet.ListObjects("bang").Range.AutoFilter Field:=1, _
Criterial:="*" & [b2] & "*", Operator:=x1filterValues
End Sub
xlFilterValues chứ không phải là x1filterValues, copy code mà còn sai.
 
Upvote 0
Em muốn sử dụng 1 VBA để tại mục ô B2 sẽ lọc dữ liệu tự động từ bảng bên dưới ạ và e muốn xóa nhưng ô trống không có dữ liệu như hàng 15 chẳng hạn. e cảm ơn trước
 

File đính kèm

Upvote 0
Em muốn sử dụng 1 VBA để tại mục ô B2 sẽ lọc dữ liệu tự động từ bảng bên dưới ạ và e muốn xóa nhưng ô trống không có dữ liệu như hàng 15 chẳng hạn. e cảm ơn trước
Bạn phải làm rõ chổ này, tiêu chí lộc là sao, bằng ô B2 mà cái nào bằng cột A, B, C... vậy giả sử bạn muốn bỏ hàng trống thì bạn nhập vào B2 cái gì?
 
Upvote 0
thứ 1 e muốn xóa những dòng trống không có dữ liệu
thứ 2 e muốn tại ô b2 ví dụ tại ô B2 mình nhập từ than đá nó sẽ tự tìm được ô có B2 ạ. tìm dữ liệu giống như video này ạ
 
Upvote 0
thứ 1 e muốn xóa những dòng trống không có dữ liệu
thứ 2 e muốn tại ô b2 ví dụ tại ô B2 mình nhập từ than đá nó sẽ tự tìm được ô có B2 ạ. tìm dữ liệu giống như video này ạ
Cái video này nó lọc ở cột A mà bạn. Theo bạn mô tả hình như là lọc cột C thì phải. nếu đúng vậy thì bạn có thể sử dụng code sau.
Mã:
Private Sub textbox1_change()
ActiveSheet.Range("$A$3:$I$" & Range("A65000").End(xlUp).Row).AutoFilter Field:=3, Criteria1:="*" & [b2] & "*"
End Sub
 
Upvote 0
Cảm ơn A nhiều, A có thể giúp e viết 1 đoạn lệnh để xóa các hàng trống không ạ.
 
Upvote 0
Cảm ơn A nhiều, A có thể giúp e viết 1 đoạn lệnh để xóa các hàng trống không ạ.
Bạn dùng code này cho file của bạn.
Mã:
Sub GPE()
On Error Resume Next
Dim i As Long, VungDel As Range, k As Long
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
        k = 0
            For i = Sheet1.Range("A65000").End(xlUp).Row To 5 Step -1
                If WorksheetFunction.CountBlank(Sheet1.Range("A" & i).Resize(, 9)) = 9 Then
                    If VungDel Is Nothing Then
                        Set VungDel = Rows(i)
                    Else
                        Set VungDel = Union(VungDel, Rows(i))
                        k = k + 1
                        If (k = 100) And (Not VungDel Is Nothing) Then
                            VungDel.EntireRow.Delete
                            Set VungDel = Nothing
                            k = 0
                        End If
                    End If
                End If
            Next i
            If Not VungDel Is Nothing Then VungDel.EntireRow.Delete
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub
 
Upvote 0
Em chào các anh chị, thầy cô trên diễn đàn GPE
Em có 1 file theo dõi hóa đơn như file gửi kèm
Do nhu cầu cập nhập hóa đơn do các Công ty cung cấp hàng ngày nên phải thao tác tìm kiếm đến tên Công ty rồi Chèn bổ sung thêm các dòng nối tiếp vào
Để đơn giản việc tìm kiếm em có ghi lại 1 Macro vào Button Tìm đến Công ty (Button tương tự như chức năng Find của Excel)
Tuy nhiên do tính năng Find của excel là tìm từ trên xuống trong khi em mong muốn là tìm từ dưới lên để việc cập nhập được thuận tiện
Chi tiết em đã trình bày trong File gửi kèm. Rất mong các anh chị và thầy cô giúp đỡ
Em xin cảm ơn
 

File đính kèm

Upvote 0
Upvote 0
Trong code có chỗ SearchDirection:=xlNext, sửa lại thành SearchDirection:=xlPrevious thì nó sẽ tìm từ dưới lên
Em cảm ơn thầy
Nhưng nó lại phát sinh thêm 1 lần click chuột nữa. Vì Lần click đầu vào Button nó sẽ tìm luôn là ô C2, đến lần Click chuột tiếp vào Button nó mới nhảy đến ô cuối của tìm kiếm
Có cách nào chỉ 1 lần Click chuột là đến luôn ô cần tìm kiếm không thầy?
 
Upvote 0
Em cảm ơn thầy
Nhưng nó lại phát sinh thêm 1 lần click chuột nữa. Vì Lần click đầu vào Button nó sẽ tìm luôn là ô C2, đến lần Click chuột tiếp vào Button nó mới nhảy đến ô cuối của tìm kiếm
Có cách nào chỉ 1 lần Click chuột là đến luôn ô cần tìm kiếm không thầy?
Trong code bạn ghì: Cells.Find(....) có nghĩa là tìm trên toàn bộ bảng tính? Như vậy không tốt lắm, bời tên cty nằm ở cột C mà
Nhân tiện sửa luôn toàn bộ:
Mã:
Sub Button2_Click()
  On Error Resume Next
  Range("C5:C10000").Find(Range("C2").Value, , xlValues, xlPart, , xlPrevious, False).Select
End Sub
Phải có On Error Resume Next, phòng trường hợp báo lỗi không tìm thấy
 
Upvote 0
Vâng em cảm ơn thầy
Code chạy đúng như ý em rồi
 
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
Thầy Ndu! chỉnh lại hộ em đoạn code file dưới với ạ. đoạn code mọi khi em vẫn dùng, nhưng hnay giữ liệu nhiều hơn bị lỗi khả năng do vùng làm việc nhỏ quá nên lỗi nhờ thầy xem cho em với..
 

File đính kèm

Upvote 0
Thầy Ndu! chỉnh lại hộ em đoạn code file dưới với ạ. đoạn code mọi khi em vẫn dùng, nhưng hnay giữ liệu nhiều hơn bị lỗi khả năng do vùng làm việc nhỏ quá nên lỗi nhờ thầy xem cho em với..
Trên đầu code có:
Mã:
dArr(1 To 1000, 1 To 7)
Thử sửa lại thành:
Mã:
dArr(1 To 10000, 1 To 7)
Lưu ý:
- Lần sau đưa code lên mà khóa pass tôi không làm đâu
- Thứ nữa là: do bạn khóa pass VBA nên khi thông báo lỗi xuất hiện, nút Debug bị mờ không bấm vào được nên không biết lỗi chỗ nào
------------------------------
Nghĩ cũng lạ: Những người viết code gà mờ lại cứ khoái khóa VBA. Có cái "CỦA QUÝ" trong đó à?
 
Upvote 0
mk: 0706976699 thầy ạ
 
Upvote 0
Trên đầu code có:
Mã:
dArr(1 To 1000, 1 To 7)
Thử sửa lại thành:
Mã:
dArr(1 To 10000, 1 To 7)
Lưu ý:
- Lần sau đưa code lên mà khóa pass tôi không làm đâu
- Thứ nữa là: do bạn khóa pass VBA nên khi thông báo lỗi xuất hiện, nút Debug bị mờ không bấm vào được nên không biết lỗi chỗ nào
------------------------------
Nghĩ cũng lạ: Những người viết code gà mờ lại cứ khoái khóa VBA. Có cái "CỦA QUÝ" trong đó à?
Thầy ơi! mk là 0706976699, vẫn bị lỗi thầy vào file xem dùm lại hộ e với ạ.. có thể cải thiện được tốc độ code này không ạ!
 
Upvote 0
Trên đầu code có:
Mã:
dArr(1 To 1000, 1 To 7)
Thử sửa lại thành:
Mã:
dArr(1 To 10000, 1 To 7)
Lưu ý:
- Lần sau đưa code lên mà khóa pass tôi không làm đâu
- Thứ nữa là: do bạn khóa pass VBA nên khi thông báo lỗi xuất hiện, nút Debug bị mờ không bấm vào được nên không biết lỗi chỗ nào
------------------------------
Nghĩ cũng lạ: Những người viết code gà mờ lại cứ khoái khóa VBA. Có cái "CỦA QUÝ" trong đó à?
Hihi. Có cái "CỦA QUÝ". Thầy vui tính thật.!
 
Upvote 0
Chào các anh chị trên diễn đàn!
Em không rành về vba lắm nhưng đang muốn làm một file để nhập vập liệu dùng vba mong các anh chị giúp đỡ. Mục đích cả e là khi chọn ô trong cột C3 của sheet VL thì sẽ hiện listview mà nội dung chứa trong sheet DLDV ( vùng masanpham Danh sách vật liệu). Code em không rành lắm nên chỉ đi sưu tầm mong các anh chị giúp đỡ.

Em cảm ơn!
 

File đính kèm

Upvote 0
Em chào các anh chị và thầy cô trên GPE
Em muốn xóa các dòng từ dòng 1000 của cột J trở ngược lên trên đến dòng cuối của bảng tính ( dòng cuối của bảng tính được xác định theo cột A)
Em có làm 1 code Loay hoay mãi nhưng vẫn không chạy được
Mong các anh chị và thầy cô trên GPE giúp em xử lý code
Chi tiết trong file gửi kèm
Chi tiết code
Sub Button1_Click()
Dim LastRow As Long
Dim X As Integer
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
X = LastRow + 1
Sheets("Sheet1").Select
Rows(X & ": J1000").Select
Selection.EntireRow.Delete
End Sub
 

File đính kèm

Upvote 0
Em chào các anh chị và thầy cô trên GPE
Em muốn xóa các dòng từ dòng 1000 của cột J trở ngược lên trên đến dòng cuối của bảng tính ( dòng cuối của bảng tính được xác định theo cột A)
Em có làm 1 code Loay hoay mãi nhưng vẫn không chạy được
Mong các anh chị và thầy cô trên GPE giúp em xử lý code
Chi tiết trong file gửi kèm
Chi tiết code
Sub Button1_Click()
Dim LastRow As Long
Dim X As Integer
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
X = LastRow + 1
Sheets("Sheet1").Select
Rows(X & ": J1000").Select
Selection.EntireRow.Delete
End Sub
Bạn thử như vầy xem::
PHP:
Sub Button1_Click()
Dim LastRow As Long
LastRow = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
Rows(LastRow & ":1000").Clear
' Hoặc:' 
'Rows(LastRow & ":1000").EntireRow.Delete'
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Em chào các anh chị và thầy cô trên GPE
Em muốn xóa các dòng từ dòng 1000 của cột J trở ngược lên trên đến dòng cuối của bảng tính ( dòng cuối của bảng tính được xác định theo cột A)
Em có làm 1 code Loay hoay mãi nhưng vẫn không chạy được
Mong các anh chị và thầy cô trên GPE giúp em xử lý code
Chi tiết trong file gửi kèm
Chi tiết code
Sub Button1_Click()
Dim LastRow As Long
Dim X As Integer
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
X = LastRow + 1
Sheets("Sheet1").Select
Rows(X & ": J1000").Select
Selection.EntireRow.Delete
End Sub
 

File đính kèm

Upvote 0
Cảm ơn thầy Ba tê đã giúp đỡ. Code chạy rất tuyệt
Riêng code của bạn NguyenNgocThuHien còn cẩn thận thêm phần thông báo. Cảm ơn bạn đã chu đáo. Quang rất cảm ơ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
xin giúp mình làm file update file nguồn mà file nguồn không cần mở lên lên để update dữ liệu

VD : file tổng lấy dữ liệu từ file 1 ,2 , 3 , 4 , vvvv . file 1 ,2,3,4 sẽ đc update từ 1 file nguồn .

mình chỉ cần thêm dữ liệu từ file nguồn rồi mở file tổng thì file tổng sẽ tự lấy dữ liệu mới từ file 1,2,3,4 . mà ko cần phải mở file 1,2,3,4 để update dữ liệu .

cảm ơn nhiều .
 
Upvote 0
Bác nào chỉ em cách dùng code tại #1 bài này với, tải về mà chả biết dùng ra sao (đề tài này đã lâu chả ai ngó ngàng tới cả), hình như là nó không tác dụng khi thao tác trên trang tính thì phải.
em thử bật file có code đó rồi chọn vào cửa sổ khác (ví dụ: cửa sổ trình duyệt wed) rồi nhấn phím bất kỳ, lúc này code VBA lại chạy và trả về đúng với số keycode, nhưng lại chỉ có tác dụng như bước làm bên trên chứ code không chạy khi đang chọn để thao tác trên trang tính.
 
Upvote 0
xin giúp mình làm file update file nguồn mà file nguồn không cần mở lên lên để update dữ liệu

VD : file tổng lấy dữ liệu từ file 1 ,2 , 3 , 4 , vvvv . file 1 ,2,3,4 sẽ đc update từ 1 file nguồn .

mình chỉ cần thêm dữ liệu từ file nguồn rồi mở file tổng thì file tổng sẽ tự lấy dữ liệu mới từ file 1,2,3,4 . mà ko cần phải mở file 1,2,3,4 để update dữ liệu .

cảm ơn nhiều .
 

File đính kèm

Upvote 0
nhờ mấy anh chị trên diễn đàn rút gọn đoạn code trên cho em với, cái này em dùng Record Macro ghi lại nhưng chưa hiểu hết mong các anh giúp em với .
và nhờ mọi người giúp em đoạn code để lọc cho các sheet còn lại với.
em cám mọi người ơn nhiều
Mã:
Sub Macro1()
'
' Macro1 Macro
'
'
    Range("R10").Select
    ActiveCell.FormulaR1C1 = "=IF(COUNTIF(R10C3:RC[-15],RC[-15])>1,"""",RC[-15])"
    Range("R10").Select
    Selection.AutoFill Destination:=Range("R10:R2650"), Type:=xlFillDefault
    Range("R10:R2650").Select
    Selection.AutoFilter
    ActiveSheet.Range("$R$10:$R$2650").AutoFilter Field:=1, Criteria1:=Array( _
        "5-T-TP-DDK", "8-TCLT-TP-DDK", "A300", "A300- viê`n khung bao", _
        "C101A-T0.9 (18.2x16)", "C1687 (60x14.2)", "C1697 (60x25.3)", "C3033", _
        "C3033 (51x52.4x1.4)", "C3202 (54.8x76)", "C3202A-T1.2 (54.8x76)", _
        "C3203 (54.8x68)", "C3203-T1.2 (54.8x68)", "C3209 (54.8x50)", _
        "C3209-T1.2 (54.8x50)", "C3295 (37.3x23.5)", "C3303 (54.8x87)", _
        "C3303-T1.2 (54.8x87)", "C3304 (54.5x138)", "C3304-T1.2 (54.5x138)", _
        "C3313 (54.8x68)", "C3313-T1.2 (54.8x68)", "C3318 (54.8x50)", _
        "C3318-T1.2 (54.8x50)", "C3323-T1.2 (50x57.2)", "C3328-T1.2 (54.8x66)", _
        "C3329 (40.7x21.6)", "C3332 (54.8x87)", "D1541A-T1.2(93.4x40)", _
        "D1541A-T2.0 (93.4x40)", "D1543A-T1.2 (98x34)", "D1543A-T2.0 (98x34)", _
        "D1544A-T1.2 (28.9x50)", "D1544A-T2.0 (28.9x50)", "D1545A-T1.2(28.9x61.5)", _
        "D1546A-T1.2 (62x33.7)", "D1546A-T2.0 (62x33.7)", "D1546C-T2.0 (85x33.7)", _
        "D1547A-T1.2 (50x39.2)", "D1547A-T2.0 (50x39.2)", "D1547C-T2.0 (85x39.2)", _
        "D1548A-T2.0 (39.5x20)", "D1549A-T2.0 (98x21.3)", "D1551A-T1.8 (93.4x62.8)", _
        "D1555A-T1.2 (28.9x71.5)", "D1555A-T2.0 (28.9x71.5)", "D1559A-T2.0 (93.4x38.8)", _
        "D17182-T1.2 (93.4x25.5)", "D17182-T2.0 (93.4x25.5)", "D17182-T2.0 (93.4x40)", _
        "D2618A-T2.0 (92.4x50.6)", "DA2006 (19x19x0.8)", "DA3001 (100.3X9.8)", _
        "ÐGCBG-HH,L,T", "DK-5", "DLM", "EP041K", "EP163K", "F347 (95x31.6)", "GO-GC55", _
        "GO-GC56", "KB", "KEG", "KTC", "MTC-UK", "NBM3.9", "NC-UK", "NDV", "NRS", "TCVLD-5", _
        "Vi3,9x19", "Vi3,9x40", "VN-M5x70", "ZL.3x9 (SP3x9)", "ZL.7x5 (SP7x5)"), Operator _
        :=xlFilterValues
    Selection.Copy
    Sheets("THVT").Select
    Range("C9").Select
    ActiveSheet.Paste
    ActiveWindow.SmallScroll Down:=-6
    Sheets("PTVT").Select
    Application.CutCopyMode = False
    Selection.ClearContents
    Selection.ClearContents
    Selection.ClearContents
    ActiveWindow.SmallScroll Down:=-24
    Sheets("THVT").Select
    Range("G9").Select
    ActiveCell.FormulaR1C1 = "=SUMIF(PTVT!C3,THVT!RC[-4],THVT!C[2])"
    Range("G9").Select
    ActiveCell.FormulaR1C1 = "=SUMIF(PTVT!C3,THVT!RC[-4],PTVT!C[2])"
    Range("G9").Select
    Selection.AutoFill Destination:=Range("G9:G84"), Type:=xlFillDefault
    Range("G9:G84").Select
    ActiveWindow.SmallScroll Down:=-54
    Range("H9").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-5],PTVT!R10C3:R2650C17,8,0)"
    Range("H9").Select
    Selection.AutoFill Destination:=Range("H9:H84"), Type:=xlFillDefault
    Range("H9:H84").Select
    ActiveWindow.SmallScroll Down:=-57
    Range("I9").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-6],PTVT!R9C3:R2650C17,1,0)"
    Range("I9").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-6],PTVT!R9C3:R2650C17,10,0)"
    Range("I9").Select
    Selection.AutoFill Destination:=Range("I9:I84"), Type:=xlFillDefault
    Range("I9:I84").Select
    ActiveWindow.SmallScroll Down:=-39
    Range("J9").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-7],PTVT!R9C3:R2650C17,12,0)"
    Range("J9").Select
    Selection.AutoFill Destination:=Range("J9:J84"), Type:=xlFillDefault
    Range("J9:J84").Select
    ActiveWindow.SmallScroll Down:=-84
    Range("K9").Select
    ActiveCell.FormulaR1C1 = ""
    Range("L9").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-9],PTVT!R10C3:R2650C17,14,0)"
    Range("L9").Select
    Selection.AutoFill Destination:=Range("L9:L84"), Type:=xlFillDefault
    Range("L9:L84").Select
    ActiveWindow.SmallScroll Down:=-39
    Range("J25").Select
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em sử dụng VBA để tính đường kính dây điện theo chủng loại (trong sheet Data_Cable)
Nhưng chạy ra VBA báo lỗi case without select case
Mã:
If Insulator = "PVC" Then
    Select Case Core
        Case "1C"
            For i = 1 To 16
                If AreaConductor = ThisWorkbook.Worksheets(1).Cells(i + 7, "A") Then
                    DK = ThisWorkbook.Worksheets(1).Cells(i + 7, "E")
                End If
            Exit For
        Case "2C"
            For i = 1 To 16
                If AreaConductor = ThisWorkbook.Worksheets(1).Cells(i + 7, "R") Then
                    DK = ThisWorkbook.Worksheets(1).Cells(i + 7, "AB")
                End If
            Exit For
        Case "3C"
            For i = 1 To 16
                If AreaConductor = ThisWorkbook.Worksheets(1).Cells(i + 7, "AI") Then
                    DK = ThisWorkbook.Worksheets(1).Cells(i + 7, "AS")
                End If
            Exit For
        Case "4C"
            For i = 1 To 16
                If AreaConductor = ThisWorkbook.Worksheets(1).Cells(i + 7, "AI") Then
                    DK = ThisWorkbook.Worksheets(1).Cells(i + 7, "BJ")
                End If
            Exit For
    End Select
End If
Các bác xem giúp em với
Em cảm ơn.
 

File đính kèm

Upvote 0
Hi các anh chị trong diễn đàn. Em mới chập chững học VBA nên chưa biết nhiều nên đăng bài nhờ các anh chị cao tay chỉ giáo. Chả là em có làm 1 Form nhập liệu, sau khi nhập liệu xong thì phải ấn vào button click Nhập thì Form mới nhập giá trị vào bảng, có cách nào để gán các phím như F1, F2 chạy song song cùng button click nhập không ạ ( có thể nhập bằng cách click vào chữ Nhập hoặc ấn F1 ấy ạ). CẢm ơn anh chị ạ.
upload_2017-5-26_18-12-36-png.176402
upload_2017-5-26_18-13-0-png.176403
 

File đính kèm

  • upload_2017-5-26_18-19-2.png
    upload_2017-5-26_18-19-2.png
    117.1 KB · Đọc: 1
  • upload_2017-5-26_18-19-28.png
    upload_2017-5-26_18-19-28.png
    117.1 KB · Đọc: 1
Upvote 0
Các bạn cho hỏi:
Thí dụ: Tại A1 khi mình nhập số 1 thì tại ô B1 sẽ hiển thị nội dung: - xxxx. Khi A1 nhập số 2 thì ô B1 sẽ hiển thị 2 dòng: -xxxx
-xxxx
Trong cùng ô B1.
Vậy các bạn cho hỏi mình phải viết code ntn. Vba thì mình đang bắt đầu học, việc này đang cần gấp. Mong mọi người giúp đỡ. Xin cám ơn.
 
Upvote 0
chào mọi người. tình hình là thầy giáo giao cho em nhiệm vụ lập trình vba để nhúng phần mềm thứ 3 là sap2000 để điều kiển sap2000? vậy cho e hỏi như thế có thể làm được không ạ? và độ khó cho 1 người chưa biết về vba là thế nào ạ? Em cảm ơn mọi người, hi vọng mọi người góp ý ạ!!!
 
Upvote 0
Nhờ mọi người giúp đỡ: mình muốn khóa chức năng in lại, muốn in tài liệu ra thì cần phải nhập mật khẩu
bác nào giúp với
 
Upvote 0
Chào Anh Chị.
Em viết một hàm tự tạo, em test trong VBA thì chạy đúng, nhưng khi ra ngoài Excel gõ thì nó lại không ra kết quả. Anh Chị chỉ giúp lỗi để em sửa.
PHP:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
    Dim intdem As Integer
    Dim intPos As Integer
        For intdem = Len(Trim(Province)) To 1 Step -1
        If Mid(Province, intdem, 1) = delimiter Then
            intPos = intdem
            Exit For
        End If
        Next intdem
 SplitProvince = Trim(Right(Province, Len(Province) - intdem))
End Function
1./Khi test trong VBA, kết quả chạy ngon lành.
PHP:
Sub test()
    Cells(1, 2).Value = SplitProvince((Range("A1").Value), ",")
End Sub
2./Khi ra ngoài Excel gõ : SplitProvince(text,",")-->chạy không được.
 

File đính kèm

Upvote 0
chào mọi người. tình hình là thầy giáo giao cho em nhiệm vụ lập trình vba để nhúng phần mềm thứ 3 là sap2000 để điều kiển sap2000? vậy cho e hỏi như thế có thể làm được không ạ? và độ khó cho 1 người chưa biết về vba là thế nào ạ? Em cảm ơn mọi người, hi vọng mọi người góp ý ạ!!!

Độ khó tuỳ thuộc vào mức độ "nhúng" và mức bảo mật của SAP. Cái này phải hỏi người quản lý cái phần mềm và csdl đó.
 
Upvote 0
2./Khi ra ngoài Excel gõ : SplitProvince(text,",")-->chạy không được.

Chạy không được tức là sao? Bạn hỏi nhiều ở đây rồi ít nhất cũng phải biết diễn tả "error gì gì đó, hay không ra đúng kết quả,..."
Trước mắt thì thấy: 1. dấu = đâu? 2. bạn có cái name nào tên là text để hàm nó duyệt chưa?
 
Upvote 0
Chào Anh Chị.
Em viết một hàm tự tạo, em test trong VBA thì chạy đúng, nhưng khi ra ngoài Excel gõ thì nó lại không ra kết quả. Anh Chị chỉ giúp lỗi để em sửa.
PHP:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
    Dim intdem As Integer
    Dim intPos As Integer
        For intdem = Len(Trim(Province)) To 1 Step -1
        If Mid(Province, intdem, 1) = delimiter Then
            intPos = intdem
            Exit For
        End If
        Next intdem
 SplitProvince = Trim(Right(Province, Len(Province) - intdem))
End Function
1./Khi test trong VBA, kết quả chạy ngon lành.
PHP:
Sub test()
    Cells(1, 2).Value = SplitProvince((Range("A1").Value), ",")
End Sub
2./Khi ra ngoài Excel gõ : SplitProvince(text,",")-->chạy không được.

Bạn muốn tìm vị trí cuối cùng của kí tự "delimiter" chăng ?
tìm hiểu thêm về hàm InStrRev có thể sẽ hữu ích cho bạn.
 
Upvote 0
Chào Anh Chị.
Em viết một hàm tự tạo, em test trong VBA thì chạy đúng, nhưng khi ra ngoài Excel gõ thì nó lại không ra kết quả. Anh Chị chỉ giúp lỗi để em sửa.
PHP:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
    Dim intdem As Integer
    Dim intPos As Integer
        For intdem = Len(Trim(Province)) To 1 Step -1
        If Mid(Province, intdem, 1) = delimiter Then
            intPos = intdem
            Exit For
        End If
        Next intdem
 SplitProvince = Trim(Right(Province, Len(Province) - intdem))
End Function
1./Khi test trong VBA, kết quả chạy ngon lành.
PHP:
Sub test()
    Cells(1, 2).Value = SplitProvince((Range("A1").Value), ",")
End Sub
2./Khi ra ngoài Excel gõ : SplitProvince(text,",")-->chạy không được.
Thì đương nhiên không chạy rồi. Ngoài bảng tính anh Bill có hiểu text là cái giống gì đâu chứ
Sao bạn không gõ: =SplitProvince(A1, ",")
???
Nói thêm là code này quá dài dòng
 
Upvote 0
Thì đương nhiên không chạy rồi. Ngoài bảng tính anh Bill có hiểu text là cái giống gì đâu chứ
Sao bạn không gõ: =SplitProvince(A1, ",")
???
Nói thêm là code này quá dài dòng

- Tối hôm qua, không hiểu gõ ra sao, mà nó không ra, giờ em gõ lại hàm thì nó ra rồi ạ.
- Nếu code dài dòng, xin Anh cho hướng để em tối ưu lại.
 
Upvote 0
Thì đương nhiên không chạy rồi. Ngoài bảng tính anh Bill có hiểu text là cái giống gì đâu chứ
Sao bạn không gõ: =SplitProvince(A1, ",")
???
Nói thêm là code này quá dài dòng

Em đổi lại như thế này, tối ưu chưa Anh ạ.
PHP:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
    Dim sArr() As String
    sArr = Split(Province, delimiter)
    SplitProvince = sArr(UBound(sArr, 1))
End Function
 
Upvote 0
Em có một sub như sau:
PHP:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, n As Long
  Dim Arr1(), Arr2(), Arr3(), tmp
  On Error Resume Next

  If Dic Is Nothing Then Auto_Open
  If Not Intersect(Range("C6:C10000"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C10000"), Target)
    If IsArray(rTarget.Value) Then
      aTarget = rTarget.Value
...
Em để trong ThisWorkbook nhằm update thông tin nếu có sự thay đổi ở một cột chỉ định. Tuy nhiên có một sự bất tiện là có một sheet em không muốn sub này tác động đến thì em làm thế nào mà không phải xóa Sub này đi và add vào từng sheet trừ sheet mình không muốn tác động?
 
Upvote 0
Hi mọi người,

Do nhu cầu của công việc, mình đang phát triển macro để tự động gửi mail kèm attached file tới 1 nhóm người cố định

Yêu cầu :
- Một file / 1 e-mail
- Trên subject sẽ thể hiện tên file và 1 số thông tin thay đổi theo từng file.

Hướng làm của mình :
- Tất cả attached file, mình đều save vao ổ đĩa C
- Trong file excel, mình thể hiện các thông tin cần hiển thị trên subject e-mail.
( Mình có gửi hình chụp để mọi người tham khảo )

Mình đã viết đoạn code như sau :
Mã:
Sub TestSendEmail()
    Dim OutApp As Object
    Dim OutMail As Object
    
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    
    On Error Resume Next
    
    With OutMail
        .To = "hoang.xuan@gmail.com"
        .CC = ""
        .BCC = ""
        .Subject = "Arrival Notice" & " " & Range("A2").Value & " " & Range("B2").Value & " " & Range("C2").Value & " " & Range("D2").NumberFormat
        .Body = "Please kindly see attached file"
        .Attachments.Add (Range("C6").Value & Range("A2").Value & ".pdf")
        .Send
    End With
    On Error GoTo 0
    
    Set OutMail = Nothing
    Set OutApp = Nothing


    MsgBox ("ARRIVAL NOTICE IS SENT TO CUSTOMER")

End Sub

Code đã chạy ok nhưng vấn đề của mình là code chỉ chạy dc cho dòng đầu tiên thôi. Mình muốn viết đoạn code để có thể chạy lần lượt cho tất cả các số trong cột HBL và subject e-mail thể hiện thông tin tương đương vs số HBL đó.

Mong mọi người hướng dẫn thêm.

Cám ơn rất nhiều
 

File đính kèm

  • VBA.jpg
    VBA.jpg
    70.1 KB · Đọc: 5
  • CODE.txt
    CODE.txt
    752 bytes · Đọc: 4
Upvote 0
Em đổi lại như thế này, tối ưu chưa Anh ạ.
PHP:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
    Dim sArr() As String
    sArr = Split(Province, delimiter)
    SplitProvince = sArr(UBound(sArr, 1))
End Function
Dùng InStrRev như bài 753 gợi ý sẽ tốt hơn
Ngoài ra bạn chưa tính đến mấy trường hợp sau:
1> Nếu không tìm thấy delimiter thì thế nào? Chẳng hạn theo file của bạn, nếu tôi gõ công thức =SplitProvince(A1,":") thì.. tè lè hết trơn
2> Trong mốt số trường hợp nào đó mà delimiter có đòi hỏi phân biệt HOA thường thì bạn tính sao? Chẳng hạn theo file của bạn nếu tôi gõ =SplitProvince(A1,"Cầ") thì kết quả OK trong khi nếu gõ =SplitProvince(A1,"cầ") lại... tè lè... tiếp
-------------------------
Nên nhớ rằng các hàm xử lý chuỗi trong VBA luôn luôn cung cấp cho ta kiểu so sánh (vbTextCompare hoặc vbBinaryCompare) mà không hiểu sao tôi thấy hầu hết mọi người thường ít để ý đến
Với code trên, nếu viết vầy:
Mã:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
  Dim sArr() As String
  If InStr(1, Province, delimiter, vbTextCompare) Then
    sArr = Split(Province, delimiter, , vbTextCompare)
    SplitProvince = sArr(UBound(sArr))
  End If
End Function
sẽ tốt hơn rất nhiều (theo ý kiến cá nhân tôi)
Còn tôi thì viết vầy:
Mã:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
  Dim lPos As Long
  lPos = InStrRev(Province, delimiter, , vbTextCompare)
  If lPos Then SplitProvince = Trim(Mid(Province, lPos + Len(delimiter)))
End Function
Hoặc tùy biến hơn:
Mã:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String, Optional ByVal CompareMode = vbTextCompare) As String
  Dim lPos As Long
  lPos = InStrRev(Province, delimiter, , CompareMode)
  If lPos Then SplitProvince = Trim(Mid(Province, lPos + Len(delimiter)))
End Function
Bạn thấy... sao?
 
Upvote 0
Dùng InStrRev như bài 753 gợi ý sẽ tốt hơn
Ngoài ra bạn chưa tính đến mấy trường hợp sau:
1> Nếu không tìm thấy delimiter thì thế nào? Chẳng hạn theo file của bạn, nếu tôi gõ công thức =SplitProvince(A1,":") thì.. tè lè hết trơn
2> Trong mốt số trường hợp nào đó mà delimiter có đòi hỏi phân biệt HOA thường thì bạn tính sao? Chẳng hạn theo file của bạn nếu tôi gõ =SplitProvince(A1,"Cầ") thì kết quả OK trong khi nếu gõ =SplitProvince(A1,"cầ") lại... tè lè... tiếp
-------------------------
Nên nhớ rằng các hàm xử lý chuỗi trong VBA luôn luôn cung cấp cho ta kiểu so sánh (vbTextCompare hoặc vbBinaryCompare) mà không hiểu sao tôi thấy hầu hết mọi người thường ít để ý đến
Với code trên, nếu viết vầy:
Mã:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
  Dim sArr() As String
  If InStr(1, Province, delimiter, vbTextCompare) Then
    sArr = Split(Province, delimiter, , vbTextCompare)
    SplitProvince = sArr(UBound(sArr))
  End If
End Function
sẽ tốt hơn rất nhiều (theo ý kiến cá nhân tôi)
Còn tôi thì viết vầy:
Mã:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String) As String
  Dim lPos As Long
  lPos = InStrRev(Province, delimiter, , vbTextCompare)
  If lPos Then SplitProvince = Trim(Mid(Province, lPos + Len(delimiter)))
End Function
Hoặc tùy biến hơn:
Mã:
Function SplitProvince(ByVal Province As String, ByVal delimiter As String, Optional ByVal CompareMode = vbTextCompare) As String
  Dim lPos As Long
  lPos = InStrRev(Province, delimiter, , CompareMode)
  If lPos Then SplitProvince = Trim(Mid(Province, lPos + Len(delimiter)))
End Function
Bạn thấy... sao?

- Em sẽ thay đổi theo hướng dùng hàm InStrRev, đồng thời bẫy lỗi và dùng kiểu so sánh với text, cho Function được hoàn thiện hơn.Cảm ơn Anh./
 
Upvote 0
Em có một sub như sau:
PHP:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim rTarget As Range, aTarget, i As Long, n As Long
  Dim Arr1(), Arr2(), Arr3(), tmp
  On Error Resume Next

  If Dic Is Nothing Then Auto_Open
  If Not Intersect(Range("C6:C10000"), Target) Is Nothing Then
    Set rTarget = Intersect(Range("C6:C10000"), Target)
    If IsArray(rTarget.Value) Then
      aTarget = rTarget.Value
...
Em để trong ThisWorkbook nhằm update thông tin nếu có sự thay đổi ở một cột chỉ định. Tuy nhiên có một sự bất tiện là có một sheet em không muốn sub này tác động đến thì em làm thế nào mà không phải xóa Sub này đi và add vào từng sheet trừ sheet mình không muốn tác động?
Bạn thêm đoạn code này vào đầu thủ tục, cái này sẽ làm cho nó không tác động vào sheet1.
Mã:
if sh is sheet1 then exit sub
 
Upvote 0
Hi mọi người,

Do nhu cầu của công việc, mình đang phát triển macro để tự động gửi mail kèm attached file tới 1 nhóm người cố định

Yêu cầu :
- Một file / 1 e-mail
- Trên subject sẽ thể hiện tên file và 1 số thông tin thay đổi theo từng file.

Hướng làm của mình :
- Tất cả attached file, mình đều save vao ổ đĩa C
- Trong file excel, mình thể hiện các thông tin cần hiển thị trên subject e-mail.
( Mình có gửi hình chụp để mọi người tham khảo )

Mình đã viết đoạn code như sau :
Mã:
Sub TestSendEmail()
    Dim OutApp As Object
    Dim OutMail As Object
 
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
 
    On Error Resume Next
 
    With OutMail
        .To = "hoang.xuan@gmail.com"
        .CC = ""
        .BCC = ""
        .Subject = "Arrival Notice" & " " & Range("A2").Value & " " & Range("B2").Value & " " & Range("C2").Value & " " & Range("D2").NumberFormat
        .Body = "Please kindly see attached file"
        .Attachments.Add (Range("C6").Value & Range("A2").Value & ".pdf")
        .Send
    End With
    On Error GoTo 0
 
    Set OutMail = Nothing
    Set OutApp = Nothing


    MsgBox ("ARRIVAL NOTICE IS SENT TO CUSTOMER")

End Sub

Code đã chạy ok nhưng vấn đề của mình là code chỉ chạy dc cho dòng đầu tiên thôi. Mình muốn viết đoạn code để có thể chạy lần lượt cho tất cả các số trong cột HBL và subject e-mail thể hiện thông tin tương đương vs số HBL đó.

Mong mọi người hướng dẫn thêm.

Cám ơn rất nhiều
Bạn tải code trong video về, và cấu hính như video là chạy được luôn.
httpssssss://www.youtube.com/watch?v=dcZEEBtIW4o
 
Upvote 0
Chào anh, chị.
Em có dùng đoạn code, mở từng File trong 01 thư mục được chỉ định, rồi copy lên File tổng hợp. Nhưng vì số lượng File lớn, mỗi lần mở file, copy dữ liệu rồi paste qua File TongHop. Em thấy làm vậy rất lâu.
- Không biết em có thể dùng mảng, để mỗi lần mở File lên.
+ Lưu hết dữ liệu vào mảng
+ Cuối cùng paste 01 lần vào File tổng hợp không?

Các Anh chị cho Em hướng để làm.
PHP:
Sub Copy_Database()
    Application.ScreenUpdating = False
    Application.AskToUpdateLinks = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Range("A7:Z60000").ClearContents
    Dim rngVung As Range
    Dim strPath As String
    Dim fileName As String
    Dim NameFile As String
    strPath = Range("H1").Value
    fileName = Dir(strPath & "*.xls*")
    NameFile = ThisWorkbook.Name
    Do While fileName <> ""
        Workbooks.Open (strPath & fileName)
    
            ActiveWorkbook.ActiveSheet.Select
        If Application.WorksheetFunction.CountA(Range("A2:A60000")) > 0 Then
    
            Range("A2", Range("A60000").End(xlUp).Offset(0, 25)).Copy           ' Copy data Each a File
            Workbooks(NameFile).Sheets("Database").Range("A60000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues    ' Paste vao File tong hop
        End If
        Application.CutCopyMode = False
        ActiveWorkbook.Close SaveChanges:=False
        fileName = Dir()
    Loop
    Application.ScreenUpdating = True
    Application.Calculation = xlAutomatic
    Application.DisplayAlerts = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn có code rồi thì cứ chạy thử 1, rồi 2, rồi 3 files xem sao.
Nếu không chạy được thì cho biết còn vướng chỗ nào.
 
Upvote 0
Bạn có code rồi thì cứ chạy thử 1, rồi 2, rồi 3 files xem sao.
Nếu không chạy được thì cho biết còn vướng chỗ nào.

Cảm ơn Anh.Hiện tại Em chạy ổn.
Em muốn tìm 01 giải pháp để làm nhanh hơn, hiện tại số lượng file của em lớn, tầm 300 file rồi.
 
Upvote 0
Copy file vào file là trường hợp cực chẳng đã, không phải là công việc thường xuyên và có tính chất lâu dài.
Miễn nó hoạt động đúng là được rồi, đâu cần phải nhanh.

Nếu việc copy data trở thành công việc thường xuyên thì phải xem lại quy trình làm việc của cty. Có thể dùng phương pháp khác sẽ dễ kiểm soát hơn.
Cứ vài ngày mà phải copy 300 files thì hơi lãng phí.
Nếu là tôi thì thử thí nghiệm cách nhận data theo dạng csv, append chúng vào thành 1 file rồi import vào file tổng. Import xuyên qua Access cũng là 1 cách kiểm soát tốt.
 
Upvote 0
Nhờ các thầy và các anh chỉnh sửa lại code giúp cho em với ạ.
- Khi Enter thì thời gian chạy không có vấn đề gì. Nhưng thời gian chạy lùi không chạy hẳn về "0:00" mà chỉ đến "0:01" rồi đánh chuông và chuyển sang thời gian nghỉ. Kể cả thời gian nghỉ chạy lùi cũng vậy, về đến "0:01" là đã đánh chuông rồi mà không phải là về hẳn "0:00". Do vậy mà thời gian nó như kiểu bị trễ giây ý ạ, và lúc chuyển sang thời gian nghỉ giữa hiệp nó cũng bị mất đi 1s đầu ạ.
---> Chỉnh lại giúp em là: Khi thời gian chạy lùi về "0:00" thì mới đánh chuông (Cả Thời gian thi đấu lẫn Thời gian nghỉ giữa hiệp), sau đó mới chuyển sang sự kiện tiếp theo.
Em cảm ơn ạ.
 

File đính kèm

Upvote 0
Các thầy và các anh có giải pháp gì không ạ?
 
Upvote 0
Nhờ các thầy và các anh chỉnh sửa lại code giúp cho em với ạ.
- Khi Enter thì thời gian chạy không có vấn đề gì. Nhưng thời gian chạy lùi không chạy hẳn về "0:00" mà chỉ đến "0:01" rồi đánh chuông và chuyển sang thời gian nghỉ. Kể cả thời gian nghỉ chạy lùi cũng vậy, về đến "0:01" là đã đánh chuông rồi mà không phải là về hẳn "0:00". Do vậy mà thời gian nó như kiểu bị trễ giây ý ạ, và lúc chuyển sang thời gian nghỉ giữa hiệp nó cũng bị mất đi 1s đầu ạ.
---> Chỉnh lại giúp em là: Khi thời gian chạy lùi về "0:00" thì mới đánh chuông (Cả Thời gian thi đấu lẫn Thời gian nghỉ giữa hiệp), sau đó mới chuyển sang sự kiện tiếp theo.
Em cảm ơn ạ.
Chả hiểu chi nữa, thử sửa cái này xem có đúng không?

Mã:
Private Sub DisplayTimer()
Dim i As Long
If Not Pause Then
    If Min = 0 And Sec <= 0 Then
 
Upvote 0
Chả hiểu chi nữa, thử sửa cái này xem có đúng không?

Mã:
Private Sub DisplayTimer()
Dim i As Long
If Not Pause Then
    If Min = 0 And Sec <= 0 Then
Hihi. Cảm ơn ạ. Chạy lùi về 0:00 ổn rồi ạ. Chỉ còn phần thời gian nghỉ giữa hiệp bị trễ mất 1s lúc đầu thôi ạ. Tiếp tục nhờ trợ giúp của mọi người.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào các bạn. Cho mình hỏi: Mình viết 1 code sau, và cho vào thành addin
  1. Sub Auto_open()
  2. On Error Resume Next
  3. Dim i As Long, Tenfile as String
  4. i = Workbooks.Count
  5. Tenfile = Workbooks(i).Name
  6. If Right(Tenfile, 3) = "xls" Then
  7. MsgBox "HE THONG KHONG HO TRO MO DINH DANG FILE NAY"
  8. Workbooks(i).Close Save = False
  9. End If
  10. End Sub
Mục đích: Mỗi khi mở từ file thứ 2 trở đi. mà mở file Excel có đuôi là xls (Định dạng 2003), thì sẽ không cho mở. Nhưng không hiểu sao Addin không tự động chạy mặc dù là Auto_open. Vậy có cách nào khác không, hay code bị lỗi đoạn nào vậy. Mình cảm ơn
 
Upvote 0
Xin chào các bạn. Cho mình hỏi: Mình viết 1 code sau, và cho vào thành addin
  1. Sub Auto_open()
  2. On Error Resume Next
  3. Dim i As Long, Tenfile as String
  4. i = Workbooks.Count
  5. Tenfile = Workbooks(i).Name
  6. If Right(Tenfile, 3) = "xls" Then
  7. MsgBox "HE THONG KHONG HO TRO MO DINH DANG FILE NAY"
  8. Workbooks(i).Close Save = False
  9. End If
  10. End Sub
Mục đích: Mỗi khi mở từ file thứ 2 trở đi. mà mở file Excel có đuôi là xls (Định dạng 2003), thì sẽ không cho mở. Nhưng không hiểu sao Addin không tự động chạy mặc dù là Auto_open. Vậy có cách nào khác không, hay code bị lỗi đoạn nào vậy. Mình cảm ơn
Code AddIn kiểu này chắc chắn không hoạt động, bởi Sub Auto_Open chỉ chạy 1 lần duy nhất khi kích hoạt AddIn mà thôi, và code sẽ không "nhìn" thấy được các file mở sau đó
Muốn làm được yêu cầu trên phải dùng Class. Quy trình như sau:
1> Chèn 1 Class Module, đặt tên là clsWkbEvents
Code trong Class Module:
Mã:
Public WithEvents ExlApp As Application
Private Sub Class_Initialize()
  Set ExlApp = Application
End Sub
Private Sub Class_Terminate()
  Set ExlApp = Nothing
End Sub
Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
  If UCase(Right(Wb.FullName, 3)) = "XLS" Then
    MsgBox "HE THONG KHÔNG HO TRO MO DINH DANG FILE NÀY"
    Wb.Close False
  End If
End Sub
2> Chèn 1 Module đặt tên tùy ý, với code:
Mã:
Dim ExlObj As New clsWkbEvents
Sub Auto_Open()
  If ExlObj Is Nothing Then Set ExlObj = New clsWkbEvents
End Sub
Sub Auto_Close()
  Set ExlObj = Nothing
End Sub
Giờ Save As file thành XLAM, kích hoạt AddIn và test thử
 
Upvote 0
Code AddIn kiểu này chắc chắn không hoạt động, bởi Sub Auto_Open chỉ chạy 1 lần duy nhất khi kích hoạt AddIn mà thôi, và code sẽ không "nhìn" thấy được các file mở sau đó
Muốn làm được yêu cầu trên phải dùng Class. Quy trình như sau:
1> Chèn 1 Class Module, đặt tên là clsWkbEvents
Code trong Class Module:
Mã:
Public WithEvents ExlApp As Application
Private Sub Class_Initialize()
  Set ExlApp = Application
End Sub
Private Sub Class_Terminate()
  Set ExlApp = Nothing
End Sub
Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
  If UCase(Right(Wb.FullName, 3)) = "XLS" Then
    MsgBox "HE THONG KHÔNG HO TRO MO DINH DANG FILE NÀY"
    Wb.Close False
  End If
End Sub
2> Chèn 1 Module đặt tên tùy ý, với code:
Mã:
Dim ExlObj As New clsWkbEvents
Sub Auto_Open()
  If ExlObj Is Nothing Then Set ExlObj = New clsWkbEvents
End Sub
Sub Auto_Close()
  Set ExlObj = Nothing
End Sub
Giờ Save As file thành XLAM, kích hoạt AddIn và test thử

Đụng đến "Class Module" thì e chỉ bít Copy và Paste chứ chưa thể hiểu được. Addin chạy ngon lành. Cảm ơn thầy nhiều. Chúc thầy buổi chiều vui vẻ :)
 
Upvote 0
Code AddIn kiểu này chắc chắn không hoạt động, bởi Sub Auto_Open chỉ chạy 1 lần duy nhất khi kích hoạt AddIn mà thôi, và code sẽ không "nhìn" thấy được các file mở sau đó
Muốn làm được yêu cầu trên phải dùng Class. Quy trình như sau:
1> Chèn 1 Class Module, đặt tên là clsWkbEvents
Code trong Class Module:
Mã:
Public WithEvents ExlApp As Application
Private Sub Class_Initialize()
  Set ExlApp = Application
End Sub
Private Sub Class_Terminate()
  Set ExlApp = Nothing
End Sub
Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
  If UCase(Right(Wb.FullName, 3)) = "XLS" Then
    MsgBox "HE THONG KHÔNG HO TRO MO DINH DANG FILE NÀY"
    Wb.Close False
  End If
End Sub
2> Chèn 1 Module đặt tên tùy ý, với code:
Mã:
Dim ExlObj As New clsWkbEvents
Sub Auto_Open()
  If ExlObj Is Nothing Then Set ExlObj = New clsWkbEvents
End Sub
Sub Auto_Close()
  Set ExlObj = Nothing
End Sub
Giờ Save As file thành XLAM, kích hoạt AddIn và test thử
Thầy ơi, chưa lần nào thầy sửa giúp e cả. Hix..
 
Upvote 0
Xin chào các bạn. Cho mình hỏi: Mình viết 1 code sau, và cho vào thành addin
  1. Sub Auto_open()
  2. On Error Resume Next
  3. Dim i As Long, Tenfile as String
  4. i = Workbooks.Count
  5. Tenfile = Workbooks(i).Name
  6. If Right(Tenfile, 3) = "xls" Then
  7. MsgBox "HE THONG KHONG HO TRO MO DINH DANG FILE NAY"
  8. Workbooks(i).Close Save = False
  9. End If
  10. End Sub
Mục đích: Mỗi khi mở từ file thứ 2 trở đi. mà mở file Excel có đuôi là xls (Định dạng 2003), thì sẽ không cho mở. Nhưng không hiểu sao Addin không tự động chạy mặc dù là Auto_open. Vậy có cách nào khác không, hay code bị lỗi đoạn nào vậy. Mình cảm ơn
Dán đoạn code này vào thisworkbook là được.

Mã:
Dim WithEvents app As Excel.Application


Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
    On Error Resume Next
   
    If Application.Workbooks.Count >= 2 Then
        If Strings.UCase(Strings.Right$(Wb.Name, 3)) = "XLS" Then
            MsgBox "He thong khong ho tro loai file nay"
            Wb.Close False
           
        End If
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Set app = Nothing
End Sub

Private Sub Workbook_Open()
    Set app = Application
End Sub
 
Upvote 0
Dán đoạn code này vào thisworkbook là được.

Mã:
Dim WithEvents app As Excel.Application


Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
    On Error Resume Next
  
    If Application.Workbooks.Count >= 2 Then
        If Strings.UCase(Strings.Right$(Wb.Name, 3)) = "XLS" Then
            MsgBox "He thong khong ho tro loai file nay"
            Wb.Close False
          
        End If
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Set app = Nothing
End Sub

Private Sub Workbook_Open()
    Set app = Application
End Sub

Bạn ơi. Vấn đề là cái workbook mà đuôi xls, đâu pải là của mình. Nên phải tạo addin đó bạn. Chứ dán vào ThisWorkBook đâu có tác dụng j đâu
 
Upvote 0
Upvote 0
Dear anh chị GPE

Em cần trích lọc dữ liệu theo điều kiện 1, điều kiện 2, và theo thời gian từ ngày đến ngày. để làm báo cáo. Dựa vào file data

Mong anh chị giúp trợ giúp em, cho em xin cao kiến 1 đoạn code VBA để làm công việc trên ạ. File ví dụ em xin đính kèm
 

File đính kèm

Upvote 0
Nhờ các cao thủ GPE giúp hoàn thiện em code file này với !!!
 

File đính kèm

Upvote 0
..............................................................
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
cần may anh giúp đỡ nội dung như thế này:
1. em cần cho ô A1 (là ô của lớp cụ thể bắt đầu 12A1)
2. Cho ô A1 hiển thị vào Form nhập liệu, sau khi nhập số liệu ở các dòng B2:N2 sau khi xong bấm vào LƯU DỮ LIỆU thì dòng hiện hành sẽ là ô B3:N3,.....cứ như thế đến B39:N39
link dính kèm bên dưới
 

File đính kèm

Upvote 0
Mã:
Sub Find_First()
    Dim FindString As String
    Dim Rng As Range
    Dim FistAddress As String
    Dim LastAddress As String
    Dim Result As Range
    Dim ws As Worksheet
    Dim firstAdd As String
 
    ' Xóa dong trong trong sheet NET
    Sheets("NET").Select
    Range("A4").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.EntireRow.Delete

 
 
    'Tim gia tri dau tien
    
    FindString = InputBox("Can Tim Kiem Cai Gi:", "Tra Cuu")
        If Trim(FindString) <> "" Then
        With Sheets("Sheet1").Range("C:D")
            Set Rng = .Find(What:=FindString, _
                            After:=.Cells(.Cells.Count), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
            firstAdd = Rng.Address
            If Not Rng Is Nothing Then
                Application.Goto Rng, True
                Cells(Rng.Row, 13).Value = 1
                FistAddress = Rng.Row
            Else
                MsgBox "Nothing found"
            End If
        End With
    
        'Tim gia tri cuoi cung
                With Sheets("Sheet1").Range("C:D")
            Do
        
            Set Rng = .Find(What:=FindString, _
                            After:=.Cells(1), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False)
            If Not Rng Is Nothing Then
            
                    'Rng = Cells(LastAddress, 3)
                    'Set Rng = .FindNext(Rng)
        
                Application.Goto Rng, True
                    Cells(Rng.Row, 13).Value = 2
                    LastAddress = Rng.Row
                    'MsgBox Cells(Rng.Row, 11)
                    'MsgBox Cells(Rng.Row, 3)
                    Set Rng = Cells(LastAddress, 3)
                    Set Rng = .FindNext(Rng)
                    FindString = Cells(LastAddress, 3)
            Else
                MsgBox "Nothing found"
            End If
            Loop While firstAdd <> Rng.Address And Cells(Rng.Row, 11) > 600
    'Copy sang Sheet NET
    Set Result = Range(Cells(FistAddress, 1), Cells(LastAddress, 12))
    Result.Select
    Selection.Copy Destination:=Sheets("NET").Range("A4")
    Sheet23.Activate
        
        End With
    
    End If

End Sub

em nhờ các anh/chị xem giúp em giờ em muốn code này tìm kiếm ở các sheet thì sửa như thế nào ạ?

topic hỏi đáp của em ở đây ạ nếu sai mod bỏ qua cho em với ạ
http://www.giaiphapexcel.com/diendan/threads/nhờ-các-bác-sửa-hoặc-tối-ưu-code-tìm-kiếm-ạ.127401/
 
Upvote 0
a (chị ) xem hộ bị lỗi vòng lặp vô hạn cách khắc phục!

Mã:
Sub sosanh()
Dim i As Integer
Dim a, b As Integer
 Sheets("1").Select
   a = Application.WorksheetFunction.RandBetween(1, 3)
   b = Application.WorksheetFunction.RandBetween(1, 3)
           Do
            Calculate
          Loop until (a = b)
        MsgBox "gia tri a va b la: " & a &" "& b
End Sub
 
Upvote 0
a (chị ) xem hộ bị lỗi vòng lặp vô hạn cách khắc phục!
Viết cái gì không hiểu luôn. Ngắt ý ở chỗ nào trong câu trên?
Dòng này "Sheets("1").Select" để làm gì?
Mã:
a = Application.WorksheetFunction.RandBetween(1, 3)
   b = Application.WorksheetFunction.RandBetween(1, 3)
           Do
            Calculate
          Loop until (a = b)
Đoạn trên chẳng có lỗi nào cả. Nó chạy vòng mãi chưa tìm thấy a=b là do mình chứ có lỗi lầm gì đâu.
Đổi thành a=RandBetween(1, 1) và b=RandBetween(1, 2) xem.
 
Upvote 0
a (chị ) xem hộ bị lỗi vòng lặp vô hạn cách khắc phục!

Mã:
Sub sosanh()
Dim i As Integer
Dim a, b As Integer
 Sheets("1").Select
   a = Application.WorksheetFunction.RandBetween(1, 3)
   b = Application.WorksheetFunction.RandBetween(1, 3)
           Do
            Calculate
          Loop until (a = b)
        MsgBox "gia tri a va b la: " & a &" "& b
End Sub
Vầy thử xem:
Mã:
Sub Test()
  Dim a As Long, b As Long
  Randomize
  Do
    a = Int(Rnd() * 3) + 1
    b = Int(Rnd() * 3) + 1
  Loop Until (a = b)
  MsgBox "gia tri a va b la: " & a & " " & b
End Sub
 
Upvote 0
a (chị ) xem hộ bị lỗi vòng lặp vô hạn cách khắc phục!

Mã:
Sub sosanh()
Dim i As Integer
Dim a, b As Integer
 Sheets("1").Select
   a = Application.WorksheetFunction.RandBetween(1, 3)
   b = Application.WorksheetFunction.RandBetween(1, 3)
           Do
            Calculate
          Loop until (a = b)
        MsgBox "gia tri a va b la: " & a &" "& b
End Sub
Mới học vba nên bị ngộ nhận. a và b trong trường hợp này chỉ được tính duy nhất một lần, Chạy cái này thì xác xuất treo máy là rất cao.
 
Upvote 0
Mã:
a = Application.WorksheetFunction.RandBetween(1, 3)
   b = Application.WorksheetFunction.RandBetween(1, 3)
           Do
            Calculate
          Loop until (a = b)
Đoạn trên chẳng có lỗi nào cả. Nó chạy vòng mãi chưa tìm thấy a=b là do mình chứ có lỗi lầm gì đâu.
Đổi thành a=RandBetween(1, 1) và b=RandBetween(1, 2) xem.

Người viết code nghĩ rằng lệnh Calculate sẽ buộc hàm WorksheetFunction.RandBetween tính lại. Và nếu tính lại thì sẽ có lúc a và b bằng nhau. Nhưng vì chúng khong tính lại nên vòng lặp vô tận.
Chỉ cần đặt con toán tính a hoặc b (hoặc cả hai) nằm trong vòng lặp là được.
 
Upvote 0
Xin mạn phép tiếp tục hỏi các thầy và các anh, ở #768 sau khi thời gian chạy về 0 rồi mới có chuông đã ok. Nhưng có một điều là vì vòng lặp của thời gian với chuông kêu là gắn liền với nhau (như code trong hình) nên xảy ra tình trạng khi chuông kêu thì thời gian chạy xuất hiện độ trễ giây (thấy rõ nhất là lúc hết giờ chuyển sang thời gian nghỉ, thời gian nghỉ lúc đó trễ giây kiểu như độ trễ giây tương đương với thời gian của file chuông kêu đó. Như ở file Bang thi dau, em cho thời gian nghỉ là 5s, thì lúc hết giờ thi đấu chuyển sang nghỉ giữa hiệp bị mất đi 1s, tức là thời gian nghỉ bắt đầu chạy lùi từ giây thứ 4 mà không phải là giây thứ 5.
1. ---> Em xin hỏi có cách nào cho thời gian chạy bình thường, không có độ trễ giây mà chuông vẫn kêu đúng như lúc: Bắt đầu thi đấu, Hết hiệp, Hết thời gian nghỉ và Kết thúc trận đấu không ạ?
2. ---> Làm sao khi thời gian nghỉ giữa hiệp chạy về đến 10s là chuông kêu thay cho chạy về đến 0s mới kêu, còn thời gian vẫn chạy lùi về 0 ạ.
Cảm ơn ạ!
 

File đính kèm

Upvote 0
Thưa thầy em có đoạn code copy: Em muốn nếu có dòng ở cột F ko có giữ liệu thì ko copy vào những dòng đó thì phải làm như nào ạ

Sub CopyPK()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

Dim lr As Long

lr = Range("F65535").End(xlUp).row
Range("I9:AG9").Copy
Range("I10:AG" & lr).PasteSpecial Paste:=xlPasteFormulas

Range("A8").Select 'Quay con cho? lai F2

Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Thưa thầy em có đoạn code copy: Em muốn nếu có dòng ở cột F ko có giữ liệu thì ko copy vào những dòng đó thì phải làm như nào ạ

Sub CopyPK()
..
End Sub
1/ Cho code vào thẻ chèn code. Tìm đọc ở mục 4 màu đỏ ở link
http://www.giaiphapexcel.com/diendan/threads/một-số-ý-kiến-về-gpe-xenforo.124418/page-2#post-778298

2/ Gợi ý:
- Cách 1: Lọc cột F với điều kiện <>"" rồi mới dán công thức vào.
- Cách 2: Làm như cách cũ, rồi lọc cột F với điều kiện =blank, rồi xóa công thức ở dòng vừa lọc được.
 
Upvote 0
Nhờ Anh/ Chị giải quyết giúp em đoạn code cho bài tập này với:
- Tại userform của Sheet2 nếu user nhập đúng tên trong cmbName thì các dữ liệu tương ứng của user đó sẽ được show trong các textbox còn lại: txtAddress, txtPhone....
- Ngược lại nếu cmbName rỗng thì sẽ được thông báo qua msgbox & sẽ tiếp tục được nhập giá trị mới vào
Em mới học vba nên phương án xử lý chưa thạo lắm.
Em xin cảm ơn ạ.
 

File đính kèm

Upvote 0
Nhờ Anh/ Chị giải quyết giúp em đoạn code cho bài tập này với:
- Tại userform của Sheet2 nếu user nhập đúng tên trong cmbName thì các dữ liệu tương ứng của user đó sẽ được show trong các textbox còn lại: txtAddress, txtPhone....
- Ngược lại nếu cmbName rỗng thì sẽ được thông báo qua msgbox & sẽ tiếp tục được nhập giá trị mới vào
Em mới học vba nên phương án xử lý chưa thạo lắm.
Em xin cảm ơn ạ.
- Bạn chèn đoạn code sau vào cái nút Submit Form.
- Bạn đã thiết kế cái Combobox, sao bạn không cho chọn, mà lại thích đánh vào.

Mã:
Private Sub btnSubmit_Click()
    Dim cbName As Variant
    Dim rFind As Range
    cbName = UserForm1.cmbName.Value
    If cbName = "" Then
        MsgBox "Ban chu nhap Ten vao", vbCritical, "Chu Y"
    ElseIf cbName <> "" Then
        Set rFind = Sheets("Sheet2").Range("D2:D1000").Find(cbName, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
            If Not rFind Is Nothing Then
                txtAddress = rFind.Offset(0, 1).Value
                txtPhone = rFind.Offset(0, 2).Value
                txtZipcode = rFind.Offset(0, 3).Value
            Else
                txtAddress = ""
                txtPhone = ""
                txtZipcode = ""
                MsgBox "Not Found"
            End If
    End If
End Sub
 
Upvote 0
- Bạn chèn đoạn code sau vào cái nút Submit Form.
- Bạn đã thiết kế cái Combobox, sao bạn không cho chọn, mà lại thích đánh vào.

Mã:
Private Sub btnSubmit_Click()
    Dim cbName As Variant
    Dim rFind As Range
    cbName = UserForm1.cmbName.Value
    If cbName = "" Then
        MsgBox "Ban chu nhap Ten vao", vbCritical, "Chu Y"
    ElseIf cbName <> "" Then
        Set rFind = Sheets("Sheet2").Range("D2:D1000").Find(cbName, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
            If Not rFind Is Nothing Then
                txtAddress = rFind.Offset(0, 1).Value
                txtPhone = rFind.Offset(0, 2).Value
                txtZipcode = rFind.Offset(0, 3).Value
            Else
                txtAddress = ""
                txtPhone = ""
                txtZipcode = ""
                MsgBox "Not Found"
            End If
    End If
End Sub

- Hi bạn phuyen, rất cám ơn bạn đã hỗ trợ code giúp mình. Cái Combobox ở đây sẽ có tác dụng là cho chọn Name bất kỳ từ Sheet2.Range("D2:D1000"). Nếu không tìm thấy Name trong Sheet2.Range("D2:D1000") thì user có thể Add mới thông tin cần nhập vào qua nút Submit Form.
- Ở đây mình muốn áp dụng hàm Vlookup để lấy dữ liệu lên Userform1. Và cái cmbName là cái Combobox để làm tiêu chí kiểm tra dữ liệu có trong Sheet2.Range(D2:D1000) hay không.

Nhờ bạn hỗ trợ giúp code mình vấn đề này. Xin cảm ơn.
 
Upvote 0
Hi mọi người!
Mình có file excel dùng để quản lí nhân viên. Mình có tạo textbox để lọc theo họ tên, chức vụ, vị trí ... thì lọc được. nhưng lọc theo ngày tháng vào làm việc thì không được. Mong bác nào rành xem mình code lọc trong cột joint date với.
 

File đính kèm

Upvote 0
Chào mọi người ạ.
Em đang làm 1 cái tool tự động tính toán kết quả sản phẩm của máy.
Em copy cái add in liệt kê số file để làm.nhưng khi chạy thì excel cứ bị trắng màn hình.
Bác nào check hộ em xem file này có gì không ổn ạ.
em có add 2 kiểu file em tính luôn ạ : 1 là kiểu cvs và 1 là kiểu file dat.
2 loại file này em làm 2 hàm tính toán khác nhau ạ.
Em xin cảm ơn.
 

File đính kèm

Upvote 0
Em có đoạn code gộp nhiều file sang 1 file mới chạy trên office 2007 không được. Folder "OK" chạy ổn nhưng folder "Khong duoc" chạy bị lỗi

Em muốn chèn nguồn của dữ liệu truy xuất, file Vidu (STT, dòng và sheet của các file 1,2,3 và 4,5,6 vào cột A trước các hàng gộp dữ liệu có được không). Ví dụ cột A dòng 2 thể hiện: C:\Documents and Settings\Admin\Desktop\OK\4.xls\Ngày1\row2


Sub MergeFilesExcel()
Dim path As String, ThisWB As String, lngFilecounter As Long
Dim wbDest As Workbook, shtDest As Worksheet, ws As Worksheet
Dim Filename As String, Wkb As Workbook
Dim CopyRng As Range, Dest As Range
Dim RowofCopySheet As Integer
RowofCopySheet = 2
ThisWB = ActiveWorkbook.Name
'Dien duong dan folder chua cac tap tin excel can gom lai.
'Nhu ban thay toi tien duong dan thu muc chua cai file excel cua toi.
path = "D:\Test\Khong duoc"
Application.EnableEvents = False
Application.ScreenUpdating = False
Set shtDest = ActiveWorkbook.Sheets(1)
Filename = Dir(path & "\*.xls", vbNormal)
If Len(Filename) = 0 Then Exit Sub
Do Until Filename = vbNullString
If Not Filename = ThisWB Then
Set Wkb = Workbooks.Open(Filename:=path & "\" & Filename)
Set CopyRng = Wkb.Sheets(1).Range(Cells(RowofCopySheet, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count))
Set Dest = shtDest.Range("A" & shtDest.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1)
CopyRng.Copy Dest
Wkb.Close False
End If
Filename = Dir()
Loop
Range("A1").Select
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox "Ket Thuc!"
End Sub
 

File đính kèm

Upvote 0
Thầy NDu ơi! thầy xem file này hộ em với ạ. code fix co dãn dòng của em báo debug ở Vùng range. Em cảm ơn nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom