Hỏi nhanh - Đáp nhanh về macro (dành cho các thành viên mới học lập trình)

Liên hệ QC

tuananhya2

Thành viên mới
Tham gia
18/8/12
Bài viết
8
Được thích
0
Co ai chỉ dùm cách tạo pass marco với
 
Em mới đang tập tành thêm mấy hàm windowAPI, gặp vấn đề như sau mà em chưa biết dùng hàm API nào ,cụ thể :
* Khi ta chạy phần mềm excel.exe,--> trên màn hình sẽ hiển thị cửa sổ Excel starting , --> bây giờ nếu mình không muốn hiện cửa sổ excel starting nữa thì phải dùng hàm nào !
Em tìm trong các hàm về hiển thị cửa sổ mà không làm được !
Mong các anh giúp đỡ ! em cảm ơn ! @_@
 
Upvote 0
Em mới đang tập tành thêm mấy hàm windowAPI, gặp vấn đề như sau mà em chưa biết dùng hàm API nào ,cụ thể :
* Khi ta chạy phần mềm excel.exe,--> trên màn hình sẽ hiển thị cửa sổ Excel starting , --> bây giờ nếu mình không muốn hiện cửa sổ excel starting nữa thì phải dùng hàm nào !
Em tìm trong các hàm về hiển thị cửa sổ mà không làm được !
Mong các anh giúp đỡ ! em cảm ơn ! @_@

+-+-+-++-+-+-++-+-+-+ --> quên khuấy đi là hình như bất kỳ ứng dụng API nào cũng có .visible :
Tức là khi ta khai báo excel.Application thì visible mặc định của nó là False rồi,nên nó sẽ không hiển thị cửa sổ starting nữa @_@

Làm hôm qua loay hoay tìm mấy hàm API mãi mà không ra ^^!
 
Upvote 0
Có thể liên kết Excel với Notepad được không?

Gửi GPE!
Hiện nay Tôi có ý định tạo một đoạn "code" trong cửa sổ vba của Excel và một đoạn code để trong Notepad.
Thực ra 2 đoạn code này vẫn có thể cho vào cùng một Sub được nhưng sở dĩ tôi muốn tách ra là vì nhằm mục đích cho người dùng có thể tự do chỉnh sửa dễ dàng khi có sự thay đổi vi dụ mà không cần thiết phải truy cập vào trang lập trình trong VBA.

Nếu vậy thì đoạn code phải viết thế nào để 2 đoạn code này có mối liên kết được với nhau?

Mong nhận được sự giúp đỡ của các bạn!
Xin cảm ơn!
 
Upvote 0
Gửi GPE!
Hiện nay Tôi có ý định tạo một đoạn "code" trong cửa sổ vba của Excel và một đoạn code để trong Notepad.
Thực ra 2 đoạn code này vẫn có thể cho vào cùng một Sub được nhưng sở dĩ tôi muốn tách ra là vì nhằm mục đích cho người dùng có thể tự do chỉnh sửa dễ dàng khi có sự thay đổi vi dụ mà không cần thiết phải truy cập vào trang lập trình trong VBA.

Nếu vậy thì đoạn code phải viết thế nào để 2 đoạn code này có mối liên kết được với nhau?

Mong nhận được sự giúp đỡ của các bạn!
Xin cảm ơn!

Nói chung là: CÓ THỂ
Tuy nhiên bạn nên nói cụ thể 1 chút: Đó là những đoạn code gì? Liên kết là liên kết thế nào?
 
Upvote 0
Nói chung là: CÓ THỂ
Tuy nhiên bạn nên nói cụ thể 1 chút: Đó là những đoạn code gì? Liên kết là liên kết thế nào?
Cảm ơn Bạn đã cho ý kiến!
Về ví dụ Tôi xin phép là tạm thời lấy ví dụ đơn giản như thế này:
Mã:
Sub Macro1()
    Range("C5:F16").Copy
    Range("G5:J16").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    Application.CutCopyMode = False
    [COLOR=#0000ff][B]Macro2[/B][/COLOR]
End Sub

Mã:
Sub Macro2()
    Range("C5:F5").EntireColumn.Hidden = True
End Sub

Tôi muón gán Sub Macro2 vào trong file Notepad.Và Sub Macro1 vẫn để trong file Excel.
2 file này để trong cùng một thư mục.
Chi tiết Bạn có thể coi file kèm.
 

File đính kèm

  • Test.zip
    7.3 KB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Bạn đã cho ý kiến!
Về ví dụ Tôi xin phép là tạm thời lấy ví dụ đơn giản như thế này:
Mã:
Sub Macro1()
    Range("C5:F16").Copy
    Range("G5:J16").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    Application.CutCopyMode = False
    [COLOR=#0000ff][B]Macro2[/B][/COLOR]
End Sub

Mã:
Sub Macro2()
    Range("C5:F5").EntireColumn.Hidden = True
End Sub

Tôi muón gán Sub Macro2 vào trong file Notepad.Và Sub Macro1 vẫn để trong file Excel.
2 file này để trong cùng một thư mục.
Chi tiết Bạn có thể coi file kèm.

Bạn sửa toàn bộ code thành vầy nhé:
Mã:
[COLOR=#ff0000]Public module As Object[/COLOR]
Sub Macro1()
  [COLOR=#ff0000]On Error Resume Next[/COLOR]
  Range("C5:F16").Copy
  Range("G5:J16").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
  Application.CutCopyMode = False
  [COLOR=#ff0000]Dim txtFile As String
  txtFile = ThisWorkbook.Path & "\Test.txt"
  CreateCodeFromTextFile txtFile
  Run "Macro2"
  ThisWorkbook.VBProject.VBComponents.Remove module[/COLOR]
End Sub
[COLOR=#0000cd]Sub CreateCodeFromTextFile(ByVal txtFile As String)
  Dim strCode As String
  On Error Resume Next
  With CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile(txtFile)
      strCode = .ReadAll: .Close
    End With
  End With
  strCode = Replace(strCode, vbCrLf, vbLf)
  Set module = ThisWorkbook.VBProject.VBComponents.Add(1)
  module.CodeModule.InsertLines 2, strCode
End Sub[/COLOR]
Chổ màu xanh là 1 sub mới vừa thêm vào.
Chổ màu đỏ là những chổ cần sửa trong macro1
----------------------
Ngoài lề: Tuy cách nói chuyện có khác nhưng "cách học" của bạn khiến tôi nhớ đến 1 người (mà thời gian gần đây tôi thường trợ giúp)
???
Ẹc... Ẹc...
 
Upvote 0
Bạn sửa toàn bộ code thành vầy nhé:

To NDU:
Cảm ơn Thầy đã giúp đỡ!

Ngoài lề: Tuy cách nói chuyện có khác nhưng "cách học" của bạn khiến tôi nhớ đến 1 người (mà thời gian gần đây tôi thường trợ giúp)
???
Ẹc... Ẹc...

Không ngờ ngòai khả năng vượt trội về khiến kiến thức ra thì khả năng phán đoán của Thầy cũng khiến tôi thật bất ngờ...Có thể Thầy đã đoán đúng (Có thể tôi và "người đó" là một..).
Tôi đặt trường hợp khi Thầy đã đoán đúng_Tôi xin giải thích:
Đúng là ngoài ních này ra tôi còn một nich nữa hay sử dụng nhưng tôi lại không sử dụng ních đó cho bài này vì trước khi gửi bài này tôi cũng đã nghĩ đến Thầy.
Tôi cũng hiểu phần nào về tính cách của Thầy.Cái mà tôi hiểu ở đây là Thầy luôn muốn mọi người đi từ cái cơ bản nhất rồi mới tới cái nâng cao...Nhưng đôi khi có những cái tôi cảm thấy cần thiết phải đi ngược lại vì vậy tôi mới có thêm một nich nữa...Hi vọng Thầy sẽ không trách!

Thật sự mà nói đối với Tôi,Thầy rất quan trọng và đặc biệt.

Rất cảm ơn sự chú ý và giúp đỡ của Thầy!
 
Upvote 0
=
Tôi cũng hiểu phần nào về tính cách của Thầy.Cái mà tôi hiểu ở đây là Thầy luôn muốn mọi người đi từ cái cơ bản nhất rồi mới tới cái nâng cao...Nhưng đôi khi có những cái tôi cảm thấy cần thiết phải đi ngược lại vì vậy tôi mới có thêm một nich nữa...Hi vọng Thầy sẽ không trách!

Nói đùa thôi mà
Bạn tiếp thu được, áp dụng được là tôi mừng rồi (mọi chuyện khác không quan trọng)
Ẹc... Ẹc...
------------
Nói thêm về cách vận hành của code trên cho bạn mường tượng:
- Code mở file text, copy toàn bộ chúng cho vào 1 biến tạm
- Chèn 1 Module rồi gán code trong biến tạm vào module ấy (ta có ngay Sub Macro2)
- Chạy Mạcro2
- Chạy xong, xóa luôn Module đã chèn (cho mất tích)
 
Lần chỉnh sửa cuối:
Upvote 0
Nói thêm về cách vận hành của code trên cho bạn mường tượng:
- Code mở file text, copy toàn bộ chúng cho vào 1 biến tạm
- Chèn 1 Module rồi gán code trong biến tạm vào module ấy (ta có ngay Sub Macro2)
- Chạy Mạcro2
- Chạy xong, xóa luôn Module đã chèn (cho mất tích)

Cảm ơn Thầy vì sự chu đáo!
Mới đầu Em cũng định nhờ Thầy giải thích cặn kẽ hơn.Nhưng sau một hồi vằn vọc mãi Em mới thử xóa dòng này đi xem sao:
Mã:
Sub Macro1()
  'On Error Resume Next
  Range("C5:F16").Copy
  Range("G5:J16").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
  Application.CutCopyMode = False
  Dim txtFile As String
  txtFile = ThisWorkbook.Path & "\Test.txt"
  CreateCodeFromTextFile txtFile
  Run "Macro2"
  [COLOR=#ff0000][B]‘ThisWorkbook.VBProject.VBComponents.Remove module[/B][/COLOR]
End Sub
Thì đã hiểu được thêm mục đích của code này để làm gì:
Mã:
Sub CreateCodeFromTextFile(ByVal txtFile As String)
  Dim strCode As String
  'On Error Resume Next
  With CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile(txtFile)
      strCode = .ReadAll: .Close
    End With
  End With
  strCode = Replace(strCode, vbCrLf, vbLf)
  Set module = ThisWorkbook.VBProject.VBComponents.Add(1)
  module.CodeModule.InsertLines 2, strCode
End Sub
Thì mới ngộ ra được sơ qua về nguyên lý hoạt động của các code:
Mục đích của nó đó là sao chép toàn bộ thông tin trong file .txt theo đường dẫn
Mã:
ThisWorkbook.Path & "\Test.txt"
Sau đó tạo một Module mới trong cửa sổ lập trình của Excel rồi dán(thay thế) toàn bộ thông tin của file .txt vào trong Module mới tạo này.Sau đó cho chạy tên đoạn code
Mã:
 (Run "Macro2")
mà mình muốn chạy.
Cuối cùng là sử dụng “ThisWorkbook.VBProject.VBComponents.Remove module” để xóa đi cái module vừa mới tạo…
Em hiểu là như vậy.
----------
Tuy nhiên trong vấn đề này nếu file đặt passvba thì không thể thực hiện được như yêu cầu trên.
Thầy có cách nào khắc phục được tình trạng này không ạ? Ví dụ passvba là:123
 
Upvote 0
Tuy nhiên trong vấn đề này nếu file đặt passvba thì không thể thực hiện được như yêu cầu trên.
Thầy có cách nào khắc phục được tình trạng này không ạ? Ví dụ passvba là:123

Cái vụ PassVBA cũng mệt lắm nha (trên GPE đã bàn nhiều)
Nói chung hiện nay chưa có phương pháp nào can thiệp được 1 cách TOÀN DIỆN vào cửa sổ lập trình khi nó đã được đặt password
Người ta thường dùng SendKeys để thay thế cho thao tác bằng tay. Ví dụ:
Application.SendKeys "%{F11}" để giả lập thao tác bằng tay bấm tổ hợp phím Alt + F11 (mở cửa sổ lập trình)
Tiếp theo ta thao tác bằng tay cái gì đó để mở password thì cứ lần lượt SendKeys y chang vậy
vân vân...
Nhưng nói chung phương pháp này vừa dở ẹc vừa chẳng hiệu quả chút nào (hay bị lỗi tầm bậy tầm bạ) nên tôi cũng không khuyên dùng
Vậy nên: Tạm thời bạn đừng nghiên cứu nó cho mất công
(khi nào tìm được giải pháp khác hay hơn, tôi sẽ cho bạn biết)
 
Upvote 0
Cái vụ PassVBA cũng mệt lắm nha (trên GPE đã bàn nhiều)
Nói chung hiện nay chưa có phương pháp nào can thiệp được 1 cách TOÀN DIỆN vào cửa sổ lập trình khi nó đã được đặt password
Người ta thường dùng SendKeys để thay thế cho thao tác bằng tay. Ví dụ:
Application.SendKeys "%{F11}" để giả lập thao tác bằng tay bấm tổ hợp phím Alt + F11 (mở cửa sổ lập trình)
Tiếp theo ta thao tác bằng tay cái gì đó để mở password thì cứ lần lượt SendKeys y chang vậy
vân vân...
Nhưng nói chung phương pháp này vừa dở ẹc vừa chẳng hiệu quả chút nào (hay bị lỗi tầm bậy tầm bạ) nên tôi cũng không khuyên dùng
Vậy nên: Tạm thời bạn đừng nghiên cứu nó cho mất công
(khi nào tìm được giải pháp khác hay hơn, tôi sẽ cho bạn biết)

Cảm ơn Thầy đã chia sẻ!
Với kinh nghiệm của Thầy, thì Thầy có thể nhận ra rằng phương pháp này chưa hiệu quả lắm.
Nhưng đối với Em thì chưathể nào mà biết được cái nào hoàn hảo để mà dùng nó cả. Vì vậy cứ cái gì có khẳng năng dùng được thì ta dùng.
Chờ đến một ngày nào đó hi vọng sẽ có cái mới hoàn hảo hơn để ta thay thế cái cũ. Nhưng khoảng thời gian chờ đó cũng chưa biết thế nào.Trong thời gian này ta có thể sử dụng những cái mà phục vụ được mục đích của ta cũng được Thầy ạ!
Hơn nữa Em đang trong thời gian học hỏi để áp dụng nên kiến thức lúc này là rất cần thiết.

Lúc nào tiện Thầy có thể viết hoàn chỉnh code theo phương pháp dùng SendKeys để Em hiểu thêm và áp dụng được không ạ?
Cảm ơn Thầy!
 
Upvote 0
Cảm ơn Thầy đã chia sẻ!
Với kinh nghiệm của Thầy, thì Thầy có thể nhận ra rằng phương pháp này chưa hiệu quả lắm.
Nhưng đối với Em thì chưathể nào mà biết được cái nào hoàn hảo để mà dùng nó cả. Vì vậy cứ cái gì có khẳng năng dùng được thì ta dùng.
Chờ đến một ngày nào đó hi vọng sẽ có cái mới hoàn hảo hơn để ta thay thế cái cũ. Nhưng khoảng thời gian chờ đó cũng chưa biết thế nào.Trong thời gian này ta có thể sử dụng những cái mà phục vụ được mục đích của ta cũng được Thầy ạ!
Hơn nữa Em đang trong thời gian học hỏi để áp dụng nên kiến thức lúc này là rất cần thiết.

Lúc nào tiện Thầy có thể viết hoàn chỉnh code theo phương pháp dùng SendKeys để Em hiểu thêm và áp dụng được không ạ?
Cảm ơn Thầy!
Tức là đầu tiên bạn phải có code Unprotect VBA trước mới chạy được những thứ khác
Cái vụ Unprotect VBA đang bàn ở đây nè:
http://www.giaiphapexcel.com/forum/...ình-biết-pass)&p=519873&highlight=#post519873
 
Upvote 0
Cách sự dụng SendKeys?

Tức là đầu tiên bạn phải có code Unprotect VBA trước mới chạy được những thứ khác
Cái vụ Unprotect VBA đang bàn ở đây nè:
http://www.giaiphapexcel.com/forum/...ình-biết-pass)&p=519873&highlight=#post519873
Cảm ơn Thầy,Em sẽ tìm hiểu vấn đề trên sau.
Nhân đây xin hỏi Thầy thêm về lĩnh vực SendKeys:
Cụ thể là cách dùng và Thầy có danh sách SendKeys không ạ(vd:"%{F11}")?
 
Upvote 0
Cảm ơn Thầy,Em sẽ tìm hiểu vấn đề trên sau.
Nhân đây xin hỏi Thầy thêm về lĩnh vực SendKeys:
Cụ thể là cách dùng và Thầy có danh sách SendKeys không ạ(vd:"%{F11}")?

Trong cửa sổ lập trình, bạn gõ dòng lệnh Application.Sendkeys
Xong bôi đen chữ SendKeys rồi bấm F1 sẽ có câu trả lời đầy đủ (cả ví dụ cụ thể)
Nói chung, cái gì không biết cũng cứ làm thế nhé
 
Upvote 0
Nhờ giải thích chỗ sai của dòng code dơn giản(đang học)

Các bạn chỉ giúp mình chỗ sai, điểm không hợp lý trong dòng code của mình với
Mình dang tập nên lấy ví dụ đơn giản ban vo giúp với
Thank!
 

File đính kèm

  • nho giai thich.xlsm
    14.1 KB · Đọc: 8
Upvote 0
Sửa code thì tôi chưa test kỹ, nhưng nếu muốn hoán vị thì có những thủ thuật gọn hơn:

1) Dùng hàm để hoán vị:

Mã:
Sub Chuyen2()
    'Dung ham hoan vi:
    With Worksheets("sheet1")
        .Range("C2:U2") = WorksheetFunction.Transpose(.Range("A2:A20"))
    End With
End Sub

2) Dùng copy paste để hoán vị:


Mã:
Sub Chuyen3()
    'Copy roi paste hoan vi:
    With Worksheets("sheet1")
        .Range("A2:A20").Copy
        .Range("C2").PasteSpecial Paste:=xlPasteValues, Transpose:=True
    End With
End Sub
 
Upvote 0
Bây giờ mới test code của bạn nè:

1) Nó báo lỗi dòng đó là vì lỗi tràn dòng, nhưng thực chất lỗi không phát sinh tại đó mà lỗi do biến n tạo ra.

Bạn đặt biến n = Worksheets("sheet1").Range("A2:A20").Row

Với giá trị này, dù cho từ A2 đến A10000000 đi chăng nữa nó vẫn chỉ là bằng 2 mà thôi, với Row nó chỉ lấy dòng đầu tiên.

Vậy thì ta đặt biến cho nó thay vì .Row thì ta thay bằng .Rows.Count tức tổng số hàng mà nó đếm được trong vùng tham chiếu.

2) Sau khi tạo mảng 1 chiều rồi thì không cần thêm 1 vòng lặp nữa (tuy không sai nhưng hao tốn thời gian và dung lượng bộ nhớ), chỉ chọn vùng tương ứng bằng mảng là được.


Sau đây là code tôi đã chỉnh sửa lại cho bạn:

Mã:
Sub Chuyen1()
    Dim n As Long, m As Long, mang() As Long, ran1 As Range
    n = Worksheets("sheet1").Range("A2:A20").Rows.Count
    ReDim mang(1 To n)
    For Each ran1 In Worksheets("sheet1").Range("A2:A20")
        m = m + 1
        mang(m) = ran1.Value
    Next
    Worksheets("sheet1").Range("C2:U2") = mang
End Sub

Ngoài ra còn một cách nữa, tôi nghĩ là tốc độ hơn những thủ tục trước là dùng mảng để thực hiện:

Mã:
Sub Chuyen4()
    Dim i As Long, u As Long, mang1, mang2
    'mang2 nhan gia tri tu sheet, luon la mang 2 chieu
    'va index luon bat dau tu 1:
    mang2 = Worksheets("sheet1").Range("A2:A20")
    'lay index cua dong cuoi cung:
    u = UBound(mang2)
    'khai bao lai cho bien mang1 (1 chieu)
    ReDim mang1(1 To u)
    'mang1 nhan gia tri tu mang2:
    For i = 1 To u
        mang1(i) = mang2(i, 1)
    Next
    'gan gia tri tu mang1 vao sheet:
    Worksheets("sheet1").Range("C2").Resize(, u) = mang1
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thank ban nhé. Vậy từ giờ gặp phải bài toán copy mình có thể tự làm được rùi. cho mình hởi thêm là :
Sự khác nhau giữa "commandbutton" và "button" hay là 2 cái đó giống nhau?
 
Upvote 0
Thank ban nhé. Vậy từ giờ gặp phải bài toán copy mình có thể tự làm được rùi. cho mình hởi thêm là :
Sự khác nhau giữa "commandbutton" và "button" hay là 2 cái đó giống nhau?

2 cái Button này hoàn toàn khác nhau về bản chất.

1) Button là controls thuộc Form Controls, đây là một dạng Shape sau khi insert thì phải Assign Macro thì chúng mới thực hiện được lệnh sau khi click vào.

2) CommandButton là controls thuộc ActiveX Controls, đây là controls có đầy đủ sự kiện của một Button và chỉ hoạt động khi ta viết thủ tục cho sự kiện đó để khi ta kích hoạt sự kiện nào thì chúng sẽ thực thi sự kiện đó.
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    28.3 KB · Đọc: 32
Upvote 0
Web KT

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

Back
Top Bottom