Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cấu trúc câu lệnh của bạn sai chứ gì!
Mã:
[COLOR=#0000cd][B]Private Sub Worksheet_Change(ByVal Target As Range)[/B][/COLOR]
    If Not Intersect(Target, Columns("D:D")) Is Nothing Then
        If Target.Value > 10 Then Target.Value = Target.Value / 10
    End If
End Sub
Em nghĩ đây không phải là nguyên nhân của vấn đề. Em nghĩ đến tình huống tác giả có 1 bảng điểm gồm nhiều sheet, mỗi sheet một lớp và tác giả muốn áp dụng code cho tất cả các sheet trong workbook. Trong tình huống này thì sử dụng sự kiện Workbook_SheetChange là phù hợp. Em nghĩ vấn đề ở chỗ tác giả đã đặt code không đúng chỗ: Sự kiện Workbook_SheetChange phải được đặt trong đối tượng ThisWorkbook chứ không phải đặt trong đối tượng Sheet1, Sheet2 hay Sheet..., ngược lại, sự kiện Worksheet_Change phải được đặt trong các đối tượng Worksheet.
 
Upvote 0
Em muốn tất cả sách Sheet đều được căn lề theo các thông số như sau:
PHP:
 .LeftMargin = Application.InchesToPoints(0.5)
        .RightMargin = Application.InchesToPoints(0.5)
        .TopMargin = Application.InchesToPoints(0.5)
        .BottomMargin = Application.InchesToPoints(0.5)
        .HeaderMargin = Application.InchesToPoints(0)
        .FooterMargin = Application.InchesToPoints(0)
        .PrintQuality = 600
        .CenterHorizontally = True
        .Orientation = xlLandscape
        .PaperSize = xlPaperA4
        .Zoom = 65

Xin hãy chỉ giúp em cách viết câu lệnh lựa chọn, thao tác với tất cả các Sheet với ah
 
Upvote 0
Em muốn tất cả sách Sheet đều được căn lề theo các thông số như sau:
PHP:
 .LeftMargin = Application.InchesToPoints(0.5)
        .RightMargin = Application.InchesToPoints(0.5)
        .TopMargin = Application.InchesToPoints(0.5)
        .BottomMargin = Application.InchesToPoints(0.5)
        .HeaderMargin = Application.InchesToPoints(0)
        .FooterMargin = Application.InchesToPoints(0)
        .PrintQuality = 600
        .CenterHorizontally = True
        .Orientation = xlLandscape
        .PaperSize = xlPaperA4
        .Zoom = 65

Xin hãy chỉ giúp em cách viết câu lệnh lựa chọn, thao tác với tất cả các Sheet với ah
1. Record macro với lệnh File\Page setup, bạn sẽ được một dãy code (tương tự như trên)
2. Thêm 1 vòng For để duyệt qua các sheet. Code có dạng như sau:
PHP:
Sub Test()
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        With Sh.PageSetup            
            'Đưa dãy lệnh trên vào đây'
        End With
    Next
End Sub
 
Upvote 0
Có thể lồng With trong With không ah

Em muốn toàn bộ các Sheet của em (cấu trúc như nhau) đều có đặc điểm
1. Từ A1:I1 sẽ áp dụng chế độ kẻ khung với các thông số như nhau:
PHP:
With Selection.Borders(xlEdgeLeft)
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .Weight = xlThin
    End With

Các ô từ A2:I100 thì đường viền của nó như sau:

PHP:
With Selection.Borders(xlEdgeLeft)
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.Weight = xlHairline

Vậy em phải rút viết thế nào ah, xin chân thành cảm ơn
 
Upvote 0
Em muốn toàn bộ các Sheet của em (cấu trúc như nhau) đều có đặc điểm
1. Từ A1:I1 sẽ áp dụng chế độ kẻ khung với các thông số như nhau:
PHP:
With Selection.Borders(xlEdgeLeft)
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .Weight = xlThin
    End With
    '......'
Các ô từ A2:I100 thì đường viền của nó như sau:
PHP:
'......'
With Selection.Borders(xlInsideHorizontal)
.Weight = xlHairline
Vậy em phải rút viết thế nào ah, xin chân thành cảm ơn
Tất nhiên có thể lồng With trong With được, nhưng bạn phải cẩn thận. Khi gõ một dấu chấm (.) bên trong câu lệnh With, bạn phải biết rằng bạn đang tác động đến đối tượng được đề cập trong câu lệnh With nào.
Nếu mục đích chỉ như bạn mô tả thì chẳng cần gì đến With. Bạn có thể sử dụng code sau:
PHP:
Sub KeKhung()
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub
 
Upvote 0
Ồ bác anh Nghĩa Phúc làm ngắn gọn quá, đúng ý em rồi. trong khi Code thu từ Macro rất dài, nhưng em vẫn thắc mắc vùng A2:I100 sao anh viết ngắn thế thì làm sao máy nó hiểu khung viền ngoài là đường liền nhỉ (bởi em hiểu câu của anh chỉ có mỗi đường giữa thôi).

PHP:
Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline

Rất mong anh giải thích để em có thể mở mang được kiến thức của mình.
 
Upvote 0
Ồ bác anh Nghĩa Phúc làm ngắn gọn quá, đúng ý em rồi. trong khi Code thu từ Macro rất dài, nhưng em vẫn thắc mắc vùng A2:I100 sao anh viết ngắn thế thì làm sao máy nó hiểu khung viền ngoài là đường liền nhỉ (bởi em hiểu câu của anh chỉ có mỗi đường giữa thôi).
PHP:
Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
Rất mong anh giải thích để em có thể mở mang được kiến thức của mình.
Thật đơn giản, chỉ vì đã có câu lệnh này ở trên: Sh.[A1:I100].Borders.Weight = xlThin, có nghĩa là toàn bộ vùng A1:I100 đã được thiết lập kiểu đường liền trước đó rồi. Bạn thử khóa 1 trong 2 câu lệnh này (đặt dấu nháy đơn vào trước câu lệnh) rồi chạy code (trên 1 Workbook chưa được định dạng khung) sẽ khám phá ra vấn đề.
 
Upvote 0
Nếu em thay
PHP:
Sub KeKhung()
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub

bằng
PHP:
Sub KeKhung()
        For Each Sheet In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub
Thì nó có tương đương không hả anh
 
Upvote 0
Nếu em thay
PHP:
Sub KeKhung()
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub

bằng
PHP:
Sub KeKhung()
        For Each Sheet In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub
Thì nó có tương đương không hả anh
Thứ nhất, VBA sẽ không hiểu anh chàng Sh là cái gì. Thứ 2, không nên sử dụng tên biến đặc biệt như "Sheet", bởi lẽ có thể trùng với từ khóa của VBA. Nếu bạn thay Sheet bởi Sh thì được. Có thể không khai báo biến Sh, nhưng nhìn chung thì khai báo tốt hơn. Hãy tập cho mình một thói quen tường minh trong viết code.
 
Upvote 0
Nếu em thay
PHP:
Sub KeKhung()
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub

bằng
PHP:
Sub KeKhung()
        For Each Sheet In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub
Thì nó có tương đương không hả anh

Phải là
PHP:
Sub KeKhung()
        For Each Sheet In ThisWorkbook.Worksheets
        Sheet.[A1:I100].Borders.Weight = xlThin
        Sheet.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub
 
Upvote 0
Nếu em thay
PHP:
Sub KeKhung()
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub

bằng
PHP:
Sub KeKhung()
        For Each Sheet In ThisWorkbook.Worksheets
        Sh.[A1:I100].Borders.Weight = xlThin
        Sh.[A2:I100].Borders(xlInsideHorizontal).Weight = xlHairline
    Next
End Sub
Thì nó có tương đương không hả anh
Tự mình thí nghiệm, xem kết quả và tự rút ra kết luận
Mấy cái này thay vì hỏi, bạn làm thử có phải hơn không
 
Upvote 0
Tôi tạo một From trong đó gồm có 3 TextBox. TextBox1 và TextBox2 đều có gán số liệu, tôi muốn lấy TextBox1 trừ TextBox2 cho ra kết quả ở TextBox3. Tôi tìm kiếm hoài không thấy, nhờ giúp cho. Cám ơn
 
Upvote 0
Tôi tạo một From trong đó gồm có 3 TextBox. TextBox1 và TextBox2 đều có gán số liệu, tôi muốn lấy TextBox1 trừ TextBox2 cho ra kết quả ở TextBox3. Tôi tìm kiếm hoài không thấy, nhờ giúp cho. Cám ơn

Bạn thêm 1 nút lệnh nữa cho form và gán code vào nó như sau:

PHP:
Private Sub CommandButton1_Click()
    TextBox3 = Val(TextBox1) - Val(TextBox2)
End Sub
 
Upvote 0
Cám ơn Hoàng Trọng Nghĩa, code đó khi tôi kích vào CommandButton ngoài bảng tính thì nó không hiển thị kết quả, bạn xem lại dùm.
 
Upvote 0
Trong đoạn code dưới đây: (chỗ mình tô màu đỏ, mình chưa hiểu lắm cách dùng hàm find trong VBA trong công thức thì mình biết dùng còn trong VBA thì mình chưa hiểu lắm không biết các tham số khi dùng hàm nó có giống khi dùng VBA không?) Thanks
Sub Timkiem()
Dim DMHH As Range, KQ As Range, clls As Range
With Sheets("DM-KH")
Set DMHH = .Range("A2:A" & .Range("A65000").End(xlUp).Row)
End With
For Each clls In Sheets("BC").Range("A2:A20")
Set KQ = DMHH.Find(clls.Value, , xlValues, xlWhole, xlByRows, xlNext, , , False)
If KQ Is Nothing Then
clls.Offset(, 1).Value = ""
clls.Offset(, 2).Value = ""
Else
clls.Offset(, 1).Value = KQ.Offset(, 1).Value
clls.Offset(, 2).Value = KQ.Offset(, 2).Value
End If
Next
End Sub
 
Upvote 0
Cái đó thường được gọi là fương thức, không fải là hàm!

Trong đoạn code dưới đây: (chỗ mình tô màu đỏ, mình chưa hiểu lắm cách dùng hàm find trong VBA trong công thức thì mình biết dùng còn trong VBA thì mình chưa hiểu lắm không biết các tham số khi dùng hàm nó có giống khi dùng VBA không?) Thanks
PHP:
Sub Timkiem()
  Dim DMHH As Range, KQ As Range, clls As Range
  With Sheets("DM-KH")
     Set DMHH = .Range("A2:A" & .Range("A65000").End(xlUp).Row)
   End With
  For Each clls In Sheets("BC").Range("A2:A20")
         Set KQ = DMHH.Find(clls.Value, , xlValues, xlWhole, xlByRows, xlNext, , , False)
             If KQ Is Nothing Then
                       clls.Offset(, 1).Value = "":                clls.Offset(, 2).Value = ""
             Else
                     clls.Offset(, 1).Value = KQ.Offset(, 1).Value
                     clls.Offset(, 2).Value = KQ.Offset(, 2).Value
    End If
 Next
End Sub

Bạn tìm http://www.giaiphapexcel.com/forum/...p-về-phương-thức-tìm-kiếm-FIND-(-Find-Method)
& http://www.giaiphapexcel.com/forum/...ảo-luận-về-phương-thức-tìm-kiếm-METHOD-FIND()
nói rất rõ!
 
Upvote 0
Cám ơn Hoàng Trọng Nghĩa, File DV đây! nhờ AC và các bạn giúp dùm.

Bạn không trừ được là do bạn định dạng ở các Textbox.

Kiểu định dạng này được hiểu là Text mà đã vậy thì thêm Val nó chỉ lấy giá trị số trước dấu phẩy (,) còn những số sau dấu phẩy nó không quan tâm.

Nói thêm là khi bạn chọn sự kiện Change để format kiểu như thế, bạn sẽ gặp rắc rối nếu bạn đánh số thập phân, VD bạn muốn gõ 50,000.599 chẳng hạn, tôi nghĩ nó sẽ không cho làm điều đó!


Vậy để trừ được 2 textbox với nhau, bạn cần phải loại bỏ dấu phẩy ra để cho nó trở về dạng số, tôi làm 1 hàm như sau:

PHP:
Function LoaiDau(ByVal numb As String) As Double
    On Error GoTo ExitFunction
    LoaiDau = Replace(numb, ",", "")
ExitFunction:
End Function

Và thêm nút CommandButton vào Form, thủ tục như sau:

PHP:
Private Sub CommandButton1_Click()
  TextBox3.Value = LoaiDau(TextBox1.Value) - LoaiDau(TextBox2.Value)
End Sub

Nếu bạn muốn định dạng cho Textbox3 thì cũng định dạng như các textbox khác:

PHP:
Private Sub TextBox3_Change()
  TextBox3.Value = Format(TextBox3.Value, "#,##0")
End Sub

Bạn cũng có thể nhân cho 1 (chia cho 1) để loại bỏ dấu:

PHP:
Private Sub CommandButton1_Click()
  TextBox3.Value = 1 * TextBox1.Value - 1 * TextBox2.Value
End Sub

Tuy nhiên cách nhân cho 1 này thường phát sinh lỗi nếu 1 trong 2 textbox có giá trị là chuỗi hoặc rỗng.

Tới đây chắc bạn đã làm được.
 
Lần chỉnh sửa cuối:
Upvote 0
Code đúng sao không chạy được?

Em có đoạn code sau

PHP:
With target
If .Address = "$B$5" And Right([B5], 7) <> "dacbiet" Then
                
                [C8:D8].ClearContents
                [B11:D13].ClearContents
                [D6].ClearContents
                With Sheet5
                Select Case Left([B5], 3)
                        
                        Case "DEM"
                        [D6] = IIf(Right([B5], 4) = "nhap", .[n1], .[N6]) ' so ngay mien DEM
                        [B12] = IIf(Right([B5], 4) = "nhap", .[k2], .[k7]) ' muc 1 cont 20 nhap & xuat
                        [B13] = IIf(Right([B5], 4) = "nhap", .[k3], .[k8]) ' muc 2 cont 20 nhap & xuat
                        [C12] = IIf(Right([B5], 4) = "nhap", .[L2], .[L7]) ' muc 1 cont 40 nhap & xuat
                        [C13] = IIf(Right([B5], 4) = "nhap", .[L3], .[L8]) ' muc 2 cont 40 nhap & xuat
                        [D12] = IIf(Right([B5], 4) = "nhap", .[M2], .[M7]) ' muc 1 cont 45 nhap & xuat
                        [D13] = IIf(Right([B5], 4) = "nhap", .[M3], .[M8]) ' muc 2 cont 45 nhap & xuat
                        
                        Case "DET"
                        [D6] = IIf(Right([B5], 4) = "nhap", .[T1], .[T6]) ' so ngay mien DET
                        [B12] = IIf(Right([B5], 4) = "nhap", .[Q2], .[Q7]) ' muc 1 cont 20 nhap & xuat
                        [C12] = IIf(Right([B5], 4) = "nhap", .[R2], .[R7]) ' muc 1 cont 40 nhap & xuat
                        [D12] = IIf(Right([B5], 4) = "nhap", .[s2], .[S7]) ' muc 1 cont 45 nhap & xuat
                        
                        
                End Select
                
                End With

        
        End If
End with

Đoạn code trên test ok trên máy em.
Khi đêm file này sang dùng trên 1 máy khác thì code trên không chạy (test các code khác chạy bình thường ví dụ test bằng msgbox...)

Như vậy có phải máy bạn em có chỗ nào chưa thiết lập không?
Xin chỉ giúp

Em cám ơn nhiều
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom