Mong trợ giúp tạo Form bằng VBA trong Word

Liên hệ QC

dpsangcva

Thành viên mới
Tham gia
9/11/07
Bài viết
45
Được thích
26
Xin chào mọi người!
Mình chỉ biết được 1 chút VBA trong Word nhờ record macro rồi tự học.
Nay muốn biết cách tạo Form chứa 1 số Combo Box chứa dữ liệu phụ thuộc nhau, lấy từ Table có sẵn trên 1 File Word, cụ thể như sau:
Ở File đính kèm mình có 1 Table gồm 3 cột (Lớp, Môn, Chương)
Mình muốn tạo 1 Form chứa 3 Combo Box (Lớp, Môn, Chương)
+ Khi chọn Lớp ở Combo-Lớp, thì Combo-Môn thay đổi tương ứng từng Value ở Lớp
+ Tương tự khi Value của Combo-Môn thay đổi thì List Chương ở Combo-chương thay đổi theo.
-------------
Mong được mọi người giúp đở soạn giúp mình một Form như thế (lấy nguồn từ file mình gửi) để mình được học hỏi
Xin chân thành cảm ơn!
 

File đính kèm

  • Lam sao tao Form (VBA) chua combo box loc du lieu lay tu Table cua 1 file word.docx
    11.4 KB · Đọc: 41
Xin chào mọi người!
Mình chỉ biết được 1 chút VBA trong Word nhờ record macro rồi tự học.
Nay muốn biết cách tạo Form chứa 1 số Combo Box chứa dữ liệu phụ thuộc nhau, lấy từ Table có sẵn trên 1 File Word, cụ thể như sau:
Ở File đính kèm mình có 1 Table gồm 3 cột (Lớp, Môn, Chương)
Mình muốn tạo 1 Form chứa 3 Combo Box (Lớp, Môn, Chương)
+ Khi chọn Lớp ở Combo-Lớp, thì Combo-Môn thay đổi tương ứng từng Value ở Lớp
+ Tương tự khi Value của Combo-Môn thay đổi thì List Chương ở Combo-chương thay đổi theo.
-------------
Mong được mọi người giúp đở soạn giúp mình một Form như thế (lấy nguồn từ file mình gửi) để mình được học hỏi
Xin chân thành cảm ơn!
Góp ý cho bạn:
Chưa rõ mục đích của bạn là gì? Nhưng tôi thấy cái mẫu File Word giống y chang như trong Excel thì bạn nên dùng Excel thì sẽ thuận tiện hơn nhiều, sau đó bạn muốn xuất sang Word hay sang PDF hay cái gì nữa thì tùy ý.......
 
Góp ý cho bạn:
Chưa rõ mục đích của bạn là gì? Nhưng tôi thấy cái mẫu File Word giống y chang như trong Excel thì bạn nên dùng Excel thì sẽ thuận tiện hơn nhiều, sau đó bạn muốn xuất sang Word hay sang PDF hay cái gì nữa thì tùy ý.......
Cảm ơn bạn đã góp ý.
Thật ra mình mới học VBA, mà bắt đầu từ word, trước giờ rất thích xài Excel nhưng chỉ dừng lại ở trang bảng tính thôi. Việc đó chỉ cần trên trang bảng tính Excel mình có thể giải quyết được không cần thiết VBA gì cả.
Tuy nhiên, mình lại có việc cần nó bên Word để xử lý (tự động) cho việc khác.
Rất muốn học được cách làm User Form như vậy (bên Word).
Nếu được mong các bạn chỉ giúp hoặc chỉ điểm cao nhân nào giúp với ạ.
Thanks!
 
Lần chỉnh sửa cuối:
Cảm ơn bạn đã góp ý.
Thật ra mình mới học VBA, mà bắt đầu từ word, trước giờ rất thích xài Excel nhưng chỉ dừng lại ở trang bảng tính thôi. Việc đó chỉ cần trên trang bảng tính Excel mình có thể giải quyết được không cần thiết VBA gì cả.
Tuy nhiên, mình lại có việc cần nó bên Word để xử lý (tự động) cho việc khác.
Rất muốn học được cách làm User Form như vậy (bên Word).
Nếu được mong các bạn chỉ giúp hoặc chỉ điểm cao nhân nào giúp với ạ.
Thanks!
Tôi nói thẳng với bạn như thế này:
Nếu muốn làm Combo phụ thuộc như yêu cầu của bạn (trên Excel làm dễ dàng mà còn muốn sặt gạch), chứ đừng nói làm trên Word.
.........................................
Mình muốn tạo 1 Form chứa 3 Combo Box (Lớp, Môn, Chương)
+ Khi chọn Lớp ở Combo-Lớp, thì Combo-Môn thay đổi tương ứng từng Value ở Lớp
+ Tương tự khi Value của Combo-Môn thay đổi thì List Chương ở Combo-chương thay đổi theo.
........................................
Còn muốn làm User Form trên Word cũng được nhưng không phổ biến nên không ai muốn nghiên cứu ba cái vụ này, trên diễn đàn GPE chỉ có bạn là người đầu tiên muốn làm đó.
 
Tôi nói thẳng với bạn như thế này:
Nếu muốn làm Combo phụ thuộc như yêu cầu của bạn (trên Excel làm dễ dàng mà còn muốn sặt gạch), chứ đừng nói làm trên Word.

Còn muốn làm User Form trên Word cũng được nhưng không phổ biến nên không ai muốn nghiên cứu ba cái vụ này, trên diễn đàn GPE chỉ có bạn là người đầu tiên muốn làm đó.
Nếu vậy bạn giúp mình với nha.
Mình mượn nó để xử lý thêm mã tự động cho tài liệu bên Word. Dùng Excel mà can thiệp tự động cho Word chắc là không phù hợp bằng rồi, với lại lúc thì đọc nội dung bên Word, lúc nhảy qua Excel bật Form lấy thông tin, rồi lại nhảy trở lại Word, nó rối lắm bạn à.
Thành thật cảm ơn bạn rất nhiều!
 
Nếu vậy bạn giúp mình với nha.
Mình mượn nó để xử lý thêm mã tự động cho tài liệu bên Word. Dùng Excel mà can thiệp tự động cho Word chắc là không phù hợp bằng rồi, với lại lúc thì đọc nội dung bên Word, lúc nhảy qua Excel bật Form lấy thông tin, rồi lại nhảy trở lại Word, nó rối lắm bạn à.
Thành thật cảm ơn bạn rất nhiều!
Nếu vậy thì bạn có thể tìm hiểu về Mail Merge cho nhu cầu của bạn, trên diễn đàn cũng đã có bài viết hướng dẫn rồi (bạn tự tìm nhé).
 
Mình muốn tạo 1 Form chứa 3 Combo Box (Lớp, Môn, Chương)
+ Khi chọn Lớp ở Combo-Lớp, thì Combo-Môn thay đổi tương ứng từng Value ở Lớp
+ Tương tự khi Value của Combo-Môn thay đổi thì List Chương ở Combo-chương thay đổi theo.
Mở tập tin Word của bạn -> Alt + F11 -> menu Insert -> chọn UserForm -> Nếu chưa có thì hiện cửa sổ Properties bằng cách chọn menu View -> Properties Window
-> nếu chưa có (thường là khi Insert UserForm thì sẽ có) thì click trên UserForm -> View -> Tollbox.
-> từ ToolBox lấy và đặt trên UserForm 3 Label là Label1, Label2 và Label3 thứ tự từ trên xuống -> chọn Label1 -> nhấn và giữ phím Ctrl -> click lần lượt vào Label2 và Label3 -> trong cửa sổ Properties nhập Left vd. 12, Width vd. 50. Như thế bạn đã có 3 Label cùng độ dài và căn như nhau theo chiều ngang.

-> click trên khoảng trống UserForm -> click Label1 -> click Label1 (lần 2) -> xóa chữ Label1 và gõ Lớp. Tương tự đổi caption của Label2 và Label3 thành Môn và Chương.

Nếu cần thay thì chọn phông chữ và cỡ chữ trong cửa sổ Properties.

Bằng cách tương tự thêm 3 ComboBox bên cạnh 3 Label.

Chọn Insert -> Modele -> dán code sau vào Module1
Mã:
Option Explicit

Function prepare_list(ByVal table_index As Long, ByVal col As Long, ByVal lop As String, ByVal mon As String)
'    ham tra ve mang cac du lieu duy nhat lay tu bang table_index, tu cot col
'    table_index: chi so cua bang trong tap tin - tinh tu 1
'    col: chi so cot can lay du lieu - tinh tu 1
Dim r As Long, text As String, tabl As Table, dic As Object
    If col < 1 Or col > 3 Then Exit Function
    Set dic = CreateObject("Scripting.Dictionary")
    Set tabl = ThisDocument.Tables.Item(table_index)
    For r = 2 To tabl.Rows.Count
        text = Trim(Replace(Replace(Replace(tabl.Cell(r, 1).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
        If col > 1 Then
            If LCase(text) = LCase(lop) Then
                text = Trim(Replace(Replace(Replace(tabl.Cell(r, 2).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
                If col > 2 Then
                    If LCase(text) = LCase(mon) Then
                        text = Trim(Replace(Replace(Replace(tabl.Cell(r, 3).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
                    Else
                        text = ""
                    End If
                End If
            Else
                text = ""
            End If
        End If
        If text <> "" And Not dic.Exists(text) Then dic.Add text, 0
    Next r
    If dic.Count Then prepare_list = dic.keys()
   
    Set tabl = Nothing
    Set dic = Nothing
End Function

Phải chuột trên UserForm1 -> chọn View code -> dán code sau vào
Mã:
Option Explicit

Private Sub load_combo(ByVal cb_name As String, ByVal lop As String, ByVal mon As String)
Dim col As Long, list
    Select Case cb_name
        Case "ComboBox1": col = 1
        Case "ComboBox2": col = 2
        Case "ComboBox3": col = 3
    End Select
    If col > 0 Then
        list = prepare_list(1, col, lop, mon)
        If Not IsEmpty(list) Then Me.Controls(cb_name).list = list
    End If
End Sub

Private Sub ComboBox1_Change()
    ComboBox2.Clear
    ComboBox3.Clear
    load_combo "ComboBox2", ComboBox1.Value, ""
End Sub

Private Sub ComboBox2_Change()
    ComboBox3.Clear
    load_combo "ComboBox3", ComboBox1.Value, ComboBox2.Value
End Sub

Private Sub UserForm_Initialize()
    load_combo "ComboBox1", "", ""
End Sub

Đúp chuột vào ThisDocument và dán code sau
Mã:
Option Explicit

Private Sub Document_Open()
    UserForm1.Show
End Sub

Ví dụ tôi làm trong tập tin đính kèm.
 

File đính kèm

  • Lam sao tao Form (VBA) chua combo box loc du lieu lay tu Table cua 1 file word.rar
    23.4 KB · Đọc: 101
Làm 1 cái Data Form coi chơi (chứ tôi không thích ba cái vụ Form trên Word).Data_Form.PNG
 
Mở tập tin Word của bạn -> Alt + F11 -> menu Insert -> chọn UserForm -> Nếu chưa có thì hiện cửa sổ Properties bằng cách chọn menu View -> Properties Window
-> nếu chưa có (thường là khi Insert UserForm thì sẽ có) thì click trên UserForm -> View -> Tollbox.
-> từ ToolBox lấy và đặt trên UserForm 3 Label là Label1, Label2 và Label3 thứ tự từ trên xuống -> chọn Label1 -> nhấn và giữ phím Ctrl -> click lần lượt vào Label2 và Label3 -> trong cửa sổ Properties nhập Left vd. 12, Width vd. 50. Như thế bạn đã có 3 Label cùng độ dài và căn như nhau theo chiều ngang.

-> click trên khoảng trống UserForm -> click Label1 -> click Label1 (lần 2) -> xóa chữ Label1 và gõ Lớp. Tương tự đổi caption của Label2 và Label3 thành Môn và Chương.

Nếu cần thay thì chọn phông chữ và cỡ chữ trong cửa sổ Properties.

Bằng cách tương tự thêm 3 ComboBox bên cạnh 3 Label.

Chọn Insert -> Modele -> dán code sau vào Module1
Mã:
Option Explicit

Function prepare_list(ByVal table_index As Long, ByVal col As Long, ByVal lop As String, ByVal mon As String)
'    ham tra ve mang cac du lieu duy nhat lay tu bang table_index, tu cot col
'    table_index: chi so cua bang trong tap tin - tinh tu 1
'    col: chi so cot can lay du lieu - tinh tu 1
Dim r As Long, text As String, tabl As Table, dic As Object
    If col < 1 Or col > 3 Then Exit Function
    Set dic = CreateObject("Scripting.Dictionary")
    Set tabl = ThisDocument.Tables.Item(table_index)
    For r = 2 To tabl.Rows.Count
        text = Trim(Replace(Replace(Replace(tabl.Cell(r, 1).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
        If col > 1 Then
            If LCase(text) = LCase(lop) Then
                text = Trim(Replace(Replace(Replace(tabl.Cell(r, 2).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
                If col > 2 Then
                    If LCase(text) = LCase(mon) Then
                        text = Trim(Replace(Replace(Replace(tabl.Cell(r, 3).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
                    Else
                        text = ""
                    End If
                End If
            Else
                text = ""
            End If
        End If
        If text <> "" And Not dic.Exists(text) Then dic.Add text, 0
    Next r
    If dic.Count Then prepare_list = dic.keys()
  
    Set tabl = Nothing
    Set dic = Nothing
End Function

Phải chuột trên UserForm1 -> chọn View code -> dán code sau vào
Mã:
Option Explicit

Private Sub load_combo(ByVal cb_name As String, ByVal lop As String, ByVal mon As String)
Dim col As Long, list
    Select Case cb_name
        Case "ComboBox1": col = 1
        Case "ComboBox2": col = 2
        Case "ComboBox3": col = 3
    End Select
    If col > 0 Then
        list = prepare_list(1, col, lop, mon)
        If Not IsEmpty(list) Then Me.Controls(cb_name).list = list
    End If
End Sub

Private Sub ComboBox1_Change()
    ComboBox2.Clear
    ComboBox3.Clear
    load_combo "ComboBox2", ComboBox1.Value, ""
End Sub

Private Sub ComboBox2_Change()
    ComboBox3.Clear
    load_combo "ComboBox3", ComboBox1.Value, ComboBox2.Value
End Sub

Private Sub UserForm_Initialize()
    load_combo "ComboBox1", "", ""
End Sub

Đúp chuột vào ThisDocument và dán code sau
Mã:
Option Explicit

Private Sub Document_Open()
    UserForm1.Show
End Sub

Ví dụ tôi làm trong tập tin đính kèm.
Cảm ơn bạn nhiều nhiều lắm!
 
Nếu bạn thấy Data Form hay (Cảm ơn bạn rất rất nhiều ạ!) và đúng yêu cầu thì nên dùng, nên nhờ người ta hướng dẫn cụ thể.

Nhìn hình thấy đẹp đấy.

Có gì bạn cứ viết ở đây, không cần phải gửi tin riêng.
 

File đính kèm

  • 12.JPG
    12.JPG
    108.4 KB · Đọc: 59
Mở tập tin Word của bạn -> Alt + F11 -> menu Insert -> chọn UserForm -> Nếu chưa có thì hiện cửa sổ Properties bằng cách chọn menu View -> Properties Window
-> nếu chưa có (thường là khi Insert UserForm thì sẽ có) thì click trên UserForm -> View -> Tollbox.
-> từ ToolBox lấy và đặt trên UserForm 3 Label là Label1, Label2 và Label3 thứ tự từ trên xuống -> chọn Label1 -> nhấn và giữ phím Ctrl -> click lần lượt vào Label2 và Label3 -> trong cửa sổ Properties nhập Left vd. 12, Width vd. 50. Như thế bạn đã có 3 Label cùng độ dài và căn như nhau theo chiều ngang.

-> click trên khoảng trống UserForm -> click Label1 -> click Label1 (lần 2) -> xóa chữ Label1 và gõ Lớp. Tương tự đổi caption của Label2 và Label3 thành Môn và Chương.

Nếu cần thay thì chọn phông chữ và cỡ chữ trong cửa sổ Properties.

Bằng cách tương tự thêm 3 ComboBox bên cạnh 3 Label.

Chọn Insert -> Modele -> dán code sau vào Module1
Mã:
Option Explicit

Function prepare_list(ByVal table_index As Long, ByVal col As Long, ByVal lop As String, ByVal mon As String)
'    ham tra ve mang cac du lieu duy nhat lay tu bang table_index, tu cot col
'    table_index: chi so cua bang trong tap tin - tinh tu 1
'    col: chi so cot can lay du lieu - tinh tu 1
Dim r As Long, text As String, tabl As Table, dic As Object
    If col < 1 Or col > 3 Then Exit Function
    Set dic = CreateObject("Scripting.Dictionary")
    Set tabl = ThisDocument.Tables.Item(table_index)
    For r = 2 To tabl.Rows.Count
        text = Trim(Replace(Replace(Replace(tabl.Cell(r, 1).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
        If col > 1 Then
            If LCase(text) = LCase(lop) Then
                text = Trim(Replace(Replace(Replace(tabl.Cell(r, 2).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
                If col > 2 Then
                    If LCase(text) = LCase(mon) Then
                        text = Trim(Replace(Replace(Replace(tabl.Cell(r, 3).Range.text, Chr(7), ""), Chr(0), ""), Chr(13), ""))
                    Else
                        text = ""
                    End If
                End If
            Else
                text = ""
            End If
        End If
        If text <> "" And Not dic.Exists(text) Then dic.Add text, 0
    Next r
    If dic.Count Then prepare_list = dic.keys()
 
    Set tabl = Nothing
    Set dic = Nothing
End Function

Phải chuột trên UserForm1 -> chọn View code -> dán code sau vào
Mã:
Option Explicit

Private Sub load_combo(ByVal cb_name As String, ByVal lop As String, ByVal mon As String)
Dim col As Long, list
    Select Case cb_name
        Case "ComboBox1": col = 1
        Case "ComboBox2": col = 2
        Case "ComboBox3": col = 3
    End Select
    If col > 0 Then
        list = prepare_list(1, col, lop, mon)
        If Not IsEmpty(list) Then Me.Controls(cb_name).list = list
    End If
End Sub

Private Sub ComboBox1_Change()
    ComboBox2.Clear
    ComboBox3.Clear
    load_combo "ComboBox2", ComboBox1.Value, ""
End Sub

Private Sub ComboBox2_Change()
    ComboBox3.Clear
    load_combo "ComboBox3", ComboBox1.Value, ComboBox2.Value
End Sub

Private Sub UserForm_Initialize()
    load_combo "ComboBox1", "", ""
End Sub

Đúp chuột vào ThisDocument và dán code sau
Mã:
Option Explicit

Private Sub Document_Open()
    UserForm1.Show
End Sub

Ví dụ tôi làm trong tập tin đính kèm.
Làm sao để mặc định giá trị đầu tiên cho Combo: khi đã chọn giá trị cho ComboBox1 (là Lớp 10 chẳng hạn), tất nhiên ComboBox2 được Load dữ liệu vào. Mình muốn lúc đó Combox2 tự ghi dữ liệu mặc định là giá trị đầu tiên trong List (để khỏi phải click chuột nếu cần dùng giá trị đó). Có cách để đạt được điều đó không bạn?
Hỏi thêm: khi ta đã chọn giá trị cho một Combo cụ thể, làm sao xuất được thứ tự của giá trị đó trong List mà Combo đó được nhận.
Xin cảm ơn.
 
Lần chỉnh sửa cuối:
Nhờ sự giúp đở của batman1, mình đã hoàn thành được việc mình đang cần làm. Một lần nữa xin chân thành cảm ơn bạn!
 
khi đã lấy được dữ liệu lên from, em muốn dán dữ liệu vào word mặc định thì làm thế nào ah
 
Web KT
Back
Top Bottom