Hỏi đáp về VBA (các vấn đề căn bản nhất) (1 người xem)

Liên hệ QC

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

havietchuong

Thành viên tiêu biểu
Tham gia
16/6/09
Bài viết
490
Được thích
570
Giới tính
Nam
Nghề nghiệp
Giáo viên tiểu học.
Tôi không biết đặt đặt câu hỏi này nơi nào cho đúng, xin gởi vào đây. Nếu có sai xin thông cảm cho người mới học VBA.
Trong 1 cửa sổ Module có thể ghi nhiều nhiều Macro và mỗi macro có thể ứng với 1 tổ hợp phím nào đó được không?
Tôi thử nhiều lần thì khi được khi không. Không biết nó thế nào? Trong tập tin sau có lỗi gì không trong cách ghi Macro? Cám ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Số 2 trong câu lệnh phản ánh cách tìm nguyên thể hay chỉ tìm 1 fần của đối tượng cần tìm;

Cụ thể trong cửa số Immediate ta nhập câu lệnh

PHP:
 ?xlPart
Sau khi nhấn {ENTER} sẽ biết kết quả;

Tuy nhiên, mình khuyên các bạn không chuyên đừng xài số 2 thay vì xpPart vì chí ít 2 lý do, mà 1 trong đó là tốn thêm nơtron để thuộc các số vô tri vô giác này.

Thân ái!
 
Upvote 0
Nhờ mọi người giúp em hiểu số 2 trong đoạn sau phản ánh cái gì

PHP:
Set Cll = [B:B].Find("T", [B1], xlValues, 2)
Thử record macro theo 2 tình huống sau đây:
- Bật Record macro ---> Bấm Ctrl + F ---> Gõ từ khóa cần tìm, check mục "Match entire cell contents", bấm nút Find Next rồi Close ---> Tắt record macro ---> Xem code
- Bật Record macro ---> Bấm Ctrl + F ---> Gõ từ khóa cần tìm, bỏ check mục "Match entire cell contents", bấm nút Find Next rồi Close ---> Tắt record macro---> Xem code
So sánh 2 code nhận được từ record macro xem chúng khác nhau cái gì thì đấy chính là cái mà bạn đang thắc mắc đấy
---------------
Tôi thì ngược lại với sư phụ ChanhTQ@: Khuyên bạn nên tập THUỘC LÒNG mấy hằng số này nếu bạn muốn tiến xa hơn trên con đường lập trình (mà chuyện thuộc lòng này sẽ rất dễ nếu như ngày nào bạn cũng làm)
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Tuy nhiên, mình khuyên các bạn không chuyên đừng xài số 2 thay vì xpPart  vì chí ít 2 lý do, mà 1 trong đó là tốn thêm nơtron để thuộc các số vô  tri vô giác này.

Em chưa hiểu lắm việc thay xlPart bằng 2 thì có khác gì nhau không?
 
Upvote 0
PHP:
Tuy nhiên, mình khuyên các bạn không chuyên đừng xài số 2 thay vì xpPart  vì chí ít 2 lý do, mà 1 trong đó là tốn thêm nơtron để thuộc các số vô  tri vô giác này.

Em chưa hiểu lắm việc thay xlPart bằng 2 thì có khác gì nhau không?
Hoàn toàn không có gì khác nhau cả! xlPart là 1 hằng số do bác Bill quy định nó PHẢI =2 (nên không thể = cái gì khác)
- Quan điểm của sư phụ ChanhTQ@ là không nên nhớ mấy con số ấy mà nên dùng các chuổi biểu thị hằng số (xlPart thay vì 2)
- Quan điểm của tôi: Nếu ngày nào đó bạn tiến xa hơn vượt khỏi phạm vi lập trình Excel (lập trình trên ứng dụng khác) thì dù bạn có viết xlPart code nó cũng cóc hiểu đó là cái gì (nhưng viết số 2 thì nó hiểu)
Vậy nên ngay từ bây giờ, cứ tập thói quen luôn nhớ giá trị các hằng số (nếu có thể) cũng không phải là thừa
 
Upvote 0
Thử record macro theo 2 tình huống sau đây:
- Bật Record macro ---> Bấm Ctrl + F ---> Gõ từ khóa cần tìm, check mục "Match entire cell contents", bấm nút Find Next rồi Close ---> Tắt record macro ---> Xem code
- Bật Record macro ---> Bấm Ctrl + F ---> Gõ từ khóa cần tìm, bỏ check mục "Match entire cell contents", bấm nút Find Next rồi Close ---> Tắt record macro---> Xem code
So sánh 2 code nhận được từ record macro xem chúng khác nhau cái gì thì đấy chính là cái mà bạn đang thắc mắc đấy

Nó khác nhau ở LookAt:= xlWhole (tìm toàn bộ) ---? Em Test theo cách thày ChanhTQ@ = 1
và LookAt:= xlPart (tìm từng phần) ---> 2

---> Như vậy 1 tổng quát hơn là 2 (tìm kiếm sẽ lâu hơn?)
 
Upvote 0
Theo mình thì xlUp, xlDown, xlPart, xl. . . . là vốn tự có;

Còn các con số là vốn vay khi fải đi buôn vậy bạn à! Mà đã là vốn vay fải chịu lãi xuất đó nghe!

Mọi so sánh đều khập khiển, nhưng xlWhole, xl... như là Long trong khai báo biến kiểu số, còn các ký số xài thay chúng nó là các kiểu Byte, Integer,. . .

/(hà, khà,. . . . chỉ là cảm tính thôi đó nhe!
 
Upvote 0
Hỏi về Find

Không hiểu sao em đọc mãi về Find mà thực hành cứ lúng túng làm sao, mãi không được, xin mọi người giúp em viết đúng đoạn Code sau

PHP:
Sub tt()
    Dim Src As Range, Rng As Range, FirstAddress As String
    Set Src = Range([A1], [A65000].End(xlUp))
    Set Rng = Src.Find("1*", , LookIn:=xlValues, LookAt:=1)
    FirstAddress = Rng.Address
    If Not Rnge Is Nothing Then
        Do
            R = R + 1
            Cells(R, 2) = Rng
            Set Rng = Src.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub
 
Upvote 0
về Find() mà thực hành cứ lúng túng mãi, xin mọi người giúp em viết đúng đoạn Code sau

PHP:
Sub tt()
    Dim Src As Range, Rng As Range, FirstAddress As String
    Set Src = Range([A1], [A65000].End(xlUp))
3    Set Rng = Src.Find("1*", , LookIn:=xlValues, LookAt:=1)
    FirstAddress = Rng.Address
5    If Not Rnge Is Nothing Then
        Do
            R = R + 1
            Cells(R, 2) = Rng
            Set Rng = Src.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

(1) Câu lệnh 4 fải để trong vòng lặp bắt đầu từ dòng lệnh 5;
Khi fương thức tìm thấy ô thoả, ta mới có thể gán địa chỉ ô tìm thấy vô biến được; Nếu không tìm thấy mà đem gán thỉ VBA sẽ cự nự là fải rồi!

(2) Hình như bạn cần tìm số liệu trong vùng cột 'A' có chứa số 1; chứ không tìm chuỗi "1*" (chuỗi có độ dài = 2) trong vùng cần tìm;

Nếu vậy cú fáp dòng lệnh số 3 của bạn đang sai;
 
Upvote 0
Đúng như vậy bác ah, nhưng em sửa vẫn không được, phiền bác sửa dùm em với.
 
Upvote 0
Trong file đính kèm em làm thế này
PHP:
Sub TrichLoc1()
    Dim Rng As Range, FirstAddress As String
    Set Src = Range([A1], [A65000].End(xlUp))
    Set Rng = Src.Find("1*", , LookIn:=xlFormulas, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        Do
            R = R + 1
            Cells(R, 2) = Rng
            Set Rng = Src.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

đồng thời sửa như sau vẫn ra kết quả vậy
PHP:
Sub TrichLoc1()
    Dim Rng As Range, FirstAddress As String
    Set Src = Range([A1], [A65000].End(xlUp))
    Set Rng = Src.Find("1*", , LookIn:=xlValues, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        Do
            R = R + 1
            Cells(R, 2) = Rng
            Set Rng = Src.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

Vậy LookIn:=xlValues nó khác gì so với LookIn:=xlFormulas ?
 

File đính kèm

Upvote 0
Trong file đính kèm em làm thế này
PHP:
Sub TrichLoc1()
    Dim Rng As Range, FirstAddress As String
    Set Src = Range([A1], [A65000].End(xlUp))
    Set Rng = Src.Find("1*", , LookIn:=xlFormulas, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        Do
            R = R + 1
            Cells(R, 2) = Rng
            Set Rng = Src.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

đồng thời sửa như sau vẫn ra kết quả vậy
PHP:
Sub TrichLoc1()
    Dim Rng As Range, FirstAddress As String
    Set Src = Range([A1], [A65000].End(xlUp))
    Set Rng = Src.Find("1*", , LookIn:=xlValues, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        Do
            R = R + 1
            Cells(R, 2) = Rng
            Set Rng = Src.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

Vậy LookIn:=xlValues nó khác gì so với LookIn:=xlFormulas ?

Đúng ra code phải như vầy:
PHP:
Sub TrichLoc1()
  Dim Rng As Range, FirstAddress As String
  Set Src = Range([A1], [A65000].End(xlUp))
  Set Rng = Src.Find("1*", , LookIn:=xlValues, LookAt:=xlWhole)
  If Not Rng Is Nothing Then
    FirstAddress = Rng.Address
    Do
      R = R + 1
      Cells(R, 2) = Rng
      Set Rng = Src.FindNext(Rng)
    Loop While FirstAddress <> Rng.Address
  End If
End Sub
LookIn:=xlValues ---> Tìm trong dữ liệu thô
LookIn:=xlFormulas ---> Tìm trong công thức
Ví dụ:
- Cells A7 có công thức =IF(A1="10","Yes","No")
- Code của ta là:
Mã:
Sub TrichLoc1()
  Dim Rng As Range, FirstAddress As String, Src As Range
  Set Src = Range([A1], [A65000].End(xlUp))
  Set Rng = Src.Find("10*", , LookIn:=xlFormulas, [B][COLOR=#ff0000]LookAt:=xlPart[/COLOR][/B])
  If Not Rng Is Nothing Then
    FirstAddress = Rng.Address
    Do
      R = R + 1
      Cells(R, 2) = Rng
      Set Rng = Src.FindNext(Rng)
    Loop While FirstAddress <> Rng.Address
  End If
End Sub
Thì code sẽ tìm thấy số "10" nằm trong công thức (dù kết quả của công thức này chẳng liên quan gì đến số 10)
Với dữ liệu của bạn thì dù tìm trong dữ liệu thô hay công thức đều như nhau (vùng tìm kiếm của bạn chẳng có công thức)
Nói thêm: Câu lệnh FirstAddress = Rng.Address phải nằm trong IF ---> Với dữ liệu của bạn, chẳng qua nó "hên" nên không báo lỗi... Giờ thử trường hợp không tìm thấy thì sao?
 
Upvote 0
Chào anh, anh giải thích đoạn code này hộ em với, em không biết tác dụng của nó làm gì.


Sub Auto_Open()
On Error Resume Next
Dim makt1 As String, s1 As String, v As String
Set fs = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem In colItems
s3 = objItem.ProcessorId
Next
 
Upvote 0
Chào anh, anh giải thích đoạn code này hộ em với, em không biết tác dụng của nó làm gì.


Sub Auto_Open()
On Error Resume Next
Dim makt1 As String, s1 As String, v As String
Set fs = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem In colItems
s3 = objItem.ProcessorId
Next
Tác dụng của nó là lấy số CPU ID (nằm trong biến s3 ấy)
Code vừa đủ chỉ có vầy thôi:
PHP:
Sub Test()
  Dim objItem As Object
  On Error Resume Next
  With GetObject("winmgmts:\\.\root\cimv2")
    For Each objItem In .ExecQuery("Select * from Win32_Processor")
      MsgBox objItem.ProcessorId
    Next
  End With
End Sub
Nếu tôi đoán không lầm thì tay nào đó định dùng code này để khóa bản quyền phần mềm đây
 
Upvote 0
Tác dụng của nó là lấy số CPU ID (nằm trong biến s3 ấy)
Code vừa đủ chỉ có vầy thôi:
PHP:
Sub Test()
  Dim objItem As Object
  On Error Resume Next
  With GetObject("winmgmts:\\.\root\cimv2")
    For Each objItem In .ExecQuery("Select * from Win32_Processor")
      MsgBox objItem.ProcessorId
    Next
  End With
End Sub
Nếu tôi đoán không lầm thì tay nào đó định dùng code này để khóa bản quyền phần mềm đây

Thanks bac nha! bác cho em hỏi tý nữa số ID CPU mỗi máy khác nhau phải không bác
 
Upvote 0
Thanks bac nha! bác cho em hỏi tý nữa số ID CPU mỗi máy khác nhau phải không bác
Điều đó không chắc lắm!
2 máy khác nhau nhưng cùng model có thể sẽ trùng số CPU ID đấy
Điều này đã được bàn ở đây rồi:
http://www.giaiphapexcel.com/forum/showthread.php?63022-Máy-tính-có-đặc-điểm-gì-riêng
Người ta muốn biết giữa 2 máy tính thì thông số nào thuộc dạng duy nhất nhưng đến giờ vẫn chưa tìm ra được đó là "cái gì" cả
 
Upvote 0
Điều đó không chắc lắm!
2 máy khác nhau nhưng cùng model có thể sẽ trùng số CPU ID đấy
Điều này đã được bàn ở đây rồi:
http://www.giaiphapexcel.com/forum/showthread.php?63022-Máy-tính-có-đặc-điểm-gì-riêng
Người ta muốn biết giữa 2 máy tính thì thông số nào thuộc dạng duy nhất nhưng đến giờ vẫn chưa tìm ra được đó là "cái gì" cả

Em cảm ơn, vậy để bảo mật tốt nhất mình dùng Serialnumber của HDD sẽ tốt hơn đúng không anh vì số Serialnumber của HDD sẽ bị thay đổi khi ta cài lại máy, hơn nữa em thấy nếu dùng thông số của CPU thì em thấy có máy trùng rồi thì như vậy sẽ khó bảo mật. Anh có cách nào để bảo mật tốt hơn không anh?
 
Upvote 0
Em cảm ơn, vậy để bảo mật tốt nhất mình dùng Serialnumber của HDD sẽ tốt hơn đúng không anh vì số Serialnumber của HDD sẽ bị thay đổi khi ta cài lại máy, hơn nữa em thấy nếu dùng thông số của CPU thì em thấy có máy trùng rồi thì như vậy sẽ khó bảo mật. Anh có cách nào để bảo mật tốt hơn không anh?
Nếu viết code trên nền tảng Excel VBA thì thôi khỏi nghĩ đến vụ bảo mật chỉ cho mệt! Dù bạn có làm gì thì người ta vẫn mở được file trong vòng 10 giây mà thôi
 
Upvote 0
Nếu viết code trên nền tảng Excel VBA thì thôi khỏi nghĩ đến vụ bảo mật chỉ cho mệt! Dù bạn có làm gì thì người ta vẫn mở được file trong vòng 10 giây mà thôi

Vậy nếu dùng Hex Editor để sửa các gía trị trong file thì có thể bảo mật được không bạn?
 
Upvote 0
Nếu viết code trên nền tảng Excel VBA thì thôi khỏi nghĩ đến vụ bảo mật chỉ cho mệt! Dù bạn có làm gì thì người ta vẫn mở được file trong vòng 10 giây mà thôi

Anh ơi cho em hỏi đoạn code này, em đã copy 1 folder chuyển thành mà sao trong listbox em không thấy nó hiển thị năm 2012 mà chỉ có năm 2011 anh nhỉ. em thấy trong folder này có tập tin excel .xls mà ko có tên. anh hướng dẫn em với.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom