VBA HTA

tuhocvba

Administrator
Thành viên BQT
Trước hết, phải nói là mình chưa có nhiều kiến thức về Hta. Các bài về hta bằng tiếng nhật cũng rất ít. Hầu hết là tiếng anh. Cho nên nếu ai rành tiếng anh, thì tìm hiểu và chia sẻ thêm trong topic này nhé. Mong BTV @vothanhthu tìm hiểu và chia sẻ thêm.

1. Hta để làm gì?
Nó hoạt động tương tự VBA Excel. Trước kia, nếu cần lấy ý kiến nhân viên, thì thường thấy người ta tạo một file Excel VBA rồi gửi cho mọi người. Mọi người điền ý kiến vào đó và ấn nút. Dữ liệu sẽ được chuyển tự động tới nơi thu thập dữ liệu của mọi người.
Tuy nhiên, một lần mình thấy người ta gửi tới file hta. Và thế là mình rất bất ngờ vì nó hoạt động y hệt như VBA excel.

2. Hta là gì?
Đây là một định dạng của html. Vì vậy, bạn có thể tùy ý thiết kế giao diện cho đẹp theo ý mình, cái này thì mọi người biết rồi, html mà tùy biến giao diện thì chắc chắn mạnh hơn Userform của VBA. Tạm thời thế đã, vì mình cũng chưa tìm hiểu sâu.

3. Chương trình hta đơn giản nhé:
Mã:
<html>
<head>
<HTA:APPLICATION ID="HelloExample" BORDER="thin" BORDERSTYLE="complex" maximizeButton="yes" minimizeButton="yes" />
<script type="text/vbscript">
  Sub Hello()
    MsgBox "Hello"
  End Sub
</script>
<title>AnalystCave: HTA Hello World!</title>
</head>
<body>
<table width="100%">
    <tr>
        <td>
            <!--Your content here!-->
            <H1>Hello World!</H1>
            <input type="Button" onClick="Hello()" value="Hello" />
        </td>
    </tr>
</table>
</body>
</html>
Mọi người chú ý dòng code 4 tới 8. Đây chính là đoạn code VBA đấy ạ. Mọi người copy code trên cho vào Note pad, và lưu lại là tuhocvba.hta nhé.
Bạn cần đăng nhập để thấy đính kèm


Đấy, nhìn vào mới thấy hta còn có ưu điểm là dung lượng file nhẹ hơn hẳn so với file excel.
Bây giờ click vào để mở ra xem sao nhé.
Bạn cần đăng nhập để thấy đính kèm

Mình mở ra và ấn vào nút Hello thì hiện ra msgbox đó.

4. Lấy dữ liệu từ file excel.
Bây giờ mình tạo một file excel để trong cùng thư mục nhé.
Bạn cần đăng nhập để thấy đính kèm

File excel có nội dung như sau:
Bạn cần đăng nhập để thấy đính kèm


Lại một lần nữa, các bạn thấy lợi điểm của file hta rồi đấy, nhẹ có 1Kb. Trong khi file excel chẳng có gì mấy cũng đã 10Kb.
Bây giờ mình sửa đoạn code VBA trong file hta đi nhé, thay bằng code sau:
Mã:
<script type="text/vbscript">
  Sub Hello()
    Set objShell = CreateObject("WScript.Shell")
    myCur = objShell.CurrentDirectory
    dim excelApp, excelWb, excelVal
    set excelApp = CreateObject("Excel.Application")
    set excelWb = excelApp.Workbooks.Open(myCur & "\Test.xlsx")
    excelVal = excelWb.Worksheets(1).Range("A1").Value
    excelWb.Close
    excelApp.Quit
    MsgBox excelVal
  End Sub
  Sub ExitForm()
    Close
  End Sub
</script>
HIện tại đang xảy ra lỗi, không hoạt động, chưa hiểu tại sao. //Win 7, Office 2013.
Nguồn:
 
V

vothanhthu

Guest
HTML + VBA ra HTA. Cái này lạ quá, Thứ chưa biết đến luôn. Qua vd Thứ thấy nó giống ngôn ngữ VB hơn là VBA. Thú vị, Thứ sẽ thử tìm hiểu ..!
 

Euler

Mod
Thành viên BQT
HTML + VBA ra HTA. Cái này lạ quá, Thứ chưa biết đến luôn. Qua vd Thứ thấy nó giống ngôn ngữ VB hơn là VBA. Thú vị, Thứ sẽ thử tìm hiểu ..!
Cái này thì chỉ còn trông đợi vào @vothanhthu , thành viên quản trị duy nhất thông thạo tiếng anh hiện nay.
Cái HTA này có ưu điểm là nhẹ, thiết kế giao diện đẹp mắt. Ngoài ra còn ưu điểm nào nữa không thì chỉ còn chờ đợi các bài viết tiếp theo.
Như VBA nếu bảo lăn chuột giữa trên UserForm là cả đoạn code dài lê thê, chứ HTA thì thoải mái. Mình cũng đã gặp vài lần, nhưng tài liệu tìm hiểu bằng tiếng nhật khá ít ỏi.
 
V

vothanhthu

Guest
Tiếp nối chủ đề
1. Khái quát đôi chút
Đầu tiên, Thứ muốn chúng ta cần phân biệt ngôn ngữ VB, VBS và VBA.
- VB (Visual Bacsic): là ngôn ngữ lập trình cơ bản, là cái noi của mọi ngôn ngữ có chữ VB.
- VBA (Visual Bacsic for Application): Đây là ngôn ngữ dựa trên ngôn ngữ VB nhưng được tích hợp vào các chương trình riêng. Chủ yếu là của chương trình Microsoft Office (Excel, Word, Access...). phạm vi của ngôn ngữ chỉ dùng được trong chương trình mà chúng tích hợp. Thứ ví dụ, nếu bạn viết code VBA trong file A.xlsb, sau đó bạn gỡ bỏ Excel khỏi máy tính, file A.xlsb của bạn cũng sẽ chẳng bao giờ mở lên được nữa nếu không cái lại Excel.
- VBS (Visual Bacsic Script): được sử dụng chủ yếu trong môi trường Web

Cả 3 ngôn ngữ điều rất giống nhau về mặt cấu trúc, biết ngôn ngữ này chắc chắn sẽ hiểu ngôn ngữ kia, chỉ khác ở các đối tượng mà chúng tích hợp.

Thứ giải thích vậy để chúng ta hiểu rằng. Khi lập trình HTA với kiến thức VBA, chúng ta phải hiểu là chúng ta đang lập trình với ngôn ngữ VBS chứ không phải thuần VBA. Các đối tượng khai báo sẽ có đôi chút sự khác biệt.

Khi lập trình HTA có dùng mã VBS, chúng ta hiểu đơn giản là giao diện chúng ta sẽ kế thừa từ mã HTML, nhưng các chức năng xử lý sẽ được thực hiện thông qua mã VBS. Do đó, các bạn phải hiểu mã HTML trước khi tìm hiểu đến HTA
2. Khai báo đối tượng Excel khi muốn tương tác
Không giống như lập trình VBA trực tiếp trong Excel, khi lập trình HTA chúng ta đang lập trình ở trên nền là HTML, chúng ta cần phải khai báo cụ thể là chúng ta đang muốn lập trình cho Excel khi muốn tương tác với chúng.

Xét trực tiếp ví dụ tại #1, chúng ta thấy được rằng, mỗi khi bắt đầu thủ tục chúng ta cần khai báo như sau:
Mã:
Dim excelApp
Set excelApp = CreateObject("Excel.Application")
sau đó là mở file Excel này lên bằng lệnh
Mã:
Dim excelWb
set excelWb = excelApp.Workbooks.Open("Địa chỉ file Excel") 'Lấy địa chỉ file Excel cho vào
Đây là việc chúng ta bắt buộc phải làm khi tương tác với các đối tượng trong Excel. Và mỗi khi chúng ta tiến hành tương tác với một đối tượng nào đó trong Excel, chúng ta BẮT BUỘC phải thêm hàm excelApp này vào, để chương trình hiểu chúng ta đang muốn lấy đối tượng là Excel. Ví dụ
Mã:
excelVal = excelApp.Worksheets(1).Range("A1").Value
3. Vị trí đặt code VBA trong HTA
Các code VBA sẽ được đặt trong 2 lệnh
Mã:
<script ..... </script>
Khi cần gọi đến các thủ tục, các thủ tục sẽ được gọi đến thông qua onclick nếu là button.
 

bvtvba

Thành viên tích cực
Mình xin đưa ra một ví dụ nữa:
Ở ví dụ này, người dùng sẽ nhập thông tin làm thêm trên file hta, sau đó ấn nút, file hta sẽ gửi thông tin tới một file excel trên sever.
Các bạn có thể mô phỏng bằng một file excel trên máy tính của các bạn và sửa lại đường link file trong code.
Chú ý file excel cần có dòng tiêu đề đặt ở dòng 3 trở đi (có thể là dòng 4, dòng 5). Dòng tiêu đề bạn ghi là gì cũng được.
Bạn cần đăng nhập để thấy hình ảnh

Bạn cần đăng nhập để thấy hình ảnh

Ví dụ ở đây mình tạo file excel có dòng tiêu đề là dòng 3. Mình ghi toàn là A.
Bạn cần đăng nhập để thấy hình ảnh

Các bạn copy code dưới đây cho vào Notepad và lưu thành tuhocvba.hta nhé. (Tên là gì cũng được nhưng phải có đuôi là .hta)
Mã:
<html>
    <head>
        <title>tuhocvba.net</title>
        <script language="VBScript">
            Sub ghide_onclick
                On Error Resume Next
                Set objwsh = CreateObject("WScript.Shell")
                Set objxls = CreateObject("Excel.Application")
                myFile = "C:\Users\user\Desktop\h.xlsx"
                Set objbok = objxls.Workbooks.Open(myFile)
               
                With objbok.Worksheets(1)
                    If objbok is Nothing Then
                        MsgBox myFile & vbCrLf & "Khong mo duoc file Excel dang ky lam them" & vbCrLf & "Hay kiem tra duong dan file", vbCritical
                        Set objxls = Nothing
                        Set objwsh = Nothing
                        Exit Sub
                    End If
                   
                    If objbok.readonly Then
                        MsgBox myFile & vbCrLf & "File dang ky lam them dang duoc nguoi khac su dung." & vbCrLf & "Hay cho dang ky vao khoang thoi gian khac", vbExclamation
                        objbok.Application.DisplayAlerts = False
                        objbok.Close
                        objxls.Application.Quit
                        Set objbok = Nothing
                        Set objxls = Nothing
                        Set objwsh = Nothing
                        Exit Sub
                    End If
                   
                    For i=3 To 65536
                        If .Cells(i, 1)="" Then
                            Exit For
                        End If
                    Next
                   
                    For j=6 To 8
                        .Cells(i, j).NumberFormatLocal="hh:mm"
                    Next
                   
                    .Cells(i, 1).Value = i - 3
                    .Cells(i, 2).Value = f.tuhocvbadotnet1.Value
                    .Cells(i, 3).Value = f.tuhocvbadotnet2.Value
                    .Cells(i, 4).Value = f.tuhocvbadotnet3.Value
                    .Cells(i, 5).Value = f.tuhocvbadotnet4.Value
                    .Cells(i, 6).Value = f.tuhocvbadotnet5.Value
                    .Cells(i, 7).Value = f.tuhocvbadotnet6.Value
                .Cells(i, 8).Value = f.tuhocvbadotnet7.Value
               
                For j=9 To 10
                        .Cells(i, j).NumberFormatLocal="0.0"
                    Next
                   
                    .Cells(i, 9).Value = f.tuhocvbadotnet8.Value
                .Cells(i, 10).Value = f.tuhocvbadotnet9.Value
                                             
                For j=11 To 13
                        .Cells(i, j).NumberFormatLocal="@"
                    Next
                   
                    .Cells(i,11).Value = f.tuhocvbadotnet10.Value
                    .Cells(i,12).Value = f.tuhocvbadotnet11.Value
                .Cells(i,13).Value = f.thvba_rad12.Value
                                   
                    For j=0 To 4
                        If f.thvba_rad13(j).checked Then .Cells(i,13).Value = f.thvba_rad13(j).Value
                    Next
                   
                    .Cells(i,18).Value = Now
                    Set objNetwork = CreateObject("WScript.Network")
                    .Cells(i,19).Value= objNetwork.ComputerName
                    .Cells(i,20).Value= objNetwork.UserName
                    .Cells.EntireColumn.AuToFit
                    objbok.Application.DisplayAlerts = False
                    objbok.Save
                    objxls.Application.Quit
                    Set objNetWork = Nothing
                    Set objbok = Nothing
                    Set objxls = Nothing
                    Set objwsh = Nothing
                End With
                MsgBox "Da dang ky thong tin", vbInFormation
            End Sub
        </script>
    </head>
   
    <body bgcolor="#ADFF2F">
        <center>
            <h2><font color="#008000">Dang ky lam them</font></h2>
            <Form name="f">
                <table>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#FF0000">Hay nhap cac noi dung duoi day<br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q1.&nbsp;&nbsp;Nhap ngay lam them yyyy/m/d</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input id="today" type="text" size="50" name="tuhocvbadotnet1" Value="" ><br><br></td>
                        <script type="text/javascript">
                        <!--
                        var now = new Date () ;
                        var year = now .getFullYear () ;
                        var month = now .getMonth () + 1 ;
                        var date = now .getDate () ;
                        var YYYY_M_D = year.toString() + '/' + month.toString() + '/' + date.toString() ;
                        document.getElementById ('today').value = YYYY_M_D ;
                        YYYY_M_D = null
                        date = null
                        month = null
                        year = null
                        now = null
                        // -->
                        </script>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q2.&nbsp;&nbsp;Ma Nhan Vien</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet2" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q3.&nbsp;&nbsp;Ho Ten</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet3" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q4.&nbsp;&nbsp;Bo Phan</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<select name="tuhocvbadotnet4">
                        <option Value=" " selected><font color="#000000">&nbsp; &nbsp;</font>
                        <option Value="THVBA1"><font color="#000000">&nbsp;THVBA1&nbsp;</font>
                        <option Value="THVBA2"><font color="#000000">&nbsp;THVBA2&nbsp;</font></select><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q5.&nbsp;&nbsp;Nhap thoi gian bat dau den cong ty lam viec hh:mm</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet5" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q6.&nbsp;&nbsp;Nhap thoi gian bat dau lam them hh:mm</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet6" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q7.&nbsp;&nbsp;Thoi gian lam them ket thuc vao luc nao hh:mm</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet7" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q8.&nbsp;&nbsp;Nhap so gio lam them h.h </font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet8" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q9.&nbsp;&nbsp;Nhap so gio lam them trong thang tinh toi thoi diem hien tai h.h</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet9" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q10.&nbsp;&nbsp;Ly do lam them</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet10" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q11.&nbsp;&nbsp;Noi dung cong viec lam them</font></p></td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" size="50" name="tuhocvbadotnet11" Value="" ><br><br></td>
                    </tr>
                    <tr>
                        <td><p><font color="#0000FF">Q12.&nbsp;&nbsp;Phan loai ly do phai lam them la gi</font></p></td>
                    </tr>
                    <tr>
                        <td>
                            &nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="thvba_rad13" Value="Phat sinh cong viec" checked><font color="#000000">&nbsp;Phat sinh cong viec</font><br>
                            &nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="thvba_rad13" Value="Tien do cong viec bi cham"><font color="#000000">&nbsp;Tien do cong viec bi cham</font><br>
                            &nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="thvba_rad13" Value="Cuoc hop sau gio ve"><font color="#000000">&nbsp;Cuoc hop sau gio ve</font><br>
                            &nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="thvba_rad13" Value="Theo ke hoach"><font color="#000000">&nbsp;Theo ke hoach</font><br>
                            &nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="thvba_rad13" Value="Fix loi cong viec"><font color="#000000">&nbsp;Fix loi cong viec</font><br><br>
                        </td>
                    </tr>
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#FF0000">Dang ky noi dung nay<br>&nbsp;&nbsp;&nbsp;&nbsp;Neu thay doi hay thuc hien dang ky lai<br>&nbsp;&nbsp;&nbsp;&nbsp;Tuyet doi khong thuc hien chinh sua truc tiep trong file Excel dang ky lam them<br><br></td>
                    </tr>
                   
                    <tr>
                        <td align="middle"><p><input type="butTon" name="ghide" Value="Ket thuc">&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" Value="Clear"></p></td>
                    </tr>
                </table>
            </Form>
        </center>
    </body>
</html>
Nhớ sửa lại đường link file ở dòng code số 9 nhé.
Các bạn thấy đấy, vì thiết kế trên html cho nên giao diện tùy ý, bạn muốn gõ tiếng việt có dấu cũng được, rất thuận tiện. Ở đây mình lười nên để là tiếng việt không dấu, các bạn tùy ý sửa nhé.
 
Top