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 ! @_@
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!
Cảm ơn Bạn đã cho ý kiế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?
Sub Macro1()
Range("C5:F16").Copy
Range("G5:J16").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
[COLOR=#0000ff][B]Macro2[/B][/COLOR]
End Sub
Sub Macro2()
Range("C5:F5").EntireColumn.Hidden = True
End Sub
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.
[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]
Bạn sửa toàn bộ code thành vầy nhé:
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...
=
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 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)
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
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
ThisWorkbook.Path & "\Test.txt"
(Run "Macro2")
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)
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ácCả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!
Cảm ơn Thầy,Em sẽ tìm hiểu vấn đề trên sau.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}")?
Sub Chuyen2()
'Dung ham hoan vi:
With Worksheets("sheet1")
.Range("C2:U2") = WorksheetFunction.Transpose(.Range("A2:A20"))
End With
End Sub
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
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
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
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?