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
Mở đầu là câu hỏi của bạn MinhKhai:
Mình có đoạn Code sau, không hiểu lỗi do đâu và cách khắc phục
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 3 And Target.Row > 11 And Target.Row < 17 Then
        If Target.Rows.Count = 1 Then
            If Target.Value <> "" Then
                Target.Offset(0, 1).Value = 1
                Target.Offset(0, 3).Value =  WorksheetFunction.VLookup(Target.Value,  Sheets("BangGia").Range("C2:E100"), 3, False)
                Target.Offset(0, 30).Value = Date
                Target.Offset(0, 31).Value = Now
            Else
                Target.Offset(0, 1).ClearContents
                Target.Offset(0, 3).ClearContents
                Target.Offset(0, 30).ClearContents
                Target.Offset(0, 31).ClearContents


            End If
        End If
    End If
 End Sub

Khi nhập dữ liệu từ C12 đến C16 (target) thì không sao, tuy nhiên khi xóa dữ liệu trong các ô này thì gặp lỗi Type Mismatch

Tôi cũng nghĩ chắc hẳn do ô target đang bị merge với nhiều ô khác dẫn đến việc offset bị sai. Nhưng sao khi
Target.Offset(0, 30).Value = Date
Target.Offset(0, 31).Value = Now
thì chạy tốt mà khi
Target.Offset(0, 30).ClearContents
Target.Offset(0, 31).ClearContents
thì lỗi ???

File kèm
https://dl.dropboxusercontent.com/s...arwIwX4RIr4-mIKjjGlAtkc2rDNZQwP9o1Hg9zbw&dl=1
 
Upvote 0
@ MinhKhai:
Đúng như bạn nhận định, vấn đề nằm ở chỗ các ô được merge lại với nhau. Bạn sửa lại như vầy là được:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    If Target.Column = 3 And Target.Row > 11 And Target.Row < 17 Then
        If Target.Rows.Count = 1 Then
            If Target[COLOR=#ff0000][B](1, 1)[/B][/COLOR].Value <> "" Then
                Target.Offset(, 1).Value = 1
                Target.Offset(, 3).Value = WorksheetFunction.VLookup(Target.Value, Sheets("BangGia").Range("C2:E100"), 3, False)
                Target.Offset(, 30).Value = Date
                Target.Offset(, 31).Value = Now
            Else
                Target.Offset(, 1)[COLOR=#ff0000][B] = ""[/B][/COLOR]
                Target.Offset(, 3)[COLOR=#ff0000][B] = ""[/B][/COLOR]
                Target.Offset(, 30).ClearContents
                Target.Offset(, 31).ClearContents
            End If
        End If
    End If
    [B][COLOR=#0000cd]Application.ScreenUpdating = True[/COLOR][/B]
 End Sub
Hoặc chỗ màu đỏ thứ 2 và 3 được sửa lại là:
Mã:
Target.Offset(, 1)[COLOR=#ff0000][B].Resize(, 2)[/B][/COLOR].ClearContents
Target.Offset(, 3)[COLOR=#ff0000][B].Resize(, 3)[/B][/COLOR].ClearContents
Còn vấn đề thứ hai thì tôi thấy bình thường, vì các ô Target.Offset(, 30) và Target.Offset(, 31) là các ô đơn (không merge) nên .ClearContents hay .Value = "" có tác dụng gần như nhau (thực tế không phải vậy nhưng ít ra thì nhìn vào là nó như vậy)
Chỗ màu xanh là tôi thêm vào, việc này là cần thiết nếu trước đó có câu lệnh Application.ScreenUpdating = False
 
Upvote 0
@ MinhKhai:
Đúng như bạn nhận định, vấn đề nằm ở chỗ các ô được merge lại với nhau. Bạn sửa lại như vầy là được:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    If Target.Column = 3 And Target.Row > 11 And Target.Row < 17 Then
        If Target.Rows.Count = 1 Then
            If Target[COLOR=#ff0000][B](1, 1)[/B][/COLOR].Value <> "" Then
                Target.Offset(, 1).Value = 1
                Target.Offset(, 3).Value = WorksheetFunction.VLookup(Target.Value, Sheets("BangGia").Range("C2:E100"), 3, False)
                Target.Offset(, 30).Value = Date
                Target.Offset(, 31).Value = Now
            Else
                Target.Offset(, 1)[COLOR=#ff0000][B] = ""[/B][/COLOR]
                Target.Offset(, 3)[COLOR=#ff0000][B] = ""[/B][/COLOR]
                Target.Offset(, 30).ClearContents
                Target.Offset(, 31).ClearContents
            End If
        End If
    End If
    [B][COLOR=#0000cd]Application.ScreenUpdating = True[/COLOR][/B]
 End Sub
Hoặc chỗ màu đỏ thứ 2 và 3 được sửa lại là:
Mã:
Target.Offset(, 1)[COLOR=#ff0000][B].Resize(, 2)[/B][/COLOR].ClearContents
Target.Offset(, 3)[COLOR=#ff0000][B].Resize(, 3)[/B][/COLOR].ClearContents
Còn vấn đề thứ hai thì tôi thấy bình thường, vì các ô Target.Offset(, 30) và Target.Offset(, 31) là các ô đơn (không merge) nên .ClearContents hay .Value = "" có tác dụng gần như nhau (thực tế không phải vậy nhưng ít ra thì nhìn vào là nó như vậy)
Chỗ màu xanh là tôi thêm vào, việc này là cần thiết nếu trước đó có câu lệnh Application.ScreenUpdating = False
Còn nếu là tôi thì tôi đề xuất sửa lại cách bố trí dữ liệu

Capture.JPG





















Tôi thấy chẳng có gì khó khăn cả. Xem chi tiết tại sheet mới tạo nhé
 

File đính kèm

Upvote 0
Chân thành các bác đã chia sẻ kinh nghiệm. Qua file này em thấy bỡ ngỡ nhiều vấn đề, và sẽ nhờ mọi người dần dần.

Còn nếu là tôi thì tôi đề xuất sửa lại cách bố trí dữ liệu
Tôi thấy chẳng có gì khó khăn cả. Xem chi tiết tại sheet mới tạo nhé
Cảm ơn bác ndu96081631 đã gợi ý về việc bố trí dữ liệu.
Thú thật với bác, em dùng Excel nhưng không có ưa mấy cái vụ Merge các cell lại với nhau, vì khi các ô được merge với nhau thì rất khó khăn khi xử lý dữ liệu (dù dùng VBA hay không).
Cái file gửi kèm của em ban đầu không bị merge ô nào cả, nhưng khi in thử, các thông tin thò thụt, thiếu diện tích hiển thị.... vì thế em cho thu hẹp các cột, tạo "lưới toạ độ" để dễ dàng phân bố dữ liệu.. hi hi. Em cũng nghĩ đến việc nhập dữ liệu tại 1 sheet, form in dữ liệu tại sheet khác cho "tiện cả đôi đường". Tuy nhiên như thế có vẻ rườm rà vì thực tế em còn 1 sheet NhatKy nữa. Em đã thiết kế 1 nút lệnh để ngoài việc PrintOut thì nó còn "tập hợp" các thông tin trên Hoá đơn này vào 1 dòng trên sheet NhatKy.

nghiaphuc đã viết:
Đúng như bạn nhận định, vấn đề nằm ở chỗ các ô được merge lại với nhau. Bạn sửa lại như vầy là được
Cám ơn bác đã chỉ dẫn.
Em cũng đã thử vọc bằng cách cho ô cần xoá bị ghi đè bằng ký tự trắng ("") hoặc giá trị 0. Tuy nhiên vẫn bị lỗi. Vấn đề là ở chỗ em không biết sửa chô này: If Target(1, 1).Value <> "" Then. Vậy bác làm ơn giải thích 1 chút cho em chỗ này và chỗ .Resize(, 2). (Em cũng đọc nhanh về rezise nhưng chưa hiểu hết)

Ngoài ra các bác cho em hỏi, đoạn code của em khi viết được bọc bởi
Mã:
 [\code] mà diện tích hiển thị nhỏ thế, không được rộng rãi hiển thị như của các bác
 
Upvote 0
Mình tìm trên internet được đoạn code sau, mục đích là tự động vào trang và điền username, nhưng khi run thì chỉ vào được trang mà không tự động điền username "ctyvanha" và bị báo lỗi "run time eror '438' object doesn't support this property or method", mình là gà mờ, mong được giải thích và sửa hộ. Cảm ơn nhiều.


Private Sub LoginGPS()
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True


ie.navigate "http://gps2.binhanh.com.vn/"


Do
DoEvents
Loop Until ie.readyState = 4


Set allHyperlink = ie.document.getelmentbytagname("a")
For Each hyper_link In allhyperlinks
If hyper_link.innerText = "sign in" Then
hyper_link.Click
Exit For
End If
Next


Do
DoEvents
Loop Until ie.readyState = 3


Do
DoEvents
Loop Until ie.readyState = 4




SendKeys "ctyvanha"
SendKeys "{tab}"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình tìm trên internet được đoạn code sau, mục đích là tự động vào trang và điền username, nhưng khi run thì chỉ vào được trang mà không tự động điền username "ctyvanha" và bị báo lỗi "run time eror '438' object doesn't support this property or method", mình là gà mờ, mong được giải thích và sửa hộ. Cảm ơn nhiều.


Private Sub LoginGPS()
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True


ie.navigate "http://gps2.binhanh.com.vn/"


Do
DoEvents
Loop Until ie.readyState = 4


Set allHyperlink = ie.document.getelmentbytagname("a")
For Each hyper_link In allhyperlinks
If hyper_link.innerText = "sign in" Then
hyper_link.Click
Exit For
End If
Next


Do
DoEvents
Loop Until ie.readyState = 3


Do
DoEvents
Loop Until ie.readyState = 4




SendKeys "ctyvanha"
SendKeys "{tab}"
End Sub

Mục đích duy nhất của bạn là: truy cập vào trang web --> điền user và password vào 2 ô --> nhấn nút "Đăng nhập"? Nếu thế thì thử code sau. Tôi không có mặt khẩu, vậy chỗ đỏ đỏ bạn viết mật khẩu vào

Mã:
Private Sub LoginGPS()
Dim ie As Object, doc As Object, txtPwd As Object, txtUsr As Object, btn As Object
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    
    ie.navigate "http://gps2.binhanh.com.vn/"
    
    Do
        DoEvents
    Loop Until ie.readyState = 4
    
    Set doc = ie.document
    
    Set txtUsr = doc.all.Item("UserLogin1_txtLoginUserName")
    Set txtPwd = doc.all.Item("UserLogin1_txtLoginPassword")
    Set btn = doc.all.Item("UserLogin1_btnLogin")
    
    txtUsr.Value = "ctyvanha"
    txtPwd.Value = "[B][COLOR=#ff0000]mat_khau[/COLOR][/B]"

    btn.Click
End Sub
 
Upvote 0
Cảm ơn bạn rất nhiều, nhưng nếu như mình chỉ muốn điền thông tin thôi chứ không muốn tự động nhấn nút đăng nhập thì bỏ đoạn code "btn.click" đúng không ạ
 
Upvote 0
Cảm ơn bạn rất nhiều, nhưng nếu như mình chỉ muốn điền thông tin thôi chứ không muốn tự động nhấn nút đăng nhập thì bỏ đoạn code "btn.click" đúng không ạ

Dĩ nhiên rồi. Thậm chí tôi cho btn.Click đứng riêng ra (có dòng trống ở trước) cho dễ nhìn, dễ phát hiện.
Mà bạn tự bỏ đi rồi thấy "mặt mũi" chúng ra sao chứ cần gì phải hỏi?

Mà lần sau trả lời ai thì bạn nên trích một đoạn như tôi đã làm. Luyện cho thành thói quen chứ về sau nhiều bài mà làm thế thì chả biết bạn muốn hỏi, góp ý, phê bình ai
 
Lần chỉnh sửa cuối:
Upvote 0
giải đáp công thức

anh nào giúp em giải thích dùm em code bên dưới nha



Function isOK(strName As String) As Boolean
isOK = True
Dim strComputerName As String
Dim strProcessorID As String
Dim objWMIService, colItems, objItem
Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", , 48)
For Each objItem In colItems
strProcessorID = objItem.ProcessorID
strComputerName = objItem.SystemName
Next
Dim anlName As String
Dim anlCPUID As String
Dim anlDate As String
Dim anlCode As String
Dim i%, j%
Dim strKey As String
i = 1: j = 0
Do While i <= Len(strName)
strKey = Mid(strName, i, 1)
If strKey = "ö" Then
j = j + 1
Select Case j
Case 1
anlName = Left(strName, i - 1)
Case 2
anlCPUID = Left(strName, i - 1)
Case 3
anlDate = Left(strName, i - 1)
strName = Right(strName, Len(strName) - i)
Exit Do
End Select
strName = Right(strName, Len(strName) - i)
i = 1
Else
i = i + 1
End If
Loop
anlCode = strName
If anlCode <> GenerateCode(strProcessorID, CDate(anlDate)) Then isOK = False
If anlCPUID <> strProcessorID Then isOK = False
If anlName <> strComputerName Then isOK = False
If Round(Now - CDate(anlDate)) + 1 > 120 Then isOK = False
If Round(Now - CDate(anlDate)) + 1 < 0 Then isOK = False
End Function



em chân thành cảm ơn
 
Upvote 0
Xin giúp đỡ về gỡ code VBA tự tạo T^T
Do học code chưa đến nơi đến chốn mà lại còn táy máy tự vọc code VBA, mình làm một đoạn code dùng chung với mục đích khi bấm Ctrl Shift T sẽ save as file excel sang pdf, nhưng bị lỗi, giờ cứ mở excel lên là đoạn code đó lại chạy ra mặc dù đã xóa code đi rồi. Excel tự mở file PERSONAL.XLSB
Đã thử Google tìm giải pháp, xóa C:\Documents and Settings\XXXXXXXXX\Application Data\Microsoft\Excel\XLSTART\, hide đủ kiểu vẫn không vô hiệu hóa được cái này.
 

File đính kèm

  • untitled.JPG
    untitled.JPG
    203 KB · Đọc: 448
Lần chỉnh sửa cuối:
Upvote 0
Dĩ nhiên rồi. Thậm chí tôi cho btn.Click đứng riêng ra (có dòng trống ở trước) cho dễ nhìn, dễ phát hiện.
Mà bạn tự bỏ đi rồi thấy "mặt mũi" chúng ra sao chứ cần gì phải hỏi?

Mà lần sau trả lời ai thì bạn nên trích một đoạn như tôi đã làm. Luyện cho thành thói quen chứ về sau nhiều bài mà làm thế thì chả biết bạn muốn hỏi, góp ý, phê bình ai
Vâng, lần sau sẽ rút kinh nghiệm, cho mình hỏi thêm chút nữa là nếu thay vì dùng ie thì mình dùng firefox hoặc chrome được không, nếu được thì code thay đổi như thế nào. Cảm ơn
 
Upvote 0
anh nào giúp em giải thích dùm em code bên dưới nha



Function isOK(strName As String) As Boolean
isOK = True
Dim strComputerName As String
Dim strProcessorID As String
Dim objWMIService, colItems, objItem
Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", , 48)
For Each objItem In colItems
strProcessorID = objItem.ProcessorID
strComputerName = objItem.SystemName
Next
Dim anlName As String
Dim anlCPUID As String
Dim anlDate As String
Dim anlCode As String
Dim i%, j%
Dim strKey As String
i = 1: j = 0
Do While i <= Len(strName)
strKey = Mid(strName, i, 1)
If strKey = "ö" Then
j = j + 1
Select Case j
Case 1
anlName = Left(strName, i - 1)
Case 2
anlCPUID = Left(strName, i - 1)
Case 3
anlDate = Left(strName, i - 1)
strName = Right(strName, Len(strName) - i)
Exit Do
End Select
strName = Right(strName, Len(strName) - i)
i = 1
Else
i = i + 1
End If
Loop
anlCode = strName
If anlCode <> GenerateCode(strProcessorID, CDate(anlDate)) Then isOK = False
If anlCPUID <> strProcessorID Then isOK = False
If anlName <> strComputerName Then isOK = False
If Round(Now - CDate(anlDate)) + 1 > 120 Then isOK = False
If Round(Now - CDate(anlDate)) + 1 < 0 Then isOK = False
End Function



em chân thành cảm ơn



Đây là code VBA hay VBScript?
Bạn tự giải thích trước những gì bạn hiểu và đưa lên đây. Chỗ nào không đúng thì bà con sẽ giúp.

Nếu bạn không hiểu gì cả thì cóp code về làm cái quái gì?
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng, lần sau sẽ rút kinh nghiệm, cho mình hỏi thêm chút nữa là nếu thay vì dùng ie thì mình dùng firefox hoặc chrome được không, nếu được thì code thay đổi như thế nào. Cảm ơn

Cái này thú thực là tôi không biết. Không tìm hiểu và không biết cách truy cập tới các object của firefox. Interface của IE thì tôi có thể tìm đọc vd. trên trang của Microsoft chứ của firefox thì không biết tìm ở đâu. Mà thực ra tôi cũng chưa tìm bao giờ vì tôi cũng chả quan tâm. Các interface của IE thì tôi đã biết từ rất lâu, từ khi lập trình trong Delphi.

Nói qua về code dùng IE. Ta phải "lấy" được interface (object) IHTMLDocument2 (3), tức ie.document. Rồi thì dùng các property và method của interface thôi.

Còn firefox có những interface nào và các thuộc tính, phương thức ra sao thì tôi chịu.
 
Upvote 0
Cái này thú thực là tôi không biết. Không tìm hiểu và không biết cách truy cập tới các object của firefox. Interface của IE thì tôi có thể tìm đọc vd. trên trang của Microsoft chứ của firefox thì không biết tìm ở đâu. Mà thực ra tôi cũng chưa tìm bao giờ vì tôi cũng chả quan tâm. Các interface của IE thì tôi đã biết từ rất lâu, từ khi lập trình trong Delphi.

Nói qua về code dùng IE. Ta phải "lấy" được interface (object) IHTMLDocument2 (3), tức ie.document. Rồi thì dùng các property và method của interface thôi.

Còn firefox có những interface nào và các thuộc tính, phương thức ra sao thì tôi chịu.
Nói chung dùng ie cũng được rồi, chạy rất ổn rồi, mình đã sử dụng được với các trang quản lý khác của công ty. Cảm ơn bạn nhiều
 
Upvote 0
Xin Chào ! Các Bác giải Thích Hộ Tôi Code Này Với.

PHP:
Sub CopyVung()
  With Sheets("DS_B")
    .Range("A4:I99").Clear
    Sheets("DS_A").Range("A4:I99" & Sheets("DS_A").Range("A99").End(xlUp).Row).Copy .Range("A4")
  End With
End Sub

ĐANG TẬP TÀNH VBA, CÁC BÁC HƯỚNG DẪN TÔI ĐOẠN CODE TRÊN VỚI
 

File đính kèm

Upvote 0
Nhờ sửa giúp đọan code

Đang làm thì gặp rắc rối chỗ này: (các bạn xem file)

Sheets("BANHANG-TRAHANG").Range(.Cells(j, B), .Cells(i, B)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

nhờ các bác giúp dùm. chỗ chữ to là nó báo lỗi
 

File đính kèm

Upvote 0
Đang làm thì gặp rắc rối chỗ này: (các bạn xem file)

Sheets("BANHANG-TRAHANG").Range(.Cells(j, B), .Cells(i, B)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

nhờ các bác giúp dùm. chỗ chữ to là nó báo lỗi

Đoạn code ấy có thể thay bằng:
Mã:
With Sheets("BANHANG-TRAHANG")
  .Range(.Cells(j, B), .Cells(i, B)).PasteSpecial Paste:=xlPasteValues
End With
Anh Bill sẽ không hiểu bạn nói cái màu đỏ ở trên là cái gì đâu nếu không có With trước đó
 
Upvote 0
Đoạn code ấy có thể thay bằng:
Mã:
With Sheets("BANHANG-TRAHANG")
  .Range(.Cells(j, B), .Cells(i, B)).PasteSpecial Paste:=xlPasteValues
End With
Anh Bill sẽ không hiểu bạn nói cái màu đỏ ở trên là cái gì đâu nếu không có With trước đó

Sư phụ xem giúp em lại cái code này:
Số hóa đơn nó không copy qua được
Mục đích của code là khi nhấn nút save thì tòan bộ dữ liệu bên sheet HD BAN HANG sẽ được copy qua và lưu laij ở sheet BAN HANG - TRA HANG
Riêng số hóa đơn thì có bao nhiêu mặt hàng thì copy số hóa đơn đó qua sheet BAN HANG - TRA HANG bấy nhiêu dòng
 
Lần chỉnh sửa cuối:
Upvote 0
With Sheets("BANHANG-TRAHANG")
.Range(.Cells(j, B), .Cells(i, B)).PasteSpecial Paste:=xlPasteValues
End With
Đã thay theo cách của sư phụ nhưng nó vẫn không copy số hóa đơn qua được
Nhờ các bạnchir giáo thêm.
 
Upvote 0
Upvote 0
Mình cũng đã thử như bạn đề nghị rồi, cũng không ra. không viết tại sao code thì không báo lỗi mà số hóa đơn thì không copy qua được . Bạn xem giúp mình đoạn code ở #17
Có xem lướt qua code của bạn, cũng không hiểu rõ ý của bạn muốn thế nào. Tuy nhiên có vài lơi góp ý
1. Nên Set tên sheet vào 1 biến cho thuận tiện khi viết code
2. Khi cần copy 1 ô sang 1 ô khác thì nên dùng cách gọn hơn. Ví dụ: Range("J3").Value = Range("I3").Value, không cần thao tác copy làm gì
3. Bạn dùng On Error ... thì phải hiểu rõ nó mới được

Thân
 
Upvote 0
Thanks bạn nhiều
Mục đích của code là:
Khi lâp hoá đơn xong, khi nhấn nút save thông tin trên hóa đơn sẽ được copy qua sheet BANHANG-TRAHANG để lưu lại,
Ví dụ: Mình đặt ra trường hợp là hóa đơn có 4 mặt hàng thì khi copy qua sheet BANHANG-TRAHANG sẽ được 4 dòng thông tin tương ứng và ở cột số hóa đơn thì 4 dòng đó tương ứng với 1 số hóa đơn
 
Upvote 0
Thanks bạn nhiều
Mục đích của code là:
Khi lâp hoá đơn xong, khi nhấn nút save thông tin trên hóa đơn sẽ được copy qua sheet BANHANG-TRAHANG để lưu lại,
Ví dụ: Mình đặt ra trường hợp là hóa đơn có 4 mặt hàng thì khi copy qua sheet BANHANG-TRAHANG sẽ được 4 dòng thông tin tương ứng và ở cột số hóa đơn thì 4 dòng đó tương ứng với 1 số hóa đơn

Đọc qua code của bạn, tôi cũng hiểu sơ sơ, chắc là thế này:

Mã:
Private Sub SAVE_Click()Dim i, j As Long
i = Sheets("BANHANG-TRAHANG").Range("B65000").End(xlUp)(2).Row
Application.ScreenUpdating = False
' Copy ?? gi? l?i s? hóa ??n khi in
Range("I3").Select
    Selection.Copy
Range("J3").Select
    Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' Copy ?? l?u qua sheet (Ban hang - Tra hang)
On Error Resume Next
If [C22].End(xlUp).Row > 11 Then
    Range("C12:J" & [C22].End(xlUp).Row).Copy: _
    Sheets("BANHANG-TRAHANG").Range("E65000").End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
    End If
Application.CutCopyMode = False
' Copy ?? gi? l?i s? hóa ??n qua sheet (Ban hang - Tra hang)
j = Sheets("BANHANG-TRAHANG").Range("E65000").End(xlUp)(1).Row
Range("I3").Select
    Selection.Copy
    Sheets("BANHANG-TRAHANG").Range(Sheets("BANHANG-TRAHANG").Cells(i, 2), Sheets("BANHANG-TRAHANG").Cells(j, 2)).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Code vẫn có thể sửa gọn nữa nhưng tôi chỉ tạm sửa đôi chút cho gọn thôi.
 
Upvote 0
Đọc qua code của bạn, tôi cũng hiểu sơ sơ, chắc là thế này:

Mã:
Private Sub SAVE_Click()Dim i, j As Long
i = Sheets("BANHANG-TRAHANG").Range("B65000").End(xlUp)(2).Row
Application.ScreenUpdating = False
' Copy ?? gi? l?i s? hóa ??n khi in
Range("I3").Select
    Selection.Copy
Range("J3").Select
    Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' Copy ?? l?u qua sheet (Ban hang - Tra hang)
On Error Resume Next
If [C22].End(xlUp).Row > 11 Then
    Range("C12:J" & [C22].End(xlUp).Row).Copy: _
    Sheets("BANHANG-TRAHANG").Range("E65000").End(xlUp)(2).PasteSpecial Paste:=xlPasteValues
    End If
Application.CutCopyMode = False
' Copy ?? gi? l?i s? hóa ??n qua sheet (Ban hang - Tra hang)
j = Sheets("BANHANG-TRAHANG").Range("E65000").End(xlUp)(1).Row
Range("I3").Select
    Selection.Copy
    Sheets("BANHANG-TRAHANG").Range(Sheets("BANHANG-TRAHANG").Cells(i, 2), Sheets("BANHANG-TRAHANG").Cells(j, 2)).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Code vẫn có thể sửa gọn nữa nhưng tôi chỉ tạm sửa đôi chút cho gọn thôi.

Thanks bạn nhìu, đúng cái mình cần rồi.
Mình cũng mới tập viết code thôi, nên còn nhiều cái phải học. code cũ của mình không chạy số hóa đơn là do đâu vậy bạn.
Có phải là cách để biến i và biến j ??????????
Dù sao cũng thanks bạn.
 
Upvote 0
Khuyến mãi bạn thêm code này
PHP:
Sub SAVE_Click()
Dim i, j, tam(), kq(1 To 100, 1 To 11), n
tam = [C12:J22].Value
For i = 1 To UBound(tam)
   If tam(i, 1) <> "" Then
      j = j + 1
      kq(j, 1) = [I3].Value
      kq(j, 2) = [B7].Value
      For n = 4 To 11
         kq(j, n) = tam(i, n - 3)
      Next
   End If
Next
Sheets("BANHANG-TRAHANG").[B65536].End(3).Offset(1).Resize(j, 11) = kq
End Sub
 
Upvote 0
Thanks bác ndu96081631 chỉ cho em topic này nha .

Mọi người giúp mình sửa lỗi này với nha.
Mình vào sheet Hóa Đơn rồi nhấn Nhập Mới thì nó lỗi hàng loạt, hiện hàng loạt các số 0 trên Sheet.

Ban đấu mình viết code cho sheet Hóa Đơn là

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, [H11:H29]) Is Nothing Then
Target.Offset(, 1).Value = Target.Offset(, -1).Value * Target.Value
[I30].Value = Evaluate("=sum(I11:I29)")
[I33].Value = [I30].Value - [I31].Value - [I32].Value
End If


If Not Intersect(Target, [I31:I32]) Is Nothing Then
[I30].Value = Evaluate("=sum(I11:I29)")
[I33].Value = [I30].Value - [I31].Value - [I32].Value
End If
End Sub

Khi viết code như trên thì ấn Nhập Mới không có lỗi , nhưng khi mình viết thêm đoạn code( màu xanh) thì lại phát sinh lỗi trên. Mọi người giúp mình với

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, [H11:H29]) Is Nothing Then
Target.Offset(, 1).Value = Target.Offset(, -1).Value * Target.Value
[I30].Value = Evaluate("=sum(I11:I29)")
[I33].Value = [I30].Value - [I31].Value - [I32].Value
End If
If Not Intersect(Target, [G11:G29]) Is Nothing Then
Target.Offset(, 2).Value = Target.Offset(, 1).Value * Target.Value
[I30].Value = Evaluate("=sum(I11:I29)")
[I33].Value = [I30].Value - [I31].Value - [I32].Value
End If
If Not Intersect(Target, [I31:I32]) Is Nothing Then
[I30].Value = Evaluate("=sum(I11:I29)")
[I33].Value = [I30].Value - [I31].Value - [I32].Value
End If
End Sub
 

File đính kèm

Upvote 0
Mình sưu tầm được đoạn code này để tạo một cái đồng hồ trong Cell:
Mã:
Private Check As Boolean
Private Sub CommandButton1_Click()
  Check = (CommandButton1.Caption = "Start")
  CommandButton1.Caption = Choose(1 - Check, "Start", "Stop")
  Do While Check
    Range("B12").Value = Format(Now, "hh:mm:ss")
    DoEvents
  Loop
End Sub

Hiện code trên viết chung cho một nút CommandButton.
Nhờ các bạn tách giúp mình làm 2 sub dạng này với:
Mã:
Sub StopTime()


End Sub
-----------------
Sub SartTime()


End Sub
 
Upvote 0
nhờ xem và chỉnh code giúp

chào các bạn.


một bạn tốt bụng đã viết cái file excel này giúp mình. Mình test file có một vài lỗi nhưng vì chẳng biết gì về code nên mình đưa lên đây nhờ các bạn chỉnh giúp mình nhé.

Xin cảm ơn !
 

File đính kèm

Upvote 0
Em có cái file với vài dòng code vụn vặt. Ấy thế mà bị lỗi mà không hiểu nguyên nhân gì.
Nhờ cả nhà chỉ giúp

View attachment 112830


Ngoài ra xem cho em cái Validation như em đã nói trong file

Xin cảm ơn

File gửi kèm: https://dl.dropboxusercontent.com/s...AEHE04k_nSJhJUTKh-jFJ7QG_GKezFF6lpALeS5_b61Fg

Code lỗi tại dòng: PX.Range("H5") = PX.Range("H5").Value + 1
Hiện tại trong file của bạn, cell H5 đang có giá trị =2. Vậy bạn tự gõ bằng tay số 3 vào cell H5 xem là hiểu liền
 
Upvote 0
Code lỗi tại dòng: PX.Range("H5") = PX.Range("H5").Value + 1
Hiện tại trong file của bạn, cell H5 đang có giá trị =2. Vậy bạn tự gõ bằng tay số 3 vào cell H5 xem là hiểu liền

Em đã thử nhiều lần như bác hướng dẫn nhưng thực sự em vẫn chưa hiểu.

Có phải bác nói là do sheet đã bị Protect không ?? TRong code nó đã được UnProtect rồi mà. Kể cả em loại bỏ chức năng Protect thì nó vẫn bị.

Bác giải thích chi tiết giúp em học hỏi nhé
 
Upvote 0
Em đã thử nhiều lần như bác hướng dẫn nhưng thực sự em vẫn chưa hiểu.

Có phải bác nói là do sheet đã bị Protect không ?? TRong code nó đã được UnProtect rồi mà. Kể cả em loại bỏ chức năng Protect thì nó vẫn bị.

Bác giải thích chi tiết giúp em học hỏi nhé
Bạn bỏ Protect ở sự kiện Worksheet_Change là xong.
 
Upvote 0
Em đã thử nhiều lần như bác hướng dẫn nhưng thực sự em vẫn chưa hiểu.

Có phải bác nói là do sheet đã bị Protect không ?? TRong code nó đã được UnProtect rồi mà. Kể cả em loại bỏ chức năng Protect thì nó vẫn bị.

Bác giải thích chi tiết giúp em học hỏi nhé

Mệt thật đó.

Đầu code thêm dòng này
Application.EnableEvents = False
......................
Cuối code thêm dòng này
Application.EnableEvents = True
 
Upvote 0
VBS rõ ràng,

VBA:
Dim a as string
VBS: Dim a

VBA:
For i = 1 to 10
'do something
next i
VBS:
For i = 1 to 10
'do something
next

VBA: range("A1") = "Testing"
VBS: ExcelObj.Workbooks(1).Worksheets(1).Range("A1") = "Testing"
 
Lần chỉnh sửa cuối:
Upvote 0
Khi sử dụng sự kiện Change thì phải luôn chú ý 2 dòng lệnh này, vì mỗi lần có sự thay đổi thì code sự kiện sẽ bị kích hoạt.
Lấy 1 ví dụ đơn giản
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
[A1]= Target / 2
End Sub
Ta nhập vào 1 ô với giá trị là 100 và A1 sẽ bị tác động như sau
Vòng thứ 1 : 50
Vòng thứ 2 : 25
Vòng thứ 3 : 12.5
Vòng thứ 4 : 6.25
Vòng thứ 5 : 3.125
Vòng thứ 6 : 1.5625
Vòng thứ 7 : 0.78125
Vòng thứ 8 : 0.390625
Vòng thứ 9 : 0.1953125
Vòng thứ 10 : 0.09765625
................
Vòng thứ n... và treo máy luôn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
các anh chị chỉ giúp em cách tạo 1 menu trong excel bằng treeview được không ạ.Em có tham khảo nhìu chỉ dẫn rồi mà vẫn chưa thể làm được.Mong các anh chị giúp đỡ nhiều ạ!!!!!!!!!!!!!!!
 
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
Các anh chị ơi, giúp em với ạ.
Em tìm đoạn code sau trên diễn dàn của mình để em có thể group/ungroup 1 protect sheet:
Private Sub Workbook_Open()
With Sheet1
.EnableOutlining = True
.Protect Password:="danh GPE", Contents:=True, UserInterfaceOnly:=True
End With
End Sub

Em viết và group đc protected sheet.
Nhưng có 1 vấn đề này sinh là trước khi viết code này vào em vẫn hide và unhide đc dữ liệu em đã khóa, sau khi viết code vào em group đc thì lại chức măng hide/unhide dữ liệu bị mất đi.
Các anh chị có thể cho viết lại cho em đoạn code khác được ko ạ.
Em chỉ muốn khóa dữ liệu 1 cột trong bảng và mình vẫn hide/unhide, group/ungroup được như bình thường ạ.
Em cám ơn anh chị nhiều ạ.
 
Upvote 0
Nhờ các anh swar giúp em đoạn code sau:

Sub chon()
On Error GoTo 0
Dim p, p1 As Variant
Dim x, x1 As Double
Dim chon As String


On Error GoTo thoat
chon1:
Do
p = ThisDrawing.Utility.GetPoint(, vbCrLf & "Chon 1: ")
x = p(0)
MsgBox x
Loop


On Error GoTo thoat
chon2:
Do
p1 = ThisDrawing.Utility.GetPoint(, vbCrLf & "Chon 2: ")
x1 = p1(0)
MsgBox x1
Loop


thoat:
chon = ThisDrawing.Utility.GetString(False, vbCrLf & " Chon lai ko? ")
If chon = "1" Then
GoTo chon1
ElseIf chon = "2" Then
GoTo chon2
Else
GoTo end_sub
End If
end_sub:
End Sub

Em cám ơn trước!
 
Upvote 0
Nhờ các anh chị giúp,

Sub Main()
Dim SrcRng As Range, Crit1 As Range, Crit2 As Range
With Sheets("Sheet1")
Set SrcRng = .Range(.[A6], .[A65536].End(xlUp)).Resize(, 50)
Set Crit1 = .Range("fi6:fi7")
End With
Sheets("Sheet2").Range("A:AX").Clear
SrcRng.AdvancedFilter 2, Crit1, Sheets("Sheet2").Range("A6")
Sheets("Sheet2").Select
End Sub

Em dùng đoạn code trên để tính ngày sinh nhật sau 1 tháng
vùng điều kiện Set Crit1 = .Range("fi6:fi7") em dùng công thức =IF(MONTH(TODAY())+1<=12,MONTH(TODAY())+1,1)=MONTH(G6)

Trong file số 1 thì vẫn tìm được các nhân viên với điều kiện trên, nhưng file số 2 thì không , link file bên dưới
http://www.mediafire.com/view/5878gnx4bclzcmp/a.xlsm
http://www.mediafire.com/view/l0ney16k53w0qwi/Copy of formNhanSu.xlsm
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các anh chị giúp,

Sub Main()
Dim SrcRng As Range, Crit1 As Range, Crit2 As Range
With Sheets("Sheet1")
Set SrcRng = .Range(.[A6], .[A65536].End(xlUp)).Resize(, 50)
Set Crit1 = .Range("fi6:fi7")
End With
Sheets("Sheet2").Range("A:AX").Clear
SrcRng.AdvancedFilter 2, Crit1, Sheets("Sheet2").Range("A6")
Sheets("Sheet2").Select
End Sub

Em dùng đoạn code trên để tính ngày sinh nhật sau 1 tháng
vùng điều kiện Set Crit1 = .Range("fi6:fi7") em dùng công thức =IF(MONTH(TODAY())+1<=12,MONTH(TODAY())+1,1)=MONTH(G6)

Trong file số 1 thì vẫn tìm được các nhân viên với điều kiện trên, nhưng file số 2 thì không , link file bên dưới
http://www.mediafire.com/view/5878gnx4bclzcmp/a.xlsm
http://www.mediafire.com/view/l0ney16k53w0qwi/Copy of formNhanSu.xlsm

Code này là liệt kê những người sau 1 tháng với tháng hiện tại (chứ không phải tính).
Code của bạn viết hơi sai 1 chút. Sửa thành vầy là đc.

Mã:
Sub Main()  
  Dim SrcRng As Range, Crit As Range
  Set SrcRng = Sheet1.Range(Sheet1.[A5], Sheet1.[A65536].End(xlUp)).Resize(, 50)
  Application.ScreenUpdating = False
  With Sheet2
    Set Crit = .[H1:H2]
    .[A6:AX500].Clear
    SrcRng.AdvancedFilter 2, Crit, [A5:AX5]
  End With
  Application.ScreenUpdating = True
End Sub

Bạn thảo khảo file đính kèm nhé.
 

File đính kèm

Upvote 0
Cảm ơn bạn mhung12005
Mục đích của mình trong sheet1 nhập toàn bộ dữ liệu nhân viên, có nút sinh nhật khi nhấn vào đó nó sẽ lọc các nhân viên đó sang sheet 2, tương tự như vậy ta làm nút hết hạn hợp đồng, trong file mình up bên trên file tên a.xlsm mình có làm được như thế nhưng cùng code đó mình làm file thứ 2 thì lại không được
 
Upvote 0
Nhờ các anh chị giúp
Em đã làm được phần sinh nhật rồi nhưng còn phần tìm thông tin nhân viên không hiểu sao lại không được
Em dùng đoạn code bên dưới
Sub Sinhnhat()
Dim SrcRng As Range, Crit1 As Range
With Sheets("Data")
Set SrcRng = .Range(.[A7], .[A65536].End(xlUp)).Resize(, 50)
Set Crit1 = .Range("B2:B3")
End With
Sheets("SinhNhat").Range("A7:AX500").Clear
SrcRng.AdvancedFilter 2, Crit1, Sheets("SinhNhat").Range("A7")
Sheets("SinhNhat").Select
End Sub
Sub NhanVien()
Dim SrcRng1 As Range, Crit2 As Range
With Sheets("Data")
Set SrcRng1 = .Range(.[A7], .[A65536].End(xlUp)).Resize(, 50)
Set Crit2 = .Range("C2:C3")
End With
Sheets("NhanVien").Range("A7:AX500").Clear
SrcRng1.AdvancedFilter 2, Crit2, Sheets("NhanVien").Range("A7")
Sheets("NhanVien").Select
End Sub


Link file đính kèm
http://www.mediafire.com/download/3cvmb958x4d8xds/formNhanSu.xlsm
 
Upvote 0
Thêm cột số thứ tự

Chào các bác, đề tài này tôi gửi lên diễn đàn đã lâu mà không có ai giúp, tôi cho rằng có thể tôi đã gửi sai địa chỉ nên hôm nay tôi gửi lại lên đây, tôi không cố ý 1 bài gửi nhiều lần, rất mong các bác giúp đỡ, nếu có gì không đúng rất mong được chỉ giáo. Trân trọng biết ơn
Nội dung nhờ giúp đỡ: khi thêm cột số thứ tự thì bị lỗi, tôi đã thử chỉnh nhiều cách nhưng chưa được.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
mình sưu tầm một đoạn code chọn thư mục như sau:
PHP:
Sub ChonDia_Click()
On Error GoTo err    
Application.FileDialog(msoFileDialogFolderPicker).Show    
Sheet1.txtPathe.Text = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems.Item(1)
err:    
Exit Sub
End Sub
giờ mình muốn sủa chọn được luôn một file cụ thể .doc, .pdf, ...
 
Upvote 0
Nhờ mọi người giải thích giúp tại sao trong VBa lại cộng được ký tự nhỉ
Trong excel sử dụng toán tử lối chuỗi &
Mã:
Private Function DocChu(so As String) As String
Dim i As Integer
Dim c As String * 1
Dim s As String
    s = ""
    For i = 1 To Len(so)
        c = Mid(so, i, 1)
        Select Case c
            Case "0": s = s + "kh" + ChrW(244) + "ng "
            Case "1": s = s + "m" + ChrW(7897) + "t "
            Case "2": s = s + "hai "
            Case "3": s = s + "ba "
            Case "4": s = s + "b" + ChrW(7889) + "n "
            Case "5": s = s + "n" + ChrW(259) + "m "
            Case "6": s = s + "s" + ChrW(225) + "u "
            Case "7": s = s + "b" + ChrW(7843) + "y "
            Case "8": s = s + "t" + ChrW(225) + "m "
            Case "9": s = s + "ch" + ChrW(237) + "n "
            Case ".", ",": s = s + "ph" + ChrW(7849) + "y "
        End Select
        MsgBox s
        DocChu = Trim(s)
    Next i
End Function
Mã:
Private Function DocRoi(so As String) As String
Dim i As Integer
Dim c As String * 1
Dim s As String
    s = ""
    For i = 1 To Len(so)
        c = Mid(so, i, 1)
        Select Case c
            Case "0": s = s & "kh" & ChrW(244) & "ng "
            Case "1": s = s & "m" & ChrW(7897) & "t "
            Case "2": s = s & "hai "
            Case "3": s = s & "ba "
            Case "4": s = s & "b" & ChrW(7889) & "n "
            Case "5": s = s & "n" & ChrW(259) & "m "
            Case "6": s = s & "s" & ChrW(225) & "u "
            Case "7": s = s & "b" & ChrW(7843) & "y "
            Case "8": s = s & "t" & ChrW(225) & "m "
            Case "9": s = s & "ch" & ChrW(237) & "n "
            Case ".", ",": s = s & "ph" & ChrW(7849) & "y "
        End Select
        MsgBox s
        DocRoi = Trim(s)
    Next i
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người giải thích giúp tại sao trong VBa lại cộng được ký tự nhỉ
Trong excel sử dụng toán tử lối chuỗi &
Mã:
Private Function DocChu(so As String) As String
Dim i As Integer
Dim c As String * 1
Dim s As String
    s = ""
    For i = 1 To Len(so)
        c = Mid(so, i, 1)
        Select Case c
            Case "0": s = s + "kh" + ChrW(244) + "ng "
            Case "1": s = s + "m" + ChrW(7897) + "t "
            Case "2": s = s + "hai "
            Case "3": s = s + "ba "
            Case "4": s = s + "b" + ChrW(7889) + "n "
            Case "5": s = s + "n" + ChrW(259) + "m "
            Case "6": s = s + "s" + ChrW(225) + "u "
            Case "7": s = s + "b" + ChrW(7843) + "y "
            Case "8": s = s + "t" + ChrW(225) + "m "
            Case "9": s = s + "ch" + ChrW(237) + "n "
            Case ".", ",": s = s + "ph" + ChrW(7849) + "y "
        End Select
        MsgBox s
        DocChu = Trim(s)
    Next i
End Function
[CODE]
Private Function DocRoi(so As String) As String
Dim i As Integer
Dim c As String * 1
Dim s As String
    s = ""
    For i = 1 To Len(so)
        c = Mid(so, i, 1)
        Select Case c
            Case "0": s = s & "kh" & ChrW(244) & "ng "
            Case "1": s = s & "m" & ChrW(7897) & "t "
            Case "2": s = s & "hai "
            Case "3": s = s & "ba "
            Case "4": s = s & "b" & ChrW(7889) & "n "
            Case "5": s = s & "n" & ChrW(259) & "m "
            Case "6": s = s & "s" & ChrW(225) & "u "
            Case "7": s = s & "b" & ChrW(7843) & "y "
            Case "8": s = s & "t" & ChrW(225) & "m "
            Case "9": s = s & "ch" & ChrW(237) & "n "
            Case ".", ",": s = s & "ph" & ChrW(7849) & "y "
        End Select
        MsgBox s
        DocRoi = Trim(s)
    Next i
End Function[/QUOTE]
Giải thích thì chịu, ông Bill cho ta làm được thế thì cứ làm. Bạn có quyền thay dấu + bằng &
 
Upvote 0
Giải thích thì chịu, ông Bill cho ta làm được thế thì cứ làm. Bạn có quyền thay dấu + bằng &

Em thấy lạ khác thường nên hỏi vậy
Theo em thì đúng là dùng dấu & sẽ tường minh dễ hiểu hơn dùng dấu + trong trường hợp này
vì từ trước tới giờ vẫn dùng & để lối chuỗi khi sử dụng công thức và hàm trên bảng tính
 
Upvote 0
Em thấy lạ khác thường nên hỏi vậy
Theo em thì đúng là dùng dấu & sẽ tường minh dễ hiểu hơn dùng dấu + trong trường hợp này
vì từ trước tới giờ vẫn dùng & để lối chuỗi khi sử dụng công thức và hàm trên bảng tính
Nếu dùng dấu + thì cần cẩn thận hơn.
Ví dụ:
....
k=k+1
Msgbox k+chrW(244)
... Chắc chắn sẽ báo lỗi ngay.
 
Upvote 0
Giúp tớ sửa đoạn code này với nhé!

Trong lần trước tớ nhờ a e trên GPE viết hộ tớ 1 đoạn code.
Nhưng giờ công việc tớ có chút thay đổi, thế nên việc tính toán phải thêm vào .
Tớ đưa ra công thức cũ trong file word, mã code cũ trong word
và phần cuối là sửa công thức tính S mới và ô so sánh mới.
Mong mọi người giúp đỡ tớ nhé!
 

File đính kèm

Upvote 0
Nhờ sửa lại code cho ngắn gọn hơn

mình đang sử dụng code sau để khi mình đang ở bất cứ sheet nào mà đóng file e xcel lại thì nó sẽ về sheet 6 còn các sheet khác ẩn hết. hiện vẩn sử dụng được nhưng nhìn vào thấy nó dài lê thê ..khó nhìn quá . nhờ các bạn rút ngắn lại dùm ...mình đang mày mò học lỏm code của GPE nên mới làm được vậy thôi đừng cười nha...
Mong Trợ Giúp
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Protect "123"
Sheet6.Select
Sheet1.Visible = 2
Sheet2.Visible = 2
Sheet3.Visible = 2
Sheet4.Visible = 2
Sheet5.Visible = 2
Sheet7.Visible = 2
Sheet8.Visible = 2
Sheet9.Visible = 2
Sheet10.Visible = 2
Sheet11.Visible = 2
Sheet12.Visible = 2
ThisWorkbook.Protect "123", Structure:=True
Me.Save
End Sub
 
Upvote 0
Giải đáp code giùm em

Subdien()
Dim x As Double
Dim y As Double
x = Val(InputBox("nhap x = "))
y = Val(InputBox("nhap y = "))
If x > y Then
For i = y + 1 To x - 1
Cells(i, 1) = i
Next i
End If
If x < y Then
For i = x + 1 To y - 1
Cells(i, 1) = i
Next i
End If
Application.Columns(1).Select
For Each cell In Selection
If cell.Value Mod 2 = 0 Andcell.Value<> "" Then
cell.Interior.Color = vbGreen
End If
Next cell
End Sub
Bây giờ em muốn nhập 1 số âm , 1 số dương bất kỳ hoặc 2 số âm thì sửa code như thế nào các bác cho em ý kiến.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
mình đang sử dụng code sau để khi mình đang ở bất cứ sheet nào mà đóng file e xcel lại thì nó sẽ về sheet 6 còn các sheet khác ẩn hết. hiện vẩn sử dụng được nhưng nhìn vào thấy nó dài lê thê ..khó nhìn quá . nhờ các bạn rút ngắn lại dùm ...mình đang mày mò học lỏm code của GPE nên mới làm được vậy thôi đừng cười nha...
Mong Trợ Giúp
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Protect "123"
Sheet6.Select
Sheet1.Visible = 2
Sheet2.Visible = 2
Sheet3.Visible = 2
Sheet4.Visible = 2
Sheet5.Visible = 2
Sheet7.Visible = 2
Sheet8.Visible = 2
Sheet9.Visible = 2
Sheet10.Visible = 2
Sheet11.Visible = 2
Sheet12.Visible = 2
ThisWorkbook.Protect "123", Structure:=True
Me.Save
End Sub
Code tạm vầy nha
PHP:
Sub yyy()
Dim Sh
ThisWorkbook.Unprotect "123"
For Each sh In Worksheets
   If sh.CodeName <> "Sheet6" Then
      sh.Visible = 2
   End If
Next
ThisWorkbook.Protect "123", Structure:=True
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Bạn tham khảo macro này thử coi:

PHP:
Option Explicit
Sub DienDaySo()
Dim X As Double, Y As Double, Tmp As Double, J As Long
Dim Cls As Range, Rng As Range
 Columns("A:A").Clear
 X = Abs(Val(InputBox("nhap x = ")))
 Y = Abs(Val(InputBox("nhap y = ")))
1 ' Hoán Doi X & Y Ne1u Càn:'
 If Y <= X Then
    X = Tmp:               X = Y
    Y = Tmp
 End If
 
 For J = X + 1 To Y
    Cells(J, 1) = J
 Next J
 Set Rng = Columns("A:A").SpecialCells(xlCellTypeConstants, 1)
 
 For Each Cls In Rng
    If Cls.Row Mod 2 = 1 Then
        Cls.Interior.Color = vbGreen
    End If
 Next Cls
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Option Explicit
Sub DienDaySo()
Dim X As Double, Y As Double, Tmp As Double, J As Long
Dim Cls As Range, Rng As Range
 Columns("A:A").Clear
 X = Abs(Val(InputBox("nhap x = ")))
 Y = Abs(Val(InputBox("nhap y = ")))
1 ' Hoán Doi X & Y Ne1u Càn:'
 If Y <= X Then
    X = Tmp:               X = Y
    Y = Tmp
 End If
 
 For J = X + 1 To Y
    Cells(J, 1) = J
 Next J
 Set Rng = Columns("A:A").SpecialCells(xlCellTypeConstants, 1)
 
 For Each Cls In Rng
    If Cls.Row Mod 2 = 1 Then
        Cls.Interior.Color = vbGreen
    End If
 Next Cls
End Sub
Nếu e nhập 1 số âm, 1 dương(-8,10) sao không ra kết quả đúng .Bài này em nhập 2 số bất kỳ và chỉ hiện những số ở giữa 2 số nhập vào
 
Upvote 0
Code e viết ở trên thì khi nhập 2 số dương bất kỳ .Vd:x=9,y=12 thì ở cột A nó sẽ hiện 10,11 và sẽ tô màu cho ô chẵn là ô chứa giá trị 10
 
Upvote 0
em vẫn chưa hiểu anh chỉ .em đặt vào sự kiện trước khi tắt file excel mà . nếu như anh chỉ thì em phải thêm một modules nữa sao . mong anh chỉ dùm
 
Upvote 0
Nhập 2 số nguyên bất kỳ bằng inputbox.Điền vào cột A giá trị nằm giữa 2 số đó.
code trên e làm thì khi nhập 2 số dương thì đúng, 1 dương 1 âm hoặc 2 âm thì sai.Bác sửa code giúp e
 
Upvote 0
Code tạm vầy nha
PHP:
Sub yyy()
Dim Sh
ThisWorkbook.Unprotect "123"
For Each sh In Worksheets
   If sh.CodeName <> "Sheet6" Then
      sh.Visible = 2
   End If
Next
ThisWorkbook.Protect "123", Structure:=True
Application.DisplayAlerts = True
End Sub
OK Em Làm Được rồi cảm ơn anh rất nhiều ...nhiều lần anh giúp em...
em ở ngã tư cây xăng số 4 thuận an - bình dương ...
ok anh
 
Upvote 0
OK Em Làm Được rồi cảm ơn anh rất nhiều ...nhiều lần anh giúp em...
em ở ngã tư cây xăng số 4 thuận an - bình dương ...
ok anh
Ở sát nách nhau mà không alo uống cafe. Mình ở trạm thu phí gần cầu Phú Long
Liên lạc sdt này nha 0908 247 563
 
Lần chỉnh sửa cuối:
Upvote 0
dạ em sẽ mời anh hôn nào qua cafe vista được không anh . Em mạnh 0929.555.666
nếu thích số Vietnamobiel em sẽ tặng anh một số
code em làm lại như sau ok"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
Dim Sh
ThisWorkbook.Unprotect "172100"
For Each Sh In Worksheets
If Sh.CodeName <> "Sheet6" Then
Sh.Visible = 2
End If
Next
ThisWorkbook.Protect "172100", Structure:=True
Application.DisplayAlerts = True
Me.Save
End Sub
 
Upvote 0
Nhập 2 số nguyên bất kỳ bằng inputbox.Điền vào cột A giá trị nằm giữa 2 số đó.
code trên e làm thì khi nhập 2 số dương thì đúng, 1 dương 1 âm hoặc 2 âm thì sai.Bác sửa code giúp e
Thử vầy coi sao. May rủi nhá. Mình thì kiểu nào cũng xơi được, nhưng hay trật lất.
PHP:
Sub dien()
Dim x As Double
Dim y As Double
Dim tam(), Cell, a, b
x = Val(InputBox("nhap x = "))
y = Val(InputBox("nhap y = "))
a = IIf(x > y, x, y)
b = IIf(x > y, y, x)
ReDim tam(1 To Abs(a - b) - 1, 1 To 1)
For i = 1 To UBound(tam)
   tam(i, 1) = b + i
Next
With [A1].Resize(UBound(tam))
   .Clear
   .Value = tam
   .Select
End With
For Each Cell In Selection
   If Cell.Value Mod 2 = 0 Then
      Cell.Interior.Color = vbGreen
   End If
Next Cell
End Sub
 
Upvote 0
dạ em sẽ mời anh hôn nào qua cafe vista được không anh . Em mạnh 0929.555.666
nếu thích số Vietnamobiel em sẽ tặng anh một số
code em làm lại như sau ok"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
Dim Sh
ThisWorkbook.Unprotect "172100"
For Each Sh In Worksheets
If Sh.CodeName <> "Sheet6" Then
Sh.Visible = 2
End If
Next
ThisWorkbook.Protect "172100", Structure:=True
Application.DisplayAlerts = True
Me.Save
End Sub

Theo mình thì nên Sheet6.Visible=True trước khi chayj vòng lặp cho chắc ăn vì biết đâu sheet này đang ở chế độ ẩn thì lỗi code
 
Upvote 0
Em gà mờ về Code Macro không biết Code này lỗi ở đâu ạ

Em mới tập tành với lập trình VBA trong Excel nên cũng muốn phát triển các Code trên diễn đàn vào công việc của minh. Nên không biết Code này của em lỗi ở đâu mà không chạy được mong được mọi người giải thích giúp và sửa giúp ạ
- Em có một bảng tính bên Sheet2 là vùng chứa dữ liệu nhập vào tự động, ở cột thứ tự là duy nhất nhưng chẳng may khi dữ liệu nhập vào lại trùng nhau nên em muốn xóa đi một Row bị trùng đó.
- Ở Sheet1 em tạo một nút bấm và một Ô màu vàng để nhập số thứ tự hàng tương ứng vớ số thứ tự tại cột STT bên Sheet2 mà mình muốn xóa
Khi thực hiện lệnh thì nó không chạy. Hàm em viết như thế này ạ:
Mã:
Sub Xoa_Row()
Dim dong, gia_tri
gia_tri = Range("B2").Value
dong = 2
Application.ScreenUpdating = False

Do While Len(Trim(Sheets("Sheet2").Cells(dong, 1).Value)) > 0
    If Sheets("Sheet2").Cells(dong, 1).Value = gia_tri Then
    Rows(dong).Delete
    Else
    dong = dong + 1
    End If
Loop
Application.ScreenUpdating = True
    
End Sub
Mong được mọi người giúp đỡ ạ
Thanks!
http://www.fshare.vn/file/5NE6VZ2JIE/ "Em không tải được file lên mong mọi người thông cảm
 
Lần chỉnh sửa cuối:
Upvote 0
Em mới tập tành với lập trình VBA trong Excel nên cũng muốn phát triển các Code trên diễn đàn vào công việc của minh. Nên không biết Code này của em lỗi ở đâu mà không chạy được mong được mọi người giải thích giúp và sửa giúp ạ
- Em có một bảng tính bên Sheet2 là vùng chứa dữ liệu nhập vào tự động, ở cột thứ tự là duy nhất nhưng chẳng may khi dữ liệu nhập vào lại trùng nhau nên em muốn xóa đi một Row bị trùng đó.
- Ở Sheet1 em tạo một nút bấm và một Ô màu vàng để nhập số thứ tự hàng tương ứng vớ số thứ tự tại cột STT bên Sheet2 mà mình muốn xóa
Khi thực hiện lệnh thì nó không chạy. Hàm em viết như thế này ạ:
Mã:
Sub Xoa_Row()
Dim dong, gia_tri
gia_tri = Range("B2").Value
dong = 2
Application.ScreenUpdating = False

Do While Len(Trim(Sheets("Sheet2").Cells(dong, 1).Value)) > 0
    If Sheets("Sheet2").Cells(dong, 1).Value = gia_tri Then
    Rows(dong).Delete
    Else
    dong = dong + 1
    End If
Loop
Application.ScreenUpdating = True
    
End Sub
Mong được mọi người giúp đỡ ạ
Thanks!
http://www.fshare.vn/file/5NE6VZ2JIE/ "Em không tải được file lên mong mọi người thông cảm

Đọc code của bạn mình chẳng hiểu bạn muốn gì nữa. Thà bạn đưa ra yêu cầu để viết lại từ đầu còn dễ hơn.
 
Upvote 0
Em mới tập tành với lập trình VBA trong Excel nên cũng muốn phát triển các Code trên diễn đàn vào công việc của minh. Nên không biết Code này của em lỗi ở đâu mà không chạy được mong được mọi người giải thích giúp và sửa giúp ạ

cái lệnh này
Mã:
Rows(dong).delete
nó không delete dòng số 7 của sheet 2 mà là dòng số 7 của sheet1
 
Upvote 0
Vâng em cảm ơn anh yêu cầu của em là như thế này ạ em có 2 Sheet (Sheét và Sheet2)
- Sheet 2 là chứa bảng dữ liệu Gồm các cột (STT | CQL | D | H | N | M ...) và cột STT nhập từ 1 đến n tuy nhiên trong khi nhập nó lại có số trùng nhau nên em muốn xóa hàng mà nhập vào có số thứ tự trùng nhau đó.
- Sheet1 em tạo một nút bâm "Button" và nhập số vào Ô B2 tương ứng với số bên cột số thứ tự sau đo em viết hàm để tích hợp vào Button và khi em nhập số VD số 8 vào Ô B2 và nhấn vào Button thì tất cả dữ liệu tại hàng có số thứ tự là 8 bị Xóa
Đó là vấn đền em cần ạ mong được anh giúp đỡ ạ!
Thanks
 
Upvote 0
cái lệnh này
Mã:
Rows(dong).delete
nó không delete dòng số 7 của sheet 2 mà là dòng số 7 của sheet1
Vâng Code của em bị lỗi không biết là lỗi tại đâu mọi người chỉ giúp sửa code như thế nào để có thể làm được điều em đang cần ạ
Thanks
 
Upvote 0
Đọc code của bạn mình chẳng hiểu bạn muốn gì nữa. Thà bạn đưa ra yêu cầu để viết lại từ đầu còn dễ hơn.
Vâng em cảm ơn anh yêu cầu của em là như thế này ạ em có 2 Sheet (Sheét và Sheet2)
- Sheet 2 là chứa bảng dữ liệu Gồm các cột (STT | CQL | D | H | N | M ...) và cột STT nhập từ 1 đến n tuy nhiên trong khi nhập nó lại có số trùng nhau nên em muốn xóa hàng mà nhập vào có số thứ tự trùng nhau đó.
- Sheet1 em tạo một nút bâm "Button" và nhập số vào Ô B2 tương ứng với số bên cột số thứ tự sau đo em viết hàm để tích hợp vào Button và khi em nhập số VD số 8 vào Ô B2 và nhấn vào Button thì tất cả dữ liệu tại hàng có số thứ tự là 8 bị Xóa
Đó là vấn đền em cần ạ mong được anh giúp đỡ ạ!
Thanks
 
Upvote 0
Code của bạn:
PHP:
Sub Xoa_Row()
Dim dong, gia_tri
gia_tri = Range("B2").Value
dong = 2
Application.ScreenUpdating = False

Do While Len(Trim(Sheets("Sheet2").Cells(dong, 1).Value)) > 0
    If Sheets("Sheet2").Cells(dong, 1).Value = gia_tri Then
1         Rows(dong).Delete
    Else
         dong = dong + 1
    End If
Loop
Application.ScreenUpdating = True    
End Sub

Thứ nhứt: Lúc khởi chạy, macro chưa biết bạn đang ở trang/Sheet nào?
Nếu bạn chỉ có 1 trang tính thì mọi chuyện sẽ bình thường, còn không sẽ lộn tùng fèo là cái chắc!
Câu lệnh có số 1 chắc là chưa ổn! Bạn tham khảo xem câu lệnh này:

Sheets("Sheet2").Cells(dong, 1).EntireRow,delete

có khả dĩ hơn?!
 
Upvote 0
Vâng khi em khởi chạy chương trình là Sheet1 như em nói ở trên là click chuột vào Button
Code của bạn:
PHP:
Sub Xoa_Row()
Dim dong, gia_tri
gia_tri = Range("B2").Value
dong = 2
Application.ScreenUpdating = False

Do While Len(Trim(Sheets("Sheet2").Cells(dong, 1).Value)) > 0
    If Sheets("Sheet2").Cells(dong, 1).Value = gia_tri Then
1         Rows(dong).Delete
    Else
         dong = dong + 1
    End If
Loop
Application.ScreenUpdating = True    
End Sub

Thứ nhứt: Lúc khởi chạy, macro chưa biết bạn đang ở trang/Sheet nào?
Nếu bạn chỉ có 1 trang tính thì mọi chuyện sẽ bình thường, còn không sẽ lộn tùng fèo là cái chắc!
Câu lệnh có số 1 chắc là chưa ổn! Bạn tham khảo xem câu lệnh này:

Sheets("Sheet2").Cells(dong, 1).EntireRow,delete

có khả dĩ hơn?!
 
Upvote 0
Em cảm ơn HYen17 rất nhiều em sửa theo góp ý đã chạy được tuy nhiên vấn đền em muốn hỏi thêm chút nữa là
- Khi ở Cột STT ở Sheet2 có hai số trùng nhau khi ở Sheet1 em nhập số hàng muốn xóa khi chạy Button thì nó xóa cả hai hàng luôn vậy có cách nào chỉ cho nó xóa 1 hàng và để lại một hàng không ạ
Em cảm ơn nhiều!
Code của bạn:
PHP:
Sub Xoa_Row()
Dim dong, gia_tri
gia_tri = Range("B2").Value
dong = 2
Application.ScreenUpdating = False

Do While Len(Trim(Sheets("Sheet2").Cells(dong, 1).Value)) > 0
    If Sheets("Sheet2").Cells(dong, 1).Value = gia_tri Then
1         Rows(dong).Delete
    Else
         dong = dong + 1
    End If
Loop
Application.ScreenUpdating = True    
End Sub

Thứ nhứt: Lúc khởi chạy, macro chưa biết bạn đang ở trang/Sheet nào?
Nếu bạn chỉ có 1 trang tính thì mọi chuyện sẽ bình thường, còn không sẽ lộn tùng fèo là cái chắc!
Câu lệnh có số 1 chắc là chưa ổn! Bạn tham khảo xem câu lệnh này:

Sheets("Sheet2").Cells(dong, 1).EntireRow,delete

có khả dĩ hơn?!
 
Upvote 0
Điều kiện gì quái dị vậy?
1 dòng thì xoá luôn
2 dòng thì xoá 1 chừa 1
3 dòng thì xoá ??? chừa ???
 
Upvote 0
tại vì code bạn ở sheet1. bạn kêu nó là việc ở sheet 2, thì bạn phải chỉ địa chỉ cho nó biết
Mã:
Sub Xoa_Row()
Dim dong, gia_tri
gia_tri = Range("B2").Value
dong = 2
Application.ScreenUpdating = False
[COLOR=#ff0000]With Sheet2[/COLOR]
Do While Len(Trim(.Cells(dong, 1).Value)) > 0
    If .Cells(dong, 1).Value = gia_tri Then
    .Rows(dong).Delete
    Else
    dong = dong + 1
    End If
Loop
[COLOR=#ff0000]End With[/COLOR]
Application.ScreenUpdating = True
    
End Sub
ah, tôi ko đọc kỹ, bạn đã giải quyết được vấn đề này rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Điều kiện gì quái dị vậy?
1 dòng thì xoá luôn
2 dòng thì xoá 1 chừa 1
3 dòng thì xoá ??? chừa ???
Vâng em cảm ơn mọi người vì hiện tại em mới chỉ nghiên cứu được có thế nếu mà như VetMini nói ở trên mà làm được như vậy thì hay quá nếu mà có > 2 Row thì xóa chỉ để lại 1 Row thôi ạ
Thanks
 
Upvote 0
Vâng em cảm ơn mọi người vì hiện tại em mới chỉ nghiên cứu được có thế nếu mà như VetMini nói ở trên mà làm được như vậy thì hay quá nếu mà có > 2 Row thì xóa chỉ để lại 1 Row thôi ạ
Thanks

Nếu chỉ có một gia_tri để xoá:

Lập một biến integer xoa = 0
Khi gặp dòng cần xoá thì xét xoa, nếu xoa = 0 thì xoá được và đổi xoa = 1
Nếu xoa = 1 thì chừa lại không xoá và đổi xoa = 2
Nếu xoá > 1 thì xoá


Nếu có nhiều gia_tri để xoá:

Làm một cái dictionary
Trước khi xoá dòng thì xét xem có khoá trong dic này hay không.
Nếu chưa có thì ghi số 0 rồi xoá
Nếu có rồi thì xét sôs
Nếu 0 thì tức là đã xoá 1 lần rồi, bây giờ nên tăng số lên 1 và chừa lại không xoá
Nếu lớn hơn 0 thì đã chừa 1 lần rồi, bây giờ cứ thẳng thừng xoá


Đại khái nguyên tắc là dùng một cái gì đó để ghi lại là đã từng xoá chưa. Nếu đã xoá 1 lần rồi thì không xoá và ghi lại đã đã chừa 1 lần. Nếu đã chừa 1 lần rồi thì không chừa nữa, thẳng tay xoá.


Cần lưu ý: yêu cầu của bài này là một yêu cầu hết sức nguy hiểm.
Chạy một lượt, các các dòng có số ứng với số đang tham chiếu bị xoá. Nếu có hơn 1 dòng thì còn chừa lại 1
Như vậy nếu lỡ tay chạy 2 lần thì mất hết chả chừa gì cả. !!!!!!!!!!!!!!
 
Lần chỉnh sửa cuối:
Upvote 0
- Sheet 2 là chứa bảng dữ liệu Gồm các cột (STT | CQL | D | H | N | M ...) và cột STT nhập từ 1 đến n tuy nhiên trong khi nhập nó lại có số trùng nhau nên em muốn xóa hàng mà nhập vào có số thứ tự trùng nhau đó.

Nếu mà có > 2 Row thì xóa chỉ để lại 1 Row thôi ạ

Bạn có thể làm bằng tay trước, sau đó ghi thành macro mà xài:

Xếp trật tự cột [STT]

Tiến hành duyệt từ dòng cuối chứa dữ liệu lên dòng 2 (Dòng 1 chứa tiêu đề trường:=[STT])

nếu ô đang duyệt trùng trị với ô trên nó thì xóa dòng đó đi.

(Nếu bạn không tự làm được thì gởi dữ liệu giả lập lên đi; Sẽ có ngay kết quả mĩ mãn!)
 
Upvote 0
Các bạn sửa giúp mình đoạn code này với:
trước code được viết với công thức chạy :
S2= Căn bậc 2(( a 2 - a 1 )^2 + (b 2 - b 1 )^2)
S3= Căn bậc 2(( a 3 - a 1 )^2 + (b 3 - b 1 )^2)
S4= Căn bậc 2(( a 4 - a 1 )^2 + (b 4 - b 1 )^2)

Các bạn sửa giúp tớ thành công thức :
S2= Căn bậc 2(( a 2 - a 1 )^2 + (b 2 - b 1 )^2 + (C 2 - C1)^2)
S3= Căn bậc 2(( a 3 - a 1 )^2 + (b 3 - b 1 )^2 + (C 3 - C1)^2)
S4= Căn bậc 2(( a 4 - a 1 )^2 + (b 4 - b 1 )^2 + (C 4 - C1)^2)


Còn các cách chạy, lặp xóa ... vẫn giữ nguyên như code cũ nhé.

Sub DoSomething()
Dim Arr, tmp, index, result, count As Long, k As Long, e As Double, r As Long, c As Long, s As Double, startCell As Range
Arr = Range("$A$13:$E$25012").Value
e = [B1]
Set startCell = Range("G13")

ReDim index(1 To 1)
ReDim result(1 To UBound(Arr, 2), 1 To 1)

k = 0
Do
k = k + 1
ReDim Preserve result(1 To UBound(Arr, 2), 1 To k)
For r = 1 To UBound(Arr, 2)
result(r, k) = Arr(1, r)
Next r
count = 0
For r = 2 To UBound(Arr)
s = Sqr((Arr(1, 2) - Arr(r, 2)) ^ 2 + (Arr(1, 3) - Arr(r, 3)) ^ 2)
If s >= e Then
count = count + 1
ReDim Preserve index(1 To count)
index(count) = r
End If
Next r
If count > 0 Then
ReDim tmp(1 To count, 1 To UBound(Arr, 2))
For r = 1 To count
For c = 1 To UBound(Arr, 2)
tmp(r, c) = Arr(index(r), c)
Next c
Next r
Arr = tmp
End If
Loop Until count = 0

ReDim Arr(1 To k, 1 To UBound(result))
For r = 1 To k
For c = 1 To UBound(Arr, 2)
Arr(r, c) = result(c, r)
Next c
Next r

startCell.Resize(k, UBound(Arr, 2)).Value = Arr
End Sub
 
Upvote 0
Tôi có một đoạn code sau:
Private Sub cmdThem_Click()Dim RowCount As Long
Dim ctl As Control
Range("BB2:BH2").ClearContents
'Write data to worksheet
RowCount = Worksheets("THULY").Range("BB1").CurrentRegion.Rows.Count
With Worksheets("THULY").Range("BB1")
.Offset(RowCount, 0).Value = Me.cbxNguoinhanBC.Value
.Offset(RowCount, 1).Value = Me.txtNguoilapBC.Value
.Offset(RowCount, 2).Value = Me.txtNguoiduyetBC.Value
.Offset(RowCount, 3).Value = Me.cbxChucdanhduyetBC.Value
.Offset(RowCount, 4).Value = Me.txtNgaylapBC.Value
.Offset(RowCount, 5).Value = Me.txtSothangBC.Value
.Offset(RowCount, 6).Value = Me.txtThoigianBC.Value
End With
Unload Me
End Sub
Nhờ GPE hướng dẫn cách giúp để đoạn code trên (phần chữ màu đỏ) không Clear tất cả thông tin ở Range BB2:BH2
Mà yêu cầu là nó chỉ Replace cho những thông tin nào có thay đổi ở Range BB2:BH2
Cảm ơn mọi người ah!
 
Upvote 0
Chào các Thầy và các anh chị trên diễn đàn, tôi có sưu tầm được trên diễn đàn 1 file ghi dữ liệu từ file đích sang file lưu trữ, file này chạy rất êm, nhưng khi tôi copy đoạn code trong module và chuyển sang 1 file khác để chạy thì bị lỗi, báo lỗi ở đoạn code này (With New Scripting.FileSystemObject). Rất mong các Thầy và các anh chị trên diễn đàn giúp đỡ chỉ cho tôi nguyên nhân tại sao khi chuyển sang file khác thì bị lỗi. Trân trọng cám ơn
 

File đính kèm

Upvote 0
Chào các Thầy và các anh chị trên diễn đàn, tôi có sưu tầm được trên diễn đàn 1 file ghi dữ liệu từ file đích sang file lưu trữ, file này chạy rất êm, nhưng khi tôi copy đoạn code trong module và chuyển sang 1 file khác để chạy thì bị lỗi, báo lỗi ở đoạn code này (With New Scripting.FileSystemObject). Rất mong các Thầy và các anh chị trên diễn đàn giúp đỡ chỉ cho tôi nguyên nhân tại sao khi chuyển sang file khác thì bị lỗi. Trân trọng cám ơn
Chưa xem file của bạn nhưng qua mô tả tôi đoán như sau: phần bị lỗi do chưa có tham chiếu tới thư viện Scripting runtime. Vậy để sửa bạn làm như sau:
Vào cửa sổ VBE => Chọn Tool => Reference..=> Tìm đến dòng Microsoft Scripting runtime => tick vào đó và ok. Sau đó bạn chạy Code.
 
Upvote 0
Chào bác dhn46 đúng như bác phán đoán, tôi làm theo bác hướng dẫn và đã chạy được. Cám ơn bác rất nhiều!
 
Upvote 0
Chào các Thầy và các anh chị trên diễn đàn! Nhờ các Thầy và các anh chị rút gọn rút tôi đoạn code sau. Kiến thức VBA của tôi còn rất hạn chế, nên rất mong được sự hướng dẫn chi tiết. Trân trọng cám ơn
Mã:
Private Sub Label2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleTransparent Then
        Label2.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label3.BackStyle = fmBackStyleTransparent Then
        Label3.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label4_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label4.BackStyle = fmBackStyleTransparent Then
        Label4.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdIn_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdIn.BackStyle = fmBackStyleTransparent Then
        cmdIn.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdInSQ_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdInSQ.BackStyle = fmBackStyleTransparent Then
        cmdInSQ.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdThoat_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdThoat.BackStyle = fmBackStyleTransparent Then
        cmdThoat.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleOpaque Then
       Label2.BackStyle = fmBackStyleTransparent
    
    ElseIf Label3.BackStyle = fmBackStyleOpaque Then
       Label3.BackStyle = fmBackStyleTransparent
   
    ElseIf Label4.BackStyle = fmBackStyleOpaque Then
       Label4.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdIn.BackStyle = fmBackStyleOpaque Then
       cmdIn.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdInSQ.BackStyle = fmBackStyleOpaque Then
       cmdInSQ.BackStyle = fmBackStyleTransparent
       
       Else
  cmdThoat.BackStyle = fmBackStyleOpaque
       cmdThoat.BackStyle = fmBackStyleTransparent
    End If
End Sub
 
Upvote 0
chào anh chị,
tôi có một đoạn code nhỏ sau đây để lấy địa chỉ trong sự kiện select change
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Offset(, 2).Activate
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub

khi tôi đang ở cell A1, khi kết thúc nhập liệu băng phím enter
nó báo như sau: $C$1 rồi $A$2
như vậy cái địa chỉ cuối cùng mà nó hiểu là A2, nhưng thực tế thì cell C1 đang được chọn

anh chị cho hỏi vì sao như vậy và làm cách khắc phục

cám ơn mọi người
chúc một ngày vui vẻ
 
Upvote 0
anh chị cho hỏi vì sao như vậy và làm cách khắc phục

- Vì sao như vậy: Vì bạn bắt nó làm như vậy, nó miễn cưỡng làm theo bạn nhưng không quên lời ông chủ của nó (ông Bin), Enter mặc định là xuống dòng.
- Cách khắc phục: Không hiểu bạn muốn gì, sao khắc được?
 
Upvote 0
chào anh chị,
tôi có một đoạn code nhỏ sau đây để lấy địa chỉ trong sự kiện select change
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Offset(, 2).Activate
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub

khi tôi đang ở cell A1, khi kết thúc nhập liệu băng phím enter
nó báo như sau: $C$1 rồi $A$2
như vậy cái địa chỉ cuối cùng mà nó hiểu là A2, nhưng thực tế thì cell C1 đang được chọn

anh chị cho hỏi vì sao như vậy và làm cách khắc phục

cám ơn mọi người
chúc một ngày vui vẻ

Sao không làm chung 1 sự kiện mà phải tách ra 2 sự kiện chi vậy bạn?

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Target.Offset(, 2).Activate
    MsgBox ActiveCell.Address
    Application.EnableEvents = True
End Sub
 
Upvote 0
Chào các Thầy và các anh chị trên diễn đàn! Nhờ các Thầy và các anh chị rút gọn rút tôi đoạn code sau. Kiến thức VBA của tôi còn rất hạn chế, nên rất mong được sự hướng dẫn chi tiết. Trân trọng cám ơn
Mã:
Private Sub Label2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleTransparent Then
        Label2.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label3.BackStyle = fmBackStyleTransparent Then
        Label3.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub Label4_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If Label4.BackStyle = fmBackStyleTransparent Then
        Label4.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdIn_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdIn.BackStyle = fmBackStyleTransparent Then
        cmdIn.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdInSQ_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdInSQ.BackStyle = fmBackStyleTransparent Then
        cmdInSQ.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub cmdThoat_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If cmdThoat.BackStyle = fmBackStyleTransparent Then
        cmdThoat.BackStyle = fmBackStyleOpaque
    End If
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Label2.BackStyle = fmBackStyleOpaque Then
       Label2.BackStyle = fmBackStyleTransparent
    
    ElseIf Label3.BackStyle = fmBackStyleOpaque Then
       Label3.BackStyle = fmBackStyleTransparent
   
    ElseIf Label4.BackStyle = fmBackStyleOpaque Then
       Label4.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdIn.BackStyle = fmBackStyleOpaque Then
       cmdIn.BackStyle = fmBackStyleTransparent
       
       ElseIf cmdInSQ.BackStyle = fmBackStyleOpaque Then
       cmdInSQ.BackStyle = fmBackStyleTransparent
       
       Else
  cmdThoat.BackStyle = fmBackStyleOpaque
       cmdThoat.BackStyle = fmBackStyleTransparent
    End If
End Sub
Tôi nghĩ chẳng có gì để rút gọn ở các sự kiện MouseMove trên, bởi như vậy đã là tương đối tối ưu, nhưng nếu bạn có thể dùng Class thì có thể rút gọn hơn cho bạn, tuy nhiên bạn cần gửi cái file có cái form đó lên đây tôi sẽ giúp cho bạn.
 
Upvote 0
Cám ơn 2 anh đã trả lời,
tôi có làm một bài cho một bạn,
bạn ấy hơi lười, nên muốn nhập liệu cột A-->enter-->nhảy qua cột C-->enter nhảy qua E--->enter quay về A
nhưng ở cột A nó có một cái listbox, nên phải sử dụng sự kiện selectionchange, để khi nào chọn cột A thì nó active cái listbox.
nhưng khi mình từ cột E quay về thì nó ko active cái listbox đó (vì khi đó nó ko hiểu là cột A được chọn, giống ví dụ ở trên).
 
Upvote 0
Cám ơn 2 anh đã trả lời,
tôi có làm một bài cho một bạn,
bạn ấy hơi lười, nên muốn nhập liệu cột A-->enter-->nhảy qua cột C-->enter nhảy qua E--->enter quay về A
nhưng ở cột A nó có một cái listbox, nên phải sử dụng sự kiện selectionchange, để khi nào chọn cột A thì nó active cái listbox.
nhưng khi mình từ cột E quay về thì nó ko active cái listbox đó (vì khi đó nó ko hiểu là cột A được chọn, giống ví dụ ở trên).
Tôi biết bạn nói về bài nào và của ai, đây cũng không phải là lười biếng mà họ muốn tiện ích, không muốn sử dụng chuột, tuy nhiên, ở cell nó không như textbox tức nó không có sự kiện Cell_Change nên rất khó thực hiện ý đồ đó.
 
Upvote 0
Cám ơn 2 anh đã trả lời,
tôi có làm một bài cho một bạn,
bạn ấy hơi lười, nên muốn nhập liệu cột A-->enter-->nhảy qua cột C-->enter nhảy qua E--->enter quay về A
nhưng ở cột A nó có một cái listbox, nên phải sử dụng sự kiện selectionchange, để khi nào chọn cột A thì nó active cái listbox.
nhưng khi mình từ cột E quay về thì nó ko active cái listbox đó (vì khi đó nó ko hiểu là cột A được chọn, giống ví dụ ở trên).

Thử như thế này rồi tính tiếp
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Left(Target.Address(0, 0), 1) = "E" Then
        Target.Offset(, -4).Activate
        MsgBox ActiveCell.Address
        ' Code cua ban
    Else
        Target.Offset(, 2).Activate
    End If
    Application.EnableEvents = True
End Sub
 
Upvote 0
Chào các anh chị em có đoạn này:

[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)If Target.Column = 1 Then
If Target.Rows.Count = 1 Then
If Target <> "" Then
Target.Offset(, 4).Value = Now
Target.Offset(, 3).FillDown
Target.Offset(, 2).Activate
Else
Target.Offset(, 1).Resize(, 4).ClearContents
End If
End If
ElseIf Target.Column = 3 Then
If Target.Rows.Count = 1 Then
If Target <> "" Then
Target.Offset(1, -2).Activate
End If
End If
ElseIf Target.Column = 2 Then
If Target.Rows.Count = 1 Then
If Target <> "" Then
Target.Offset(1, -1).Activate
End If
End If
End If
End Sub[/GPECODE][/QUOTE]

Ý em là:

-Nếu nhập dử liệu ở cột A --> enter khung chọn ô tự dời ngang qua cột C
-Tiếp tục nếu nhập dử liệu ở cột C hoặc cột B --> enter -->khung chọn tự động xuống hàng ở cột A.

Về 2 ý trên code chạy được , khi áp dụng xóa dử liệu cột A mới bị báo lổi, do em không biết VBA chỉ lượm lặt code đó đây lắp ghép lại nên không biết sai thế nào ,sửa chửa thế nào xin các anh giúp em nhé.
 

File đính kèm

Upvote 0
Chào các anh chị em có đoạn này:
...
Ý em là:

-Nếu nhập dử liệu ở cột A --> enter khung chọn ô tự dời ngang qua cột C
-Tiếp tục nếu nhập dử liệu ở cột C hoặc cột B --> enter -->khung chọn tự động xuống hàng ở cột A.

Về 2 ý trên code chạy được , khi áp dụng xóa dử liệu cột A mới bị báo lổi, do em không biết VBA chỉ lượm lặt code đó đây lắp ghép lại nên không biết sai thế nào ,sửa chửa thế nào xin các anh giúp em nhé.

bạn thử sắp xếp như sau thử xem:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column = 1 Then
        If Target <> "" Then
            Target.Offset(, 4).Value = Now
            Target.Offset(, 3).FillDown
            Target.Offset(, 2).Activate
        Else
            Target.Offset(, 1).Resize(, 4).ClearContents
        End If
    ElseIf Target.Column = 2 Then
        If Target <> "" Then Target.Offset(1, -1).Activate
    ElseIf Target.Column = 3 Then
        If Target <> "" Then Target.Offset(1, -2).Activate
    End If
End If
End Sub
 
Upvote 0
bạn thử sắp xếp như sau thử xem:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
    If Target.Column = 1 Then
        If Target <> "" Then
            Target.Offset(, 4).Value = Now
            Target.Offset(, 3).FillDown
            Target.Offset(, 2).Activate
        Else
            Target.Offset(, 1).Resize(, 4).ClearContents
        End If
    ElseIf Target.Column = 2 Then
        If Target <> "" Then Target.Offset(1, -1).Activate
    ElseIf Target.Column = 3 Then
        If Target <> "" Then Target.Offset(1, -2).Activate
    End If
End If
End Sub
Em cám ơn anh phucbugis nhé, ok rồi anh ơi anh giỏi thật sửa lại vừa gọn vừa hết lỗi, anh có thể giải thích vì sao code em làm bị lỗi không anh ?
 
Upvote 0
Tôi nghĩ chẳng có gì để rút gọn ở các sự kiện MouseMove trên, bởi như vậy đã là tương đối tối ưu, nhưng nếu bạn có thể dùng Class thì có thể rút gọn hơn cho bạn, tuy nhiên bạn cần gửi cái file có cái form đó lên đây tôi sẽ giúp cho bạn.
Cám ơn Thầy đã hồi âm! form này ở trong một chương trình em đang viết có nhiều form, Thầy cho em thời gian để tách riêng form này ra và gửi lên chương trình nhờ Thầy giúp em, về Class em còn lớ ngớ lắm, rất mong Thầy quan tâm giúp đỡ. Trân trọng
 
Upvote 0
Tôi nghĩ chẳng có gì để rút gọn ở các sự kiện MouseMove trên, bởi như vậy đã là tương đối tối ưu, nhưng nếu bạn có thể dùng Class thì có thể rút gọn hơn cho bạn, tuy nhiên bạn cần gửi cái file có cái form đó lên đây tôi sẽ giúp cho bạn.
Chào thầy Nghĩa! Em gửi file giả định lên nhờ Thầy giúp đỡ. Cụ thể Thầy xem giúp em 1 số nội dung sau:
1. Khi để file chạy ở chế độ không ẩn Sheet thì có thể xem được hồ sơ trước khi in bình thường, nhưng khi em cho chạy đoạn code (If Application.Visible = True Then Application.Visible = False) thì ở chế độ Print Priview bị mờ đi không sử dụng được các nút chức năng, chỉ xem được.
2. Thực tế em mới tiếp cận với VBA từ tháng 10/2013 và không được học cơ bản, kiến thức có được chỉ từ đọc sách của Thầy Phan Tự Hướng và học từ diễn đàn, nên còn rất hạn chế. Vậy em nhờ Thầy cho ý kiến về cách sử dụng Form (về giao diện, bố trí ...).
Rất mong Thầy chỉ bảo giúp em. Trân trọng cám ơn Thầy
 

File đính kèm

Upvote 0
Chào thầy Nghĩa! Em gửi file giả định lên nhờ Thầy giúp đỡ. Cụ thể Thầy xem giúp em 1 số nội dung sau:
1. Khi để file chạy ở chế độ không ẩn Sheet thì có thể xem được hồ sơ trước khi in bình thường, nhưng khi em cho chạy đoạn code (If Application.Visible = True Then Application.Visible = False) thì ở chế độ Print Priview bị mờ đi không sử dụng được các nút chức năng, chỉ xem được.
2. Thực tế em mới tiếp cận với VBA từ tháng 10/2013 và không được học cơ bản, kiến thức có được chỉ từ đọc sách của Thầy Phan Tự Hướng và học từ diễn đàn, nên còn rất hạn chế. Vậy em nhờ Thầy cho ý kiến về cách sử dụng Form (về giao diện, bố trí ...).
Rất mong Thầy chỉ bảo giúp em. Trân trọng cám ơn Thầy
Tôi làm tạm cái file này, bạn xem có thấy gì bất tiện không nhé.
 

File đính kèm

Upvote 0
Tôi làm tạm cái file này, bạn xem có thấy gì bất tiện không nhé.
Cám ơn Thầy đã quan tâm giúp đỡ em !, em đã chạy thử thấy code rất gọn, chạy êm và nhanh hơn rất nhiều, tuy nhiên khi Prin Priview vẫn bị mờ các nút chức năng Thầy ạ, hơn nữa khi thoát từ nút thoát thì vẫn không thoát hết cả phần excel. em đã thử bằng cách thêm 1 nút lệnh để mở form từ excel (Không cho mở form ngay khi Enable ) thì không mắc lỗi mờ khi Prin Priview, em không hiểu lỗi này là lỗi gì. Rất mong Thầy quan tâm giúp đỡ. Trân trọng biết ơn Thầy
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom