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:
Sự khác nhau giữa FormulaR1C1Local FormulaR1C1 là như thế nào?


Theo tôi được biết thì FormulaR1C1Local có liên quan đến Local's Language Settings. Cụ thể chúng khác nhau như thế nào thì ta phải cài Windows theo ngôn ngữ khác tiếng Anh để thử nghiệm mới biết (chắc là chúng sẽ có sự hiển thị tương ứng với ngôn ngữ thiết lập trên máy)
 
Upvote 0
Sự khác nhau giữa FormulaR1C1Local FormulaR1C1 là như thế nào?
vì tôi đi dạy tôi sử dụng
FormulaR1C1 và học viên hỏi FormulaR khác nhau như thế nào? và tôi đã giải thích rõ ràng về vấn đề này, tiếp tục tới Formulaarray vẫn ok, nhưng tới so sánh FormulaR1C1Local là bó tay, vì từ trước tới giờ thực hành cũng không thấy nó có sự khác biệt gì? mong được biết sự khác biệt giữa chúng và cho ví dụ cụ thể, xin chân thành cảm ơn các thành viên trên GPE

Trong link này, phần ví dụ còn thiếu nên có thể gây hiểu lầm. Ví dụ trong đó khi dùng Excel bản tiếng Anh - Mỹ, công thức A11=SUM(A1:A10). Khi mở file ở máy dùng Excel tiếng Đức, các công thức sẽ tự chuyển sang tiếng Đức, property Range("A11").FormulaR1C1Local sẽ trả về "=SUMME(Z1S1:Z10S1)".
Theo mình thì ví dụ trên sẽ rõ ngay khi đưa thêm
Range("A11").FormulaR1C1 trả về "=SUM(R1C1:R10C1)". Nghĩa là FormulaR1C1 luôn trả về chuỗi chứa công thức như ở bản Excel tiếng Anh, kể cả khi đang dùng Excel ngôn ngữ khác; FormulaR1C1Local trả về chuỗi chứa công thức tùy thuộc vào ngôn ngữ của bản Excel đang dùng. Khi ô không chứa công thức thì 2 thuộc tính trên đều trả về giá trị giống nhau là range("A11").text
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu dạy học sinh thì chỉ nên dạy những cái căn bản.
Nếu học trò tôi hỏi những câu hỏi như thế thì tôi trả lời:
"Ký tự A trong VBA là từ Application. Excel và VBA vì là ngôn ngữ thực dụng cho nên chúng có trăm vạn methods và attributes để tuỳ theo từng trường hợp mà sử dụng. Học hết thì bạc cả đầu. Là người thực tế, ta chỉ nên học nguyên tắc cấu trúc, cách thiết kế dữ liệu, và cách test/debug kết quả thôi. Tất cả những chuyện chi tiết còn lại, nếu ta chịu khó dùng debug sẽ nghiệm ra hết"
 
Upvote 0
Chắc phải học theo cách trả lời của anh VetMini rồi, chứ tìm hiểu mấy cái đó đau đầu thật đó, lúc trước tìm hiểu range và cells và các kiểu viết tắt, tại sao lúc gõ dấu . nó ra các thuộc tính lúc gõ nó không ra, và tại sao khi gán sheets(“abc”).range(“a1:b1”) nó không chịu mà sheet1.range(“a1:b1”) thì nó chịu ..v..v, mấy cái đó nghiên cứu lâu lắm mới hiểu quy tắc của nó để trả lời, và bây giờ lại phải nghiên cứu tới FormulaR1C1Local và ... nữa.Thật là để dạy được món nào đó, phải hiểu cặn kẽ từng cái thì mới có thể dạy tốt được, làm được thôi không nói được gì mà phải biết giải thích nữa ...
 
Upvote 0
Bạn có từng nói mình là dân chuyên C++ phải không?
Nếu bạn dạy C++, bạn chỉ có thể dạy sơ qua STL làm việc như thế nào, và một vài lớp/mấu (class/template) căn bản thông dụng của nó thôi. Chứ nếu bạn dạy cho hêt cả thư viện STL thì khoá học của bạn chắc 5 năm mới dứt.
 
Upvote 0
Bạn có từng nói mình là dân chuyên C++ phải không?
Nếu bạn dạy C++, bạn chỉ có thể dạy sơ qua STL làm việc như thế nào, và một vài lớp/mấu (class/template) căn bản thông dụng của nó thôi. Chứ nếu bạn dạy cho hêt cả thư viện STL thì khoá học của bạn chắc 5 năm mới dứt.
anh nghía dùm em đường link này bài 349. anh xem giải thích giúp em nguyên nhân gì đâu mà nó không ra dữ liệu đủ trên 1 cột. cảm ơn anh nhiều
http://www.giaiphapexcel.com/forum/showthread.php?75143-Bài-tập-về-ADO-căn-bản/page35
 
Upvote 0
Chào các bạn,

Có bạn nào xài office 2003 test giúp tôi đoạn code copy sheet -> save as thành file .xls bị báo lỗi
Tôi dùng đoạn code sau mục đích để copy và save as 1 sheet thành file excel khác đuôi .xls. Chạy code trên excel 2007 trở lên thì bình thường. Qua máy win xp - office 2003 chạy thì nó báo lỗi, không thể chạy được. Không hiểu tại sao...

Cảm ơn các bạn!
Mã:
Sub TestCopy()
    Sheet1.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Sheet1.Name & Sheet2.Name & Sheet3.Name & ".xls", FileFormat:=56
    ActiveWorkbook.Close
End Sub
 
Upvote 0
Chào các bạn,

Có bạn nào xài office 2003 test giúp tôi đoạn code copy sheet -> save as thành file .xls bị báo lỗi
Tôi dùng đoạn code sau mục đích để copy và save as 1 sheet thành file excel khác đuôi .xls. Chạy code trên excel 2007 trở lên thì bình thường. Qua máy win xp - office 2003 chạy thì nó báo lỗi, không thể chạy được. Không hiểu tại sao...

Cảm ơn các bạn!
Mã:
Sub TestCopy()
    Sheet1.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Sheet1.Name & Sheet2.Name & Sheet3.Name & ".xls", FileFormat:=56
    ActiveWorkbook.Close
End Sub
Hiện tôi cũng không xài Excel 2003 nhưng tôi nghĩ vấn đề nằm ở chỗ FileFormat:=56, bạn thử xóa nó đi xem sao.
 
Upvote 0
Chào các bạn,

Có bạn nào xài office 2003 test giúp tôi đoạn code copy sheet -> save as thành file .xls bị báo lỗi
Tôi dùng đoạn code sau mục đích để copy và save as 1 sheet thành file excel khác đuôi .xls. Chạy code trên excel 2007 trở lên thì bình thường. Qua máy win xp - office 2003 chạy thì nó báo lỗi, không thể chạy được. Không hiểu tại sao...

Cảm ơn các bạn!
Mã:
Sub TestCopy()
    Sheet1.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Sheet1.Name & Sheet2.Name & Sheet3.Name & ".xls", FileFormat:=56
    ActiveWorkbook.Close
End Sub
Máy mình Xp +Office 2010 chay tốt .....nhưng thấy mấy cái Name kỳ kỳ.......
 
Upvote 0
Chào các bạn,

Có bạn nào xài office 2003 test giúp tôi đoạn code copy sheet -> save as thành file .xls bị báo lỗi
Tôi dùng đoạn code sau mục đích để copy và save as 1 sheet thành file excel khác đuôi .xls. Chạy code trên excel 2007 trở lên thì bình thường. Qua máy win xp - office 2003 chạy thì nó báo lỗi, không thể chạy được. Không hiểu tại sao...

Cảm ơn các bạn!
Mã:
Sub TestCopy()
    Sheet1.Copy
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & Sheet1.Name & Sheet2.Name & Sheet3.Name & ".xls", FileFormat:=56
    ActiveWorkbook.Close
End Sub
Tham khảo thêm nè
XlFileFormat = xlExce l8 <=> File Extension = "xls" : Value = 56
XlFileFormat = xlOpenXMLWorkbook <=> File Extension = "xlsx" : Value = 51
XlFileFormat = xlExcel 12 <=> File Extension = "xlsb" : Value = 50
XlFileFormat = xlOpenXMLWorkbookMacroEnabled <=> File Extension = "xlsm" : Value = 52
 
Upvote 0
Máy mình Xp +Office 2010 chay tốt .....nhưng thấy mấy cái Name kỳ kỳ.......

Hi. tại vì toi lam file lương. Nên các sheet có đặt name theo quy luật. 1 sheet là "LUONG-08-2015". 1 sheet là "GUI NGAN HANG". Nên cố tình ghép lại để xuất ra 1 file có tên là GUI NGAN HANG LUONG-08-2015. File mới này dùng để gửi cho ngân hàng khi chuyển lương cho công nhân ý mà.....

Tôi cũng test 2007 trở lên chạy bình thường........
 
Upvote 0
Hiện tôi cũng không xài Excel 2003 nhưng tôi nghĩ vấn đề nằm ở chỗ FileFormat:=56, bạn thử xóa nó đi xem sao.

Mình thử xóa thì khi mở file đã save lên nó báo lỗi gì gì đó............do hiện tại ở nhà không có 2003 nên chưa test vụ có dược hay không. sáng mai vào cơ quan test trên 2003 (hix..........ở nhà chỉ có 2013)
 
Upvote 0
Thầy ơi! nhờ Thầy "soi sáng" em viết thành công "ép" người ta phải nhập số tờ (hoặc bấm Cancel) rồi @$@!^%, đúng là "Không thầy đố mày làm nên", em cám ơn thấy rất rất nhiều.

Code thế này

Mã:
Dim SoTo, Text1 As String, Text2 As String, Text3 As String
      Const default = 1
  Text1 = "Ha4y nha65p so61 to72 nha65p xong click OK ma85c d9inh la2 1 to72"
  SoTo = Application.InputBox(UniConvert(Text1, "VNI"), "THÔNG BÁO", default)
  If SoTo = "False" Then
    Sheets(23).Select
    Exit Sub
  ElseIf SoTo = "" Then
    Text2 = "Ba5n chu7a nha65p so61 to72 hãy nha65p la5i"
    Text3 = "Hay nhap so to"
    MessageBox Application.hwnd, StrPtr(UniConvert(Text2, "VNI")), StrPtr("THÔNG BÁO"), vbOKOnly
Do Until SoTo <> ""
     SoTo = Application.InputBox(UniConvert(Text3, "VNI"), "THÔNG BÁO")
     If SoTo = "False" Then Exit Sub
Loop
     'Làm gì nữa tùy bạn
    Else
    'Làm gì nữa tùy bạn
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Checkbox=True thì gán số liệu từ sheet này sang sheet kia

Em có thử viết code
Nếu Checkbox = True thì gán các số liệu từ Sheet Form Sang Sheet Data, nhưng em thấy code chạy xong thì nó không gán số liệu qua. Em không biết code em sai ở đâu, nhờ các anh chị hướng dẫn giúp, em cảm ơn
Mã:
Sub Text()
    Dim eR As Long
    Dim Rng3 As Range
    On Error Resume Next
    '******************* tim dong cuoi cua Sheet Data
    Set Rng3 = ActiveSheet.UsedRange
    eR = Sheets("Data").Columns("A:AB").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1


    MsgBox eR
    '********************


    If CheckBox1 = True Then
        With S002
            .Cells(eR, 1).Value = S001.[E2]
            .Cells(eR, 2).Value = S001.[G2]
        End With
    End If
End Sub
Cho em hỏi thêm nếu thay AB thành B trong
Mã:
eR = Sheets("Data").Columns("A:[COLOR=#0000ff][B]AB[/B][/COLOR]").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1
thì MgsBox eR thông báo là o ???? đúng ra là 10
 

File đính kèm

  • Checkbox.xls
    26.5 KB · Đọc: 9
Upvote 0
cho em chen ngang với
Mã:
Sub msgboxx()
test = MsgBox("ba" & ChrW(803) & "n v" & ChrW(432) & ChrW(768) & "a cha" & ChrW(803) & "y code", 1, "Thông ba" & ChrW(769) & "o")
End Sub
tại sao xuất hộp thoại lại ra chữ tùm lum hết vậy ạ.
 
Upvote 0
Em có thử viết code
Nếu Checkbox = True thì gán các số liệu từ Sheet Form Sang Sheet Data, nhưng em thấy code chạy xong thì nó không gán số liệu qua. Em không biết code em sai ở đâu, nhờ các anh chị hướng dẫn giúp, em cảm ơn
Mã:
Sub Text()
    Dim eR As Long
    Dim Rng3 As Range
    On Error Resume Next
    '******************* tim dong cuoi cua Sheet Data
    Set Rng3 = ActiveSheet.UsedRange
    eR = Sheets("Data").Columns("A:AB").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1


    MsgBox eR
    '********************


    If CheckBox1 = True Then
        With S002
            .Cells(eR, 1).Value = S001.[E2]
            .Cells(eR, 2).Value = S001.[G2]
        End With
    End If
End Sub
Cho em hỏi thêm nếu thay AB thành B trong
Mã:
eR = Sheets("Data").Columns("A:[COLOR=#0000ff][B]AB[/B][/COLOR]").Find("*", Rng3(1, 1), , , xlByRows, xlPrevious).Row + 1
thì MgsBox eR thông báo là o ???? đúng ra là 10
Bạn thử dùng code này xem sao:

Mã:
Sub Test()
    If S001.CheckBox1 Then
        Dim eR As Long
        With S002
            '******************* tim dong cuoi cua Sheet Data
            eR = .Range("A65536").End(xlUp).Row + 1
            '********************
            MsgBox eR
            '********************
            .Cells(eR, 1).Value = S001.Range("E2")
            .Cells(eR, 2).Value = S001.Range("G2")
        End With
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử dùng code này xem sao:

Mã:
Sub Test()
    If S001.CheckBox1 Then
        Dim eR As Long
        With S002
            '******************* tim dong cuoi cua Sheet Data
            eR = .Range("A65536").End(xlUp).Row + 1
            '********************
            MsgBox eR
            '********************
            .Cells(eR, 1).Value = S001.Range("E2")
            .Cells(eR, 2).Value = S001.Range("G2")
        End With
    End If
End Sub
Chuyển qua xác định eR kiểu của anh nó chạy còn làm như của em code kg chạy -> không hiểu tại sao
Có cách nào xác định eR giống như bài trên (#276) của em khg, vì em đang dùng chung cho 1 bảng tính. Em cảm ơn
 
Upvote 0
cho em chen ngang với
Mã:
Sub msgboxx()
test = MsgBox("ba" & ChrW(803) & "n v" & ChrW(432) & ChrW(768) & "a cha" & ChrW(803) & "y code", 1, "Thông ba" & ChrW(769) & "o")
End Sub
tại sao xuất hộp thoại lại ra chữ tùm lum hết vậy ạ.
Bạn phải có một hàm để điều khiển MsgBox chuyển nội dung thành tiếng Việt mới được!
 
Upvote 0
Web KT
Back
Top Bottom