Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Dear Các bác.
Sau khi chuyển máy, chuyển từ excel 2007 lên office 2010, toàn bộ các Code VBA liên quan đến gửi mail, đều báo lỗi:
Run-time error'-2147417851(80010105)'.
Method 'To' of object '_Mailtem'faied.
Em không rõ là lỗi code, hay em chưa cài đầy đủ các phần trong ofice 2010. Các code này, em chuyển sang máy cũ của em 2007 vẫn dùng vẫn bình thường, sang máy mới cài ofice 2010 là không chạy được.

Kính mong các bác giúp em ạ.
 

File đính kèm

  • auto maill.xla
    35 KB · Đọc: 4
Upvote 0
Xin chào mọi người, mình mới tập tành viết code nên còn rất nhiều điều chưa biết. Vì dụ mình có 2 câu text trong 2 ô excel như sau
1. Ngày13/2/2019
2. Tổ 23 phường Hòa Hải quận Ngũ Hành Sơn Thành phố Đà Nẵng
Bây giờ mình muốn tách từng cụm từ của mỗi câu sau ra thành từng ô excel ở 1 sheet khác thì phải dùng code vba như thế nào ạ?
Nhờ mọi người giúp đỡ
 
Upvote 0
Xin chào mọi người, mình mới tập tành viết code nên còn rất nhiều điều chưa biết. Vì dụ mình có 2 câu text trong 2 ô excel như sau
1. Ngày13/2/2019
2. Tổ 23 phường Hòa Hải quận Ngũ Hành Sơn Thành phố Đà Nẵng
Bây giờ mình muốn tách từng cụm từ của mỗi câu sau ra thành từng ô excel ở 1 sheet khác thì phải dùng code vba như thế nào ạ?
Nhờ mọi người giúp đỡ
Tách như thế nào cho cái vị dụ coi.:D
 
Upvote 0
Upvote 0
Bạn phải biết quy luật của nó mới viết được code.Bạn tìm hiểu xem quy luật của bạn là gì.:D.
cái ô đầu thì quy luật là ngày/tháng/ năm sẽ cách nhau bằng dấu "/", còn câu dưới thì mình đang muốn nó tách theo từng ký tự chỉ định (tổ/phường/quận/thành phố) nhưng mà đoạn code thì không biết làm sao để mô tả được việc dòng text sẽ cách nhau tại dấu "/"
 
Upvote 0
Không biết các địa chỉ khác có Tổ, Phường hay không nhưng chưa chắc có Quận, Thành phố. Một cô thôn nữ thì ở Quận nào, Thành phố nào? Mà đã chắc gì tiểu thư Sài gòn ở Thành phố? Có thể ở TP cũng nên. Tung 1 địa chỉ lên coi như là có qui luật?
 
Upvote 0
Cho em hỏi với, đoạn code sau:
Sub ..
For q = 1 To 10
For Each tr In doc1.Tables(q).Rows
tr.HeightRule = wdRowHeightAtLeast
tr.Height = 0.5
tr.Cells.VerticalAlignment = wdCellAlignVerticalCenter
tr.LeftIndent = CentimetersToPoints(-0.1)
tr.RightIndent = CentimetersToPoints(-0.1)

Next tr

....
End Sub()
LeftIndent, RightIndent có dùng được cho biến Rows không mà nó báo lỗi Method or data member not found (Error 461) Thế ạ
Em đang chuyển dữ liệu từ Excel sang Word, đến đoạn trình bày bảng biểu
 
Upvote 0
tr.LeftIndent = CentimetersToPoints(-0.1)
tr.RightIndent = CentimetersToPoints(-0.1)

...
LeftIndent, RightIndent có dùng được cho biến Rows không mà nó báo lỗi Method or data member not found (Error 461) Thế ạ
Em đang chuyển dữ liệu từ Excel sang Word, đến đoạn trình bày bảng biểu

Trước đó chắc bạn có đại loại
Mã:
Set WordApp = CreateObject(...)
Vậy thì bây giờ viết
Mã:
tr.LeftIndent = WordApp.CentimetersToPoints(-0.1)
tr.RightIndent = WordApp.CentimetersToPoints(-0.1)

Nhưng tr (Row) bên Word cũng không có thuộc tính RightIndent. Ít ra là ở Word 2010 của tôi. Có thể phiên bản Word mới hơn của bạn có chăng?

Excel VBA cũng không biết wdRowHeightAtLeast và wdCellAlignVerticalCenter là gì (Word hiểu được vì chúng là hằng số của Word) nên sẽ cho chúng là tên 2 biến không được khai báo tường minh. Và dĩ nhiên 2 biến đó có giá trị ban đầu là 0. Lúc đó kết quả r.HeightRule và tr.Cells.VerticalAlignment đều là 0, khác với mong đợi.

Vì thế dòng đầu nên là
Mã:
Const wdRowHeightAtLeast = ...
Const wdCellAlignVerticalCenter = ...
Kiểm tra bên Word hai hằng số này có giá trị bao nhiêu rồi điền vào chỗ ...
 
Lần chỉnh sửa cuối:
Upvote 0
Cho mình hỏi là có cái công thức chuyển từ sheet này sang sheet khác hoạt động OK rồi nhưng mà nó chuyển cả hàm trong ô bên sheet kia nên ai có cách nào nó xóa đi giúp mình với vì mình không rành nên chỉ nhặt về thôi. Thanks. Dưới là công thức
Private Sub CommandButton1_Click()
Dim Lr As Integer, Dc As Integer
Lr = Sheet5.Range("A10000").End(xlUp).Row
Dc = Sheet2.Range("A10000").End(xlUp).Row
Sheet2.Range("A2:A100" & Dc, "AG2:AG101" & Dc).Copy
Sheet5.Range ("A" & Lr + 1)
Range("a2", "c101").ClearContents
Range("e2", "h101").ClearContents
Range("j2", "m101").ClearContents
End Sub
 
Upvote 0
Cho mình hỏi là có cái công thức chuyển từ sheet này sang sheet khác hoạt động OK rồi nhưng mà nó chuyển cả hàm trong ô bên sheet kia nên ai có cách nào nó xóa đi giúp mình với vì mình không rành nên chỉ nhặt về thôi. Cảm ơn. Dưới là công thức
Private Sub CommandButton1_Click()
Dim Lr As Integer, Dc As Integer
Lr = Sheet5.Range("A10000").End(xlUp).Row
Dc = Sheet2.Range("A10000").End(xlUp).Row
Sheet2.Range("A2:A100" & Dc, "AG2:AG101" & Dc).Copy
Range("a2", "c101").ClearContents
Range("e2", "h101").ClearContents
Range("j2", "m101").ClearContents
End Sub
Thay dòng trên bằng dòng dưới xem sao.
Mã:
'Sheet5.Range ("A" & Lr + 1)
Sheet5.Range("A" & Lr + 1).PasteSpecial xlPasteValues
 
Upvote 0
Nhưng tr (Row) bên Word cũng không có thuộc tính RightIndent. Ít ra là ở Word 2010 của tôi. Có thể phiên bản Word mới hơn của bạn có chăng?

Excel VBA cũng không biết wdRowHeightAtLeast và wdCellAlignVerticalCenter là gì (Word hiểu được vì chúng là hằng số của Word) nên sẽ cho chúng là tên 2 biến không được khai báo tường minh. Và dĩ nhiên 2 biến đó có giá trị ban đầu là 0. Lúc đó kết quả r.HeightRule và tr.Cells.VerticalAlignment đều là 0, khác với mong đợi.

Vì thế dòng đầu nên là
Mã:
Const wdRowHeightAtLeast = ...
Const wdCellAlignVerticalCenter = ...
Kiểm tra bên Word hai hằng số này có giá trị bao nhiêu rồi điền vào chỗ ...
Thankiu bạn, thực tế mình chỉ không hiểu LeftIndent có vận dụng được cho biến Row trong table hay không thui, các code kia mình vẫn chạy bình thường mà.
Đúng là phần trên mình đang dùng With CreateObject("Word.Application")
Tiện đây, có bác nào có bài viết chuyên sâu về điều khiển Word bằng VBa bên excel không cho mình xin với ạ
 
Upvote 0
Chào cả nhà,
Mình đang làm một số công việc cần trích xuất dữ liệu excel rất nhiều ra các biểu mẫu word.
Tôi đã đọc hết các trả lời cho bài này. Chắc chủ thớt vừa ý.
Tôi chỉ nêu ý tưởng khác để giải quyết bài này. Đó là chuyển dữ liệu của 1 dòng đến vùng khác trên cùng sheet hoặc trên sheet khác. Tất cả đều dùng công thức và cần một chút code rất đơn giản để dễ thao tác. Cũng dễ đối chiếu dữ liệu vô có "trúng" không. Giờ muộn rồi. Có lẽ ngày mai sẽ gửi file demo.

À, bỏ lâu nên không nhớ cách tìm lại bài đã viết. Chỉ biết nếu có ai chọn bài của mình và trả lời thì GPE có thông báo cho tôi thì tìm lại được.
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi câu lệnh này có gì sai?
PHP:
For i = 3 To UBound(sArr, 1)
            For j = 4 To UBound(sArr, 2)
                If sArr(i, 1) > 30000 Then
                    If Weekday(sArr(1, j)) <> 1 Then
                        If IsEmpty(sArr(i, j)) Then
                            Tem = sArr(i, 1) & "-" & sArr(1, j)
                            If Dic.exists(Tem) Then
                                GoTo ErrorHandler
                            Else:
                                k = k + 1
                                Result(k, 1) = sArr(2, j)
                                Result(k, 2) = sArr(i, 1)
                                Result(k, 7) = 17
                            End If
                        End If
                    End If
                End If
            Next j
ErrorHandler: Next i
Next i
Mục đích của em là nếu như tồn tại Key thì nó sẽ bỏ qua và chuyển sang Next i luôn.
 
Upvote 0
Bạn đang dư dòng lệnh
Next I
 
Upvote 0
Thay cho ELSE + Exit For hoặc ELSE + GOTO thì có lẽ tốt hơn là
Mã:
If Not Dic.exists(Tem) Then
    k = k + 1
    Result(k, 1) = sArr(2, j)
    Result(k, 2) = sArr(i, 1)
    Result(k, 7) = 17
End If
 
Upvote 0
Thay cho ELSE + Exit For hoặc ELSE + GOTO thì có lẽ tốt hơn là
Mã:
If Not Dic.exists(Tem) Then
    k = k + 1
    Result(k, 1) = sArr(2, j)
    Result(k, 2) = sArr(i, 1)
    Result(k, 7) = 17
End If
Cũng tại em không nói rõ nghĩa lắm. Nếu theo câu lệnh này thì vòng lặp j của em vẫn tồn tại. Mục đích của em là khi gặp Key thì không tiếp tục xét các cột ở dòng đó nữa mà xét dòng tiếp theo ạ.
Bài đã được tự động gộp:

Bạn đang dư dòng lệnh
Next I
Em cũng thấy nó báo lỗi ở Next i. Em cứ hiểu đơn giản là nếu gặp Key thì không xét vòng lặp j nữa mà chuyển sang dòng khác.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Cũng tại em không nói rõ nghĩa lắm. Nếu theo câu lệnh này thì vòng lặp j của em vẫn tồn tại. Mục đích của em là khi gặp Key thì không tiếp tục xét các cột ở dòng đó nữa mà xét dòng tiếp theo ạ
Xin lỗi. Tôi nhìn nhầm. Bạn viết liền ErrorHandler: Next i nên tôi tưởng ErrorHandler ở dòng cuối của vòng lặp hiện hành i. Hóa ra vòng lặp hiện hành là j, và ErrorHandler nằm ngoài vòng lặp này nên phải là Exit For (hoặc Goto ErrorHandler) như phuocam đã chỉ ra.
 
Upvote 0
Web KT
Back
Top Bottom