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:
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
Chào các thầy cô ạ. em có 1 file gồm 104 sheet lần lượt có tên "Table 1" tới "Table 104"
bây giờ em muốn xóa những sheets có số chẵn đi thì code viết như nào ạ.
 
Upvote 0
Chào các thầy cô ạ. em có 1 file gồm 104 sheet lần lượt có tên "Table 1" tới "Table 104"
bây giờ em muốn xóa những sheets có số chẵn đi thì code viết như nào ạ.
Thử:
Mã:
Public Sub DelSheet()
Dim ws As Worksheet
Dim i
Application.DisplayAlerts = False
    For Each ws In Worksheets
        i = Right(ws.Name, 1)
        If IsNumeric(i) Then
            If i Mod 2 = 0 Then
                ws.Delete
            End If
        End If
    Next ws
Application.DisplayAlerts = True
End Sub
 
Upvote 0
Thử:
Mã:
Public Sub DelSheet()
Dim ws As Worksheet
Dim i
Application.DisplayAlerts = False
    For Each ws In Worksheets
        i = Right(ws.Name, 1)
        If IsNumeric(i) Then
            If i Mod 2 = 0 Then
                ws.Delete
            End If
        End If
    Next ws
Application.DisplayAlerts = True
End Sub
Cám ơn thầy ạ
 
Upvote 0
Mọi người giúp em tí : Sau khi em sử dụng phương thức
Mã:
oFolder=Fso.GetFolder(thisworkbook.path)
bây giờ mình làm sao để liệt kê tên folder trong oFolder ạ.
Em cám ơn !
 
Upvote 0
Mọi người giúp em tí : Sau khi em sử dụng phương thức
Mã:
oFolder=Fso.GetFolder(thisworkbook.path)
bây giờ mình làm sao để liệt kê tên folder trong oFolder ạ.
Em cám ơn !
Dùng thử thế này xem sao.
Mã:
For Each objFolder In oFolder.SubFolders
    MsgBox objFolder
Next
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom