Các hàm macro4 hay

Liên hệ QC

kelvin

Thành viên thường trực
Tham gia
24/6/06
Bài viết
202
Được thích
184
Nghề nghiệp
Tư vấn xây dựng, kinh doanh in ấn
Tôi muốn giới thiệu với các bạn một số các hàm macro4 mà nếu viết sang VBA sẽ rất dài, bản thân macro4 đã
được biên dịch sang mã máy nên sẽ chạy nhanh hơn là dùng code VBA.Nếu bạn biết về VB6 thì cứ nghĩ nó là 1 dll ( chính xác là xll)
 
Thật sự, nếu không vì một ly do đặc biệt nào đó, tôi nghĩ các bạn khg nên đọc macro4, vì nó đã quá cũ rồi.
Nhưng tôi đã đọc đựơc ở đâu đó là .Net framword có các hàm tạo sẳn để lập trình viên dể lấy ra, như API. Nếu suy nghĩ về macro 4 như các hàm thư viện dành cho dân lập trình thì bạn cũng nên biết là các hàm macro 4 được phân loại như sau:
1/ Kiến tạo: tạo menu bar…
2/ Kiểm soát chương trình
3/ Trao đổi dử liệu động ( DDE)
4/ Trả về thông tin
5/Tham chiếu và tìm kiếm
6/ Tương đương lệnh
7/ Thống kê
 
Bạn có biết 1 điều là từ macro sheet ta có thể gọi các Sub trong VBE,mặc dù VBE được tạo ra sau macro sheet
 
Có bạn nào có thể trong VBE, VBA chống lệnh chạy step VBA không?

Trong macro4 có lệnh GET.WORKSPACE(31) RETURN TRUE NẾU chạy từng bước, ngược lại thì trả về false.Nếu trong VBE bạn gọi lệnh macro nầy và “ if TRUE GO TO END ?” (có thể cú pháp sai), chỉ mới là y tưởng
 
Đúng vậy Macrosheet4 được tại trong thư viện *.XLL, đây là một dạng Add-Ins được biên dịch thành mã máy nên tốc độ xử lý rất nhanh.
Hiện nay phần đông mọi người tạo Add-Ins dạng *.xla. Cách tạo này thì dễ dàng nhưng đội lại thì tốc độ chậm, bộ nhớ Excel bị chiến dụng nhiều, tính bảo mật không cao. Cách tạo Add-Ins đúng theo nghĩa "Nhà phát triển" thì tạo ra *.XLL, loại file này chúng ta phải lập trình trên ngôn ngữ Visual C++, include các file XLcall32.DLL, XLcall32.h . Tôi đã có lần thử viết nhưng chỉ để cho biết thôi vì khoai quá. Dễ làm hơn bạn dùng Delphi viết ra các DLL rồi gọi theo cách của gọi giống như API của Windows (Delphi có ngôn ngữ của Pascal nên dễ làm và học).
 
Tình cờ lang thang trên mạng, thấy có đoạn code này có dùng macro4 nên up lên để các bạn xem thử:
Mã:
'-------------
'The information in this article applies to:
'
'Microsoft Excel 2000 and later. 
'External reference(s): 
'Microsoft Scripting Runtime. 
'
'--------------------------------------------------------------------------------
'Task 
 ' Calculate the average of values in the same ranges from several closed 'workbooks and write the values to the active sheet.

'In the example it's assumed that the sheetnames are similar to the filenames and therefore the sheetnames can be extracted from the filenames.   
Code 
  Option Explicit 
Sub Calculate_Get_Values_Closed_Workbooks() 
  Dim fsoObj As Scripting.FileSystemObject 
  Dim fsoFolder As Scripting.Folder 
  Dim fsoFile As Scripting.File 
  Dim stPath As String 
  Dim i As Long, j As Long 
  Dim vaFiles As Variant, vaSheets As Variant 
  With Application 
    .EnableEvents = False 
    .ScreenUpdating = False 
  End With 
  'The path to the target folder. 
  stPath = "C:\Test\" 
  Set fsoObj = New Scripting.FileSystemObject 
  Set fsoFolder = fsoObj.GetFolder(stPath) 
  'Iterate through the collection of files and 
  'write the file- and the sheetnames to the active sheet. 
  For Each fsoFile In fsoFolder.Files 
    With ActiveSheet 
      .Range("A" & i + 1).Value = fsoFile.Name 
      .Range("B" & i + 1).Value = Left(fsoFile.Name, (Len(fsoFile.Name) - 4)) 
    End With 
    i = i + 1 
  Next fsoFile 
  'Populate the two arrays. 
  With ActiveSheet 
    vaFiles = .Range(.Range("A1"), .Range("A65536").End(xlUp)).Value 
    vaSheets = .Range(.Range("B1"), .Range("B65536").End(xlUp)).Value 
  End With 
  'Iterate through the two arrays of files and sheets and 
  'calculate the average and write the values to the active sheet. 
  For j = 1 To UBound(vaFiles) 
    ActiveSheet.Range("C" & j).Value = _ 
            Application.ExecuteExcel4Macro( _ 
            "AVERAGE('" & stPath & "[" & vaFiles(i, 1) & "]" & vaSheets(i, 1) & "'!R1C5:R60C5)") 
  Next 
  With Application 
    .EnableEvents = False 
    .ScreenUpdating = True 
  End With 
  'Release objects from memory. 
  Set fsoFile = Nothing 
  Set fsoFolder = Nothing 
End Sub 
'Comments 
'  By using the above approach it's possible to use several of the built-in 'functions MS Excel provides including LOOKUP-functions. The technique itself, 'i e using Application.ExecuteExcel4Macro, is both fast and reliable. A small 'note is that it may be difficult to get the required string-expression correct 'the first time.

'The approach can be a good alternative to the ADO & SQL-based approach.
'------------------------
còn vài code nửa, nhưng khg dùng macro4, các bạn vào http://www.excelkb.com/default.aspx?cNode=8M3M1M xem tiếp nha
 
Chỉnh sửa lần cuối bởi điều hành viên:
Vài tựa ở web trên để các bạn thấy thích hợp thì vào xem thử:
Get the sheetnames from closed workbooks.htm
Update records in a closed workbook.htm
Create lists of unique items from several worksheet with SQL.htm
Create & Read XML-files in Excel.htm
Retrieve data from open workbooks.htm
Insert data in a worksheet from closed workbooks.htm
Calculate and get values from several closed workbooks.htm
Add data to closed workbooks.htm
Retrieve data from several closed workbooks.htm
excel database.htm
 
tại JKP Application Development Services có version mới của Names Manager ,tôi mới đọc sơ qua thì có bổ sung chức năng chỉnh sửa tên (Names).

Ngoài ra còn có sách trắng về Names, có phần nói về macro4. Phần sau là list các đề mục
----------------------
Contents
Introduction

How To Define Range Names

How To Use Range Names

Absolute And Relative Addressing

The Context Of Names

Special Names

A Step Further: A Formula In A Defined Name

Dynamic Names

Another Step Further: XL4 Macro Functions In Names

Passing Arguments To A Defined Name Formula

Bugs in Excel's Name Object

Conclusion
 
Chào các bạn,
Các bạn tham khảo file về Macro 4

Lê Văn Duyệt
Source from Kelvin
 

File đính kèm

  • MACRO4.0.RAR
    618.7 KB · Đọc: 5,210
VBA.INSERT.FILE(filename_text) chèn 1 tập tin dạng văn bản có chứa chương trình theo dạng VBA của Excel mà ta muốn chèn vào trong module VBA
QUERY.GET.DATA...() GIỐNG Data\Get External Data
QUERY.REFRESH Cập nhật dữ liẹu được trả về bởi công cụ Microsoft QueRy
REGISTER("SAMPLE.DLL", "MyFunction", "AIC") Declare Function MyFunction Lib "SAMPLE.DLL" _
(ByVal a As Integer, ByVal s As String) As Boolean
GET.CELL(47) ExecuteExcel4Macro("GET.CELL(47)")
Returns whether a cell contains a sound note. Visual Basic has no direct equivalent.

GET.DOCUMENT(1) If ActiveWorkbook.Sheets.Count = 1 Then
' Get bookname, strip off extension (if any)
bookName = ActiveWorkbook.Name
For i = Len(bookName) To 1 Step -1
If Mid(bookName, i, 1) = "." Then


End If
Next
x = StrComp(bookName, ActiveSheet.Name, 1)
If x <> 0 Then Goto BuildLongName
result = ActiveWorkbook.Name
Else
BuildLongName:
result = "[" & ActiveWorkbook.Name & _
] & ActiveSheet.Name
End If
GET.DOCUMENT(45) ExecuteExcel4Macro("GET.DOCUMENT(45)")
Indicates whether the windows of the current document are synchronized. Visual Basic has no equivalent because Microsoft Excel 5.0 supports synchronized windows for macro compatability only.
RUN(reference, step) Application.Run macro := Range(reference)
SQL.BIND
SQL.CLOSE
SQL.ERROR
SQL.EXEC.QUERY
SQL.GET.SCHEMA
SQL.OPEN
SQL.RETRIEVE
SQL.RETRIEVE.TO.FILE

Mấy cái SQL mình thấy khá hấp dẩn đấy,dù sao cũng của Microsoft thì nó cũng ổn định hơn
 
Macro 4 ra đời trước,nhưng nó vẫn có thể gọi các Sub của VBA ( tôi thử với Excel 2003). trích sách thôi
dĩ nhiên gọi được function VBA, dll.
 

File đính kèm

  • CallVBAFromMacroSheet.zip
    5.3 KB · Đọc: 412
Để chống run step in VBA ( bản thân VBA hơi bị khó khi viết code nầy), macro 4 có hàm sau:
=GET.WORKSPACE(31)

Có thể tham khảo đoạn code sau của 1 tác giả ở An Giang viết bằng macro4, xào nấu lại 1 chút là có thể dùng trong VBA
=IF(GET.WORKSPACE(31),GOTO($M$7)) M7 là bẩy lỗi để thoát/làm gì đó chương trình

M7:=WHILE(TRUE)

=IF(GET.WORKSPACE(31);GOTO($M$7))
=IF(GET.WORKSPACE(31);GOTO($M$7))
=QUIT()
=IF(GET.WORKSPACE(31);GOTO($M$7))
=IF(GET.WORKSPACE(31);GOTO($M$7))
=IF(GET.WORKSPACE(31);GOTO($M$7))
=NEXT()
=END.IF()
=HALT()
 
Cú pháp của việc xóa 1 file, tôi thấy đọc có vẻ dể hiểu
=FILE.DELETE("d:\PTC\FileSeBiXoa.xls")
=RETURN()
 
Web KT
Back
Top Bottom