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:
ReDim rArr(1 To UBound(sArr1, 1), 1 To 1)

Làm ơn chỉ dùm em ý nghĩa của đoạn code trên với.
Em cám ơn ACE nhiều
 
Upvote 0
ReDim rArr(1 To UBound(sArr1, 1), 1 To 1)

Làm ơn chỉ dùm em ý nghĩa của đoạn code trên với.
Em cám ơn ACE nhiều
Dòng code này có nghĩa là khai báo lại mảng rArr với chiếu ngang là từ 1 đến số phần tử cuối cùng và là chiều ngang của mảng sArr1, chiếu dọc là 1.
 
Upvote 0
Bạn không trừ được là do bạn định dạng ở các Textbox.
PHP:
Function LoaiDau(ByVal numb As String) As Double
    On Error GoTo ExitFunction
    LoaiDau = Replace(numb, ",", "")
ExitFunction:
End Function

Sau khi ngồi ngẫm nghĩ thật lâu, tôi cảm thấy hàm trên vẫn chưa ổn định và chưa tổng quát. Ý của tôi là nếu ta gặp trường hợp định dạng trong Control Panel, có máy định dạng dấu thập phân là dấu phẩy (,), có máy định dạng là dấu chấm (.) thì hàm này bị "toi" như chơi.

Vậy thì dùng hàm tổng quát hơn:

PHP:
Function ResNum(ByVal MyNum As String) As Double
    On Error Resume Next
    ResNum = CDbl(MyNum)
End Function

Hoặc để khỏi rườm rà, hàm hiếc gì, thay vì ResNum("Number"), ta chỉ việc CDbl("Number") là xong xui!
 
Upvote 0
Nhờ các Pro kiểm tra hộ cái này, code 1 là cộng dồn tự động xóa, code 2 là link dữ liệu từ Sheet1 sang các Sheets khác (kiểm tra xem code 2 có đúng không?)
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim Tem As Variant
If Not Intersect(Target, [AF4:AO13]) Is Nothing Then
Application.EnableEvents = False
Tem = Target
Target.Offset(29) = Target.Offset(29) + Tem
Target.ClearContents
Application.EnableEvents = True
ElseIf Not Intersect(Target, [AF20:AO29]) Is Nothing Then
Application.EnableEvents = False
Tem = Target
Target.Offset(13, -12) = Target.Offset(13, -12) + Tem
Target.ClearContents
Application.EnableEvents = True
ElseIf Not Intersect(Range("AR20:AR29,AU20:AU29,AX20:AX29,BA19:BA30,BD19:BD30,BG16:BG30,BJ19:BJ22"), Target) Is Nothing Then
Application.EnableEvents = False
Tem = Target
Target.Offset(, 1) = Target.Offset(, 1) + Tem
Target.ClearContents
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S2").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S3").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S4").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing
Then Sheets("S5").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S6").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S7").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S8").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S9").Range("H4:Q13").Value = Range("H4:Q13").Value
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Code này có lỗi gì???

Các bác xem lỗi ở code sau là gì nhé:
VD1:
Mã:
Public Sub VD1()
Dim a As Long
a = 20000 * 2
End Sub
Bị lỗi tràn nhưng mình không hiểu đoạn code sau thì lại không lỗi:
VD2:
Mã:
Public Sub VD2()
Dim a As Long
a = 12345678 * 2
End Sub
Mình có xem phần help của nó thì nó bảo là Bạn cố gắng sử dụng một số trong tính toán và con số đó được cưỡng chế vào một số nguyên nhưng kết quả là lớn hơn so với một số nguyên. Họ đưa ra ví dụ sau:
Mã:
Dim x As Long
x = 2000 * 365   ' Error: Overflow

Để khắc phục thì làm như sau:
Mã:
Dim x As Long
x = CLng(2000) * 365

Vậy thì ví dụ 2 ở trên sao lại không lỗi (số 12345678 vượt quá giới hạn số nguyên mà) trong khi đó VD1 thì lại lỗi (do số 20000 vượt quá giới hạn số nguyên????
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác xem lỗi ở code sau là gì nhé:
VD1:
Mã:
Public Sub VD1()
Dim a As Long
a = 20000 * 2
End Sub
Bị lỗi tràn nhưng mình không hiểu đoạn code sau thì lại không lỗi:
VD2:
Mã:
Public Sub VD2()
Dim a As Long
a = 12345678 * 2
End Sub
Mình có xem phần help của nó thì nó bảo là Bạn cố gắng sử dụng một số trong tính toán và con số đó được cưỡng chế vào một số nguyên nhưng kết quả là lớn hơn so với một số nguyên. Họ đưa ra ví dụ sau:
Mã:
Dim x As Long
x = 2000 * 365   ' Error: Overflow

Để khắc phục thì làm như sau:
Mã:
Dim x As Long
x = CLng(2000) * 365

Vậy thì ví dụ 2 ở trên sao lại không lỗi (số 12345678 vượt quá giới hạn số nguyên mà) trong khi đó VD1 thì lại lỗi (do số 20000 vượt quá giới hạn số nguyên????
Tôi thấy chẳng liên quan gì đến biến Long đâu
Lỗi này rất kỳ lạ!
Code chỉ vầy thôi: MsgBox 20000 + 12768 cũng lỗi
Code này lỗi ngay cả khi chạy trên VB6 chứ không riêng gì VBA
Nhưng nếu viết vầy:
PHP:
Public Sub VD1()
  Dim a As Long
  a = 20000
  a = a * 2
End Sub
Thì lại chẳng có vấn đề gì
Chả biết có cái gì trong trái ổi này nữa
 
Upvote 0
Các bác xem lỗi ở code sau là gì nhé:
VD1:
Mã:
Public Sub VD1()
Dim a As Long
a = 20000 * 2
End Sub
Bị lỗi tràn nhưng mình không hiểu đoạn code sau thì lại không lỗi:
VD2:
Mã:
Public Sub VD2()
Dim a As Long
a = 12345678 * 2
End Sub
Mình có xem phần help của nó thì nó bảo là Bạn cố gắng sử dụng một số trong tính toán và con số đó được cưỡng chế vào một số nguyên nhưng kết quả là lớn hơn so với một số nguyên. Họ đưa ra ví dụ sau:
Mã:
Dim x As Long
x = 2000 * 365   ' Error: Overflow

Để khắc phục thì làm như sau:
Mã:
Dim x As Long
x = CLng(2000) * 365

Vậy thì ví dụ 2 ở trên sao lại không lỗi (số 12345678 vượt quá giới hạn số nguyên mà) trong khi đó VD1 thì lại lỗi (do số 20000 vượt quá giới hạn số nguyên????


bạn chỉ cần thêm như thế này, thì sẽ hết lỗi
Mã:
Public Sub VD1()
     Dim a As Long
     a = 20000 * 2#
End Sub

Tại sao ah, cái này là kiến thức cơ bản đây, bạn xem lại phạm vi của biến INTEGER sẽ hiểu ngay mà, vậy nhé
ở đây là lỗi VBA đã ép kiểu với số đó bạn ah, (vì thế nên a = 12345678 * 2 thì không lỗi)
.
 
Lần chỉnh sửa cuối:
Upvote 0
Phiền các bác sửa cho Code sau thành đúng giúp
PHP:
Sub Month()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
            Arr(j, 1) = Month(Vung)
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub

Xin cảm ơn rất nhiều
 

File đính kèm

  • Month.xls
    23 KB · Đọc: 11
Upvote 0
Phiền các bác sửa cho Code sau thành đúng giúp
PHP:
Sub Month()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
            Arr(j, 1) = Month(Vung)
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub

Xin cảm ơn rất nhiều
Bạn sửa thành thế này xem đúng ý chưa nhé,đặc biệt để ý tên SUB mình đổi lại, bạn đặt tên SUB trùng với hàm bạn dùng trong SUB, khi bạn dùng Month trong sub nó tưởng bạn gọi lại SUB, khai báo tham số cho SUB đó (SUB bạn đặt trên không có tham số) VBA báo lỗi sai tham số.
PHP:
Sub MonthT()
    Dim Vung(), Arr(), i As Long
    Dim mydate
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            mydate = Cells(i + 4, 1).Value
            Arr(i, 1) = Month(mydate)
        Next
    End With
    Sheet2.[A1].Resize(i).Value = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
bạn chỉ cần thêm như thế này, thì sẽ hết lỗi
Mã:
Public Sub VD1()
     Dim a As Long
     a = 20000 * 2#
End Sub

Tại sao ah, cái này là kiến thức cơ bản đây, bạn xem lại phạm vi của biến INTEGER sẽ hiểu ngay mà, vậy nhé
ở đây là lỗi VBA đã ép kiểu với số đó bạn ah, (vì thế nên a = 12345678 * 2 thì không lỗi)
.
Không phải đâu đại ca ơi
Cái này chẳng liên quan gì đến Long hay Integer cả
Một câu lệnh như vầy cũng đã lỗi rồi MsgBox 20000 * 2 (lệnh này chỉ tính toán, chẳng có biến nào cả)
Lỗi này xuất hiện cả khi chạy trên VB6! Trên các mạng nước ngoài cũng rất nhiều người hỏi (hầu hết đều liên quan đến con số 20000) nhưng chẳng ai hiểu và giải thích được tại sao lại như vậy
 
Upvote 0
Không phải đâu đại ca ơi
Cái này chẳng liên quan gì đến Long hay Integer cả
Một câu lệnh như vầy cũng đã lỗi rồi MsgBox 20000 * 2 (lệnh này chỉ tính toán, chẳng có biến nào cả)
Lỗi này xuất hiện cả khi chạy trên VB6! Trên các mạng nước ngoài cũng rất nhiều người hỏi (hầu hết đều liên quan đến con số 20000) nhưng chẳng ai hiểu và giải thích được tại sao lại như vậy

Chính xác đó, VBA về bản chất cũng xuất phát từ VB mà a ndu... tiểu ca (hehe , vui chút, gọi đại ca nghe sợ quá),

xem ví dụ sau

SUB sau sẽ bị báo lỗi
PHP:
Sub t()
    MsgBox 16384 * 2
End Sub

Trong khi đó SUB sau lại bình thường
PHP:
Sub t2()
    MsgBox 16383 * 2
End Sub

vì sao thế
Phạm vi của biến INTEGER là -32768 đến 32767 nên xuất hiện lỗi đó, nên khi đó kết quả nhân 2 vượt quá phạm vi nên báo lỗi, đều này là do bộ biên dịch VB đã dùng ô nhớ chỉ dành cho INTEGER để tính toán nên dẫn đến việc tràn bộ nhớ là đương nhiên thôi

Do đó, dù không có biến như a nói, nhưng máy tính vẫn cần dành ô nhớ cho quá trình tính toán: 20000 * 2 ---> vì thấy 20000 nằm trong phạm vi số INTEGER nên VB bộ biên dịch đã dành ô nhớ INTEGER đó.. đến khi tính toán thì lại bị tràn, thế thôi)
 
Lần chỉnh sửa cuối:
Upvote 0
vì sao thế
Phạm vi của biến INTEGER là -32768 đến 32767 nên xuất hiện lỗi đó, nên khi đó kết quả nhân 2 vượt quá phạm vi nên báo lỗi, đều này là do bộ biên dịch VB đã dùng ô nhớ chỉ dành cho INTEGER để tính toán nên dẫn đến việc tràn bộ nhớ là đương nhiên thôi

Do đó, dù không có biến như a nói, nhưng máy tính vẫn cần dành ô nhớ cho quá trình tính toán: 20000 * 2 ---> vì thấy 20000 nằm trong phạm vi số INTEGER nên VB bộ biên dịch đã dành ô nhớ INTEGER đó.. đến khi tính toán thì lại bị tràn, thế thôi)
Nghe cũng có vẻ có lý!
Nhưng nói thật, vụ này mới nghe lần đầu tiên đấy!
Hic...
 
Upvote 0
Cảm ơn bạn hoamattroicoi, vấn đề với tôi cần ngoài việc Code chạy được tôi rất muốn biết tại sao Code tôi viết lại sai, ai biết xin chỉ dùm cho tôi với
PHP:
Sub tt()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
            Arr(j, 1) = Month(Vung(i))
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub
 
Upvote 0
Cảm ơn bạn hoamattroicoi, vấn đề với tôi cần ngoài việc Code chạy được tôi rất muốn biết tại sao Code tôi viết lại sai, ai biết xin chỉ dùm cho tôi với
PHP:
Sub tt()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
****        Arr(j, 1) = Month(Vung(i))
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub
Bạn sửa lại dòng **** bên trên thành
PHP:
****   Arr(j, 1) = Month(Vung(i, 1))
Trong Code của bạn mảng <Vung> địa chỉ chưa rõ, nếu đang ở sheet <> sheet1 mà chạy code thì ... "trớt quớt".
 
Lần chỉnh sửa cuối:
Upvote 0
Như thế này mới khỏi lỗi
PHP:
Sub tt()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A1:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
    Vung = .[A1:A13].Value
        For i = 1 To UBound(Vung, 1)
            If Vung(i, 1) <> "" Then
            j = j + 1
            Arr(j, 1) = Month(Vung(i, 1))
            End If
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub

With trong Code của bạn đang "thất nghiệp", chẳng có tác dụng gì
 
Upvote 0
Nhờ sửa lỗi Code dùm

Không hiểu sao cứ rời bài tập mẫu do các thày trên mạng ra, những bài tôi tự viết nhiều bài gặp lỗi

PHP:
Sub tt()
    Dim Rng As Range, Arr As Range, i As Long, j As Long
    Set Rng = Range("A1:A6")
    Set Arr = Range("B1:B6")
    For i = 1 To Rng.Count
        j = j + 1
        Arr(j).Formula = "=Rng(" & i & ").Address(0,0)*1000"
    Next
End Sub

Xin nhờ mọi người sửa giúp, xin chỉ giúp tôi sai kiến thức ở điểm nào.
Trân trọng cảm ơn
 

File đính kèm

  • Formula.xls
    18 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
Không hiểu sao cứ rời bài tập mẫu do các thày trên mạng ra, những bài tôi tự viết nhiều bài gặp lỗi
VBA cũng là 1 ngôn ngữ như những ngôn ngữ khác;
Vậy bạn hãy dịch sang tiếng Việt các câu lệnh của bạn xem sao? (Hay bạn hãy nói xem, bạn muốn macro của bạn làm cho bạn điều gì?
 
Upvote 0
Ý tôi là muốn cột B = cột A *1000 thày ah, tôi sửa
PHP:
Arr(j).Formula = "=Rng(" & i & ").Address(0,0)*1000"

thành

PHP:
Arr(j).Formula = "=RC[-1]*1000"
thì nó chạy ổn

Nhưng tôi thắc mắc là tại sao viết như cách trên nó lại không được.
 
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