Hàm gộp 2 mảng (array) (1 người xem)

  • Thread starter Thread starter befaint
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
14,557
Được thích
19,765
1. Hàm gộp 2 mảng 2 chiều:

PHP:
Function Combine2Arrays2D(ByVal Arr1 As Variant, ByVal Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 2 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim lB1f As Long, lB1s As Long, uB1f As Long, uB1s As Long
    Dim lB2f As Long, lB2s As Long, uB2f As Long, uB2s As Long
    Dim m1 As Long, n1 As Long, m2 As Long, n2 As Long
    Dim Result(), m As Long, n As Long, i As Long, k As Long
    lB1f = LBound(Arr1, 1):     lB1s = LBound(Arr1, 2)
    uB1f = UBound(Arr1, 1):     uB1s = UBound(Arr1, 2)
    lB2f = LBound(Arr2, 1):     lB2s = LBound(Arr2, 2)
    uB2f = UBound(Arr2, 1):     uB2s = UBound(Arr2, 2)
    m1 = uB1f - lB1f + 1:       n1 = uB1s - lB1s + 1
    m2 = uB2f - lB2f + 1:       n2 = uB2s - lB2s + 1
    If n1 <> n2 Then Exit Function
    ReDim Result(1 To m1 + m2, 1 To n1)
    For i = lB1f To uB1f
        m = m + 1
        n = 0
        For k = lB1s To uB1s
            n = n + 1
            Result(m, n) = Arr1(i, k)
        Next k
    Next i
    For i = lB2f To uB2f
        m = m + 1
        n = 0
        For k = lB2s To uB2s
            n = n + 1
            Result(m, n) = Arr2(i, k)
        Next k
    Next i
    Combine2Arrays2D = Result
End Function
Hoặc:
PHP:
Function Combine2Arrays2Ds(ByVal Arr1 As Variant, ByVal Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 2 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim lB1f As Long, lB1s As Long, uB1f As Long, uB1s As Long
    Dim lB2f As Long, lB2s As Long, uB2f As Long, uB2s As Long
    Dim m1 As Long, n1 As Long, m2 As Long, n2 As Long
    Dim Result(), m As Long, n As Long, i As Long, k As Long, opCalc
    lB1f = LBound(Arr1, 1):     lB1s = LBound(Arr1, 2)
    uB1f = UBound(Arr1, 1):     uB1s = UBound(Arr1, 2)
    lB2f = LBound(Arr2, 1):     lB2s = LBound(Arr2, 2)
    uB2f = UBound(Arr2, 1):     uB2s = UBound(Arr2, 2)
    m1 = uB1f - lB1f + 1:       n1 = uB1s - lB1s + 1
    m2 = uB2f - lB2f + 1:       n2 = uB2s - lB2s + 1
    If n1 <> n2 Then Exit Function
    If n1 > Columns.Count Then Exit Function
    If m1 + m2 > Rows.Count Then Exit Function
    With Application
        opCalc = .Calculation
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
        .ScreenUpdating = False
        With Worksheets.Add
            .Range("A1").Resize(m1, n1) = Arr1
            .Range("A1").Offset(m1).Resize(m2, n1) = Arr2
            Combine2Arrays2Ds = .Range("A1").Resize(m1 + m2, n1)
            .Delete
        End With
        .Calculation = opCalc
        .DisplayAlerts = True
        .ScreenUpdating = True
    End With
End Function
2. Hàm gộp 2 mảng 1 chiều:
PHP:
Function Combine2Arrays1D(ByVal Arr1 As Variant, ByVal Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 1 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim lB1 As Long, uB1 As Long, lB2 As Long, uB2 As Long
    Dim Result(), i As Long, j As Long, m1 As Long, m2 As Long, m As Long
    lB1 = LBound(Arr1):     uB1 = UBound(Arr1)
    lB2 = LBound(Arr2):     uB2 = UBound(Arr2)
    m1 = uB1 - lB1 + 1:     m2 = uB2 - lB2 + 1
    Result = Arr1
    m = IIf(LBound(Result) = 0, m1 + m2 - 1, m1 + m2)
    ReDim Preserve Result(LBound(Result) To m)
    j = IIf(LBound(Result) = 0, m1, m1 + 1)
    For i = lB2 To uB2
        Result(j) = Arr2(i)
        j = j + 1
    Next i
    Combine2Arrays1D = Result
End Function
Hoặc:
PHP:
Function Combine2Arrays1Ds(ByVal Arr1 As Variant, Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 1 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim sDelimiter As String
    sDelimiter = "|@|$|$|%|"
    Combine2Arrays1Ds = Split(Join(Arr1, sDelimiter) & sDelimiter & Join(Arr2, sDelimiter), sDelimiter)
End Function
 
Lần chỉnh sửa cuối:
Combine2Ds:

Có thể dùng thuật toán theo kiểu AppendArray,
Sub AppendArray(arrDes as Variant, arrSrc as Variant, byRef lRow as Long)
' nối arrSrc vào arrDes, điểm nối là lRow + 1
' hai mảng phải có cùng cấu trúc của chiều thứ 2
' sau khi nối xong thì dòng cuói cùng là lRow
If (xét xem có đủ chỗ, nếu không đủ thì lập lại arrDes với đủ dòng)
(hoặc nếu không muốn rắc rối thì báo "không đủ chỗ" và exit sub)
...
End If
Dim i2 as Long ' chỉ số dòng của mảng 2
Dim j as Long, jL as Long, jU as Long ' chỉ số cột của 2 mảng
jL = lbound(arrSrc, 2)
jU = ubound(arrSrc, 2)
For i2 = lbound(arrSrc) to ubound(arrSrc)
lRow = lRow + 1
For j = jL to jU
arrDes(lRow, j) = arrSrc(i2, j)
Next j
Next i2

Với sub này, muốn nhập bao nhiêu mảng thì cứ việc lập một mảng lớn dài cho đủ rồi từ từ gọi sub
Redim aTong(1 to tongDoDai, 1 to abc)
lRow = lbound(aTong) - 1
AppendArray aTong, arr1, lRow
AppendArray aTong, arr2, lRow
AppendArray aTong, arr3, lRow
...
 
Lần chỉnh sửa cuối:
Upvote 0
1. Hàm gộp 2 mảng 2 chiều:

PHP:
Function Combine2Arrays2D(ByVal Arr1 As Variant, ByVal Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 2 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim lB1f As Long, lB1s As Long, uB1f As Long, uB1s As Long
    Dim lB2f As Long, lB2s As Long, uB2f As Long, uB2s As Long
    Dim m1 As Long, n1 As Long, m2 As Long, n2 As Long
    Dim Result(), m As Long, n As Long, i As Long, k As Long
    lB1f = LBound(Arr1, 1):     lB1s = LBound(Arr1, 2)
    uB1f = UBound(Arr1, 1):     uB1s = UBound(Arr1, 2)
    lB2f = LBound(Arr2, 1):     lB2s = LBound(Arr2, 2)
    uB2f = UBound(Arr2, 1):     uB2s = UBound(Arr2, 2)
    m1 = uB1f - lB1f + 1:       n1 = uB1s - lB1s + 1
    m2 = uB2f - lB2f + 1:       n2 = uB2s - lB2s + 1
    If n1 <> n2 Then Exit Function
    ReDim Result(1 To m1 + m2, 1 To n1)
    For i = lB1f To uB1f
        m = m + 1
        n = 0
        For k = lB1s To uB1s
            n = n + 1
            Result(m, n) = Arr1(i, k)
        Next k
    Next i
    For i = lB2f To uB2f
        m = m + 1
        n = 0
        For k = lB2s To uB2s
            n = n + 1
            Result(m, n) = Arr2(i, k)
        Next k
    Next i
    Combine2Arrays2D = Result
End Function
Hoặc:
PHP:
Function Combine2Arrays2Ds(ByVal Arr1 As Variant, ByVal Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 2 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim lB1f As Long, lB1s As Long, uB1f As Long, uB1s As Long
    Dim lB2f As Long, lB2s As Long, uB2f As Long, uB2s As Long
    Dim m1 As Long, n1 As Long, m2 As Long, n2 As Long
    Dim Result(), m As Long, n As Long, i As Long, k As Long, opCalc
    lB1f = LBound(Arr1, 1):     lB1s = LBound(Arr1, 2)
    uB1f = UBound(Arr1, 1):     uB1s = UBound(Arr1, 2)
    lB2f = LBound(Arr2, 1):     lB2s = LBound(Arr2, 2)
    uB2f = UBound(Arr2, 1):     uB2s = UBound(Arr2, 2)
    m1 = uB1f - lB1f + 1:       n1 = uB1s - lB1s + 1
    m2 = uB2f - lB2f + 1:       n2 = uB2s - lB2s + 1
    If n1 <> n2 Then Exit Function
    If n1 > Columns.Count Then Exit Function
    If m1 + m2 > Rows.Count Then Exit Function
    With Application
        opCalc = .Calculation
        .Calculation = xlCalculationManual
        .DisplayAlerts = False
        .ScreenUpdating = False
        With Worksheets.Add
            .Range("A1").Resize(m1, n1) = Arr1
            .Range("A1").Offset(m1).Resize(m2, n1) = Arr2
            Combine2Arrays2Ds = .Range("A1").Resize(m1 + m2, n1)
            .Delete
        End With
        .Calculation = opCalc
        .DisplayAlerts = True
        .ScreenUpdating = True
    End With
End Function
2. Hàm gộp 2 mảng 1 chiều:
PHP:
Function Combine2Arrays1D(ByVal Arr1 As Variant, ByVal Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 1 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim lB1 As Long, uB1 As Long, lB2 As Long, uB2 As Long
    Dim Result(), i As Long, j As Long, m1 As Long, m2 As Long, m As Long
    lB1 = LBound(Arr1):     uB1 = UBound(Arr1)
    lB2 = LBound(Arr2):     uB2 = UBound(Arr2)
    m1 = uB1 - lB1 + 1:     m2 = uB2 - lB2 + 1
    Result = Arr1
    m = IIf(LBound(Result) = 0, m1 + m2 - 1, m1 + m2)
    ReDim Preserve Result(LBound(Result) To m)
    j = IIf(LBound(Result) = 0, m1, m1 + 1)
    For i = lB2 To uB2
        Result(j) = Arr2(i)
        j = j + 1
    Next i
    Combine2Arrays1D = Result
End Function
Hoặc:
PHP:
Function Combine2Arrays1Ds(ByVal Arr1 As Variant, Arr2 As Variant) As Variant
    Rem Arr1 và Arr2 là mang 1 chiêu
    If IsArray(Arr1) = False Or IsArray(Arr2) = False Then Exit Function
    Dim sDelimiter As String
    sDelimiter = "|@|$|$|%|"
    Combine2Arrays1Ds = Split(Join(Arr1, sDelimiter) & sDelimiter & Join(Arr2, sDelimiter), sDelimiter)
End Function
Nói chung là còn rất nhiều lỗi!
Bạn thử trên dữ liệu tôi đính kèm xem sao
 

File đính kèm

Upvote 0
Cảm ơn anh đã kiểm tra giúp em nhưng thực sự em cũng chưa rõ rất nhiều lỗi chỗ nào? Anh đã xem thì chỉ giùm em và nếu được thì chỉnh luôn giúp em ạ.
Bạn thử trên dữ liệu tôi đính kèm xem sao
Em thử file anh đưa. Kết quả có trả về là 2 mảng xếp chồng lên nhau.
Việc gán dữ liệu của một vùng lên mảng có hay không gồm khoảng trống em không xét trong hàm. Mục đích của hàm chỉ là gộp 2 mảng với nhau.
Mình dùng phương án: Chỉ định vùng có dữ liệu để gán vào mảng rồi mới gộp mảng. Vậy được không anh?

Chúc anh ngày vui!
 
Upvote 0
Cảm ơn anh đã kiểm tra giúp em nhưng thực sự em cũng chưa rõ rất nhiều lỗi chỗ nào? Anh đã xem thì chỉ giùm em và nếu được thì chỉnh luôn giúp em ạ.

Em thử file anh đưa. Kết quả có trả về là 2 mảng xếp chồng lên nhau.
Việc gán dữ liệu của một vùng lên mảng có hay không gồm khoảng trống em không xét trong hàm. Mục đích của hàm chỉ là gộp 2 mảng với nhau.
Mình dùng phương án: Chỉ định vùng có dữ liệu để gán vào mảng rồi mới gộp mảng. Vậy được không anh?

Chúc anh ngày vui!
Việc có loại bỏ dòng trống hay không là tuỳ quan điểm của mỗi người, ta cứ cho qua không cần bàn tới.
Điều tôi muốn nói ở đây là vấn đề BẢO TOÀN KIỂU DỮ LIỆU NGUỒN. Tức là nếu như ta có dữ liệu nguồn là '1/3 dạng text, sau khi qua hàm nối mảng, không lý nào nó lại biến thành 1 tháng 3 (hoặc 3 tháng 1). Tương tự vậy cho loại dữ liệu là text nhưng chứa toàn number (chẳng hạn '0123)
Dữ liệu nguồn tôi đã giả lập các tình huống rất rõ ràng nhưng hình như bạn chưa để ý?
 
Upvote 0
Hàm gộp các mảng 1 chiều:
PHP:
Function CombineArrays1D(ParamArray Arrays())
    Dim i As Long, j As Long, k As Long, Result(), Arr
    j = LBound(Array(0))
    For k = LBound(Arrays) To UBound(Arrays)
        Arr = Arrays(k)
        If IsArray(Arr) = True Then
            For i = LBound(Arr) To UBound(Arr)
                ReDim Preserve Result(j)
                Result(j) = Arr(i)
                j = j + 1
            Next i
        Else
            ReDim Preserve Result(j)
            Result(j) = Arr
            j = j + 1
        End If
    Next k
    CombineArrays1D = Result
End Function
Ví dụ:
PHP:
Sub Vidu()
    Dim a, b, c, d
    a = Array(1, 2)
    b = Array(3, 4)
    c = Array(5, 6)
    d = Array(7, 8)
    MsgBox Join(CombineArrays1D(a, b, c, d), "-")
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm gộp các mảng 1 chiều:
PHP:
Function CombineArrays1D(ParamArray Arrays())
    Dim i As Long, j As Long, k As Long, Result(), Arr()
    j = LBound(Array(0))
    For k = LBound(Arrays) To UBound(Arrays)
        Arr = Arrays(k)
        For i = LBound(Arr) To UBound(Arr)
            ReDim Preserve Result(j)
            Result(j) = Arr(i)
            j = j + 1
        Next i
    Next k
    CombineArrays1D = Result
End Function
Ví dụ:
PHP:
Sub Vidu()
    Dim a, b, c, d
    a = Array(1, 2)
    b = Array(3, 4)
    c = Array(5, 6)
    d = Array(7, 8)
    MsgBox Join(CombineArrays1D(a, b, c, d), "-")
End Sub
Lưu ý rằng: Khi ta khai báo ParamArray Arrays thì các phần tử trong Arrays không nhất thiết phải là 1 array mà có thể là bất cứ thứ gì
Vậy trong trường hợp Sub Vidu ta sửa thành:
PHP:
Sub Vidu()
    Dim a, b, c, d
    a = 1
    b = Array(3, 4)
    c = Array(5, 6)
    d = Array(7, 8)
    MsgBox Join(CombineArrays1D(a, b, c, d), "-")
End Sub
cho giá trị a = 1 (giá trị đơn, không phải 1 array) thì code sẽ báo lỗi
 
Upvote 0
Em sửa lại như trên được không anh?
Tùy theo quan điểm của bạn, ví dụ:
1> Nếu bạn chỉ muốn làm việc với mảng, cái nào không phải thì bỏ qua, vậy thì:
Mã:
If isArray(arr) then
   ''Code của bạn
End If
2> Nếu bạn muốn làm việc với.. mọi thứ thì
Mã:
If Not IsArray(arr) Then arr = Array(arr)
Vậy thôi!
Mã:
Function CombineArrays1D(ParamArray Arrays())
  Dim i As Long, j As Long, k As Long, Result(), arr
  j = LBound(Array(0))
  For k = LBound(Arrays) To UBound(Arrays)
    arr = Arrays(k)
    If Not IsArray(arr) Then arr = Array(arr)
    For i = LBound(arr) To UBound(arr)
      ReDim Preserve Result(j)
      Result(j) = arr(i)
      j = j + 1
    Next i
  Next k
  CombineArrays1D = Result
End Function
Tuy nhiên tôi vẫn chưa hiểu j = LBound(Array(0)) để làm gì? Nếu bỏ dòng đó thì điều gì xảy ra?
 
Upvote 0
Em thử rồi nên mới có dòng đó mà.
Nên biết rằng Option Base chỉ có tác dụng với MẢNG DO CHÍNH TA TẠO RA. Vậy hàm ấy do bạn tự tạo ra, mảng Result() cũng do bạn tự tạo ra thì không lý gì bắt nó phải tương thích với mọi Base
Nếu bạn muốn làm việc với Base 1, bạn viết Option Base 1 lên đầu code và mọi mảng bạn tạo ra phải tuân thủ theo chuẩn Base 1 này
Nếu bạn muốn làm việc với Base 0, bạn không cần viết thêm gì cả
Nói chung Option Base chỉ có tác dụng với mảng Result() và hoàn toàn không có tác dụng với các đối số truyền vào. Vậy nên dòng j = LBound(Array(0)) là thừa. Bởi không ai đi copy code của bạn về máy tính mình lại "tài lanh" tự thêm Option Base 1 lên đầu code cả
------------------------
Không biết bạn hiểu vấn đề không nhỉ?
 
Upvote 0
Upvote 0
Vẫn có 1 khả năng đó xảy ra ạ (hoặc copy về dán đoạn đó vào Module đã có Option Base 1).
Cảm ơn anh.
Chuyện không thể nào! Bởi người ta copy code của bạn rồi cho vào chung với code có sẵn thì người ta phải tự lo mọi thứ. Dù bạn muốn lo giùm cũng không lo nỗi đâu. Chẳng hạn ngoài cái Option Base ra còn bao nhiêu thứ khác như: tên hàm, tên biến, hằng số.. nếu như mấy tên ấy trong code của bạn vô tình trùng với mấy tên trong code có sẵn thì bạn tính sao? Có lo luôn được không?
 
Upvote 0
Việc có loại bỏ dòng trống hay không là tuỳ quan điểm của mỗi người, ta cứ cho qua không cần bàn tới.
Điều tôi muốn nói ở đây là vấn đề BẢO TOÀN KIỂU DỮ LIỆU NGUỒN. Tức là nếu như ta có dữ liệu nguồn là '1/3 dạng text, sau khi qua hàm nối mảng, không lý nào nó lại biến thành 1 tháng 3 (hoặc 3 tháng 1). Tương tự vậy cho loại dữ liệu là text nhưng chứa toàn number (chẳng hạn '0123)
Dữ liệu nguồn tôi đã giả lập các tình huống rất rõ ràng nhưng hình như bạn chưa để ý?
Trường hợp này dữ liệu nguồn bị thay đổi là do gán xuống sheet thôi. Mảng kết quả khi sử dụng hàm vẫn giống với các mảng con.
Thử code đơn giản sau sẽ thấy dữ liệu sẽ bị thay đổi khi gán xuống sheet.
Mã:
[A1].Value = "'1-3": [B1].Value = [A1].Value
Tùy theo quan điểm của bạn, ví dụ:
1> Nếu bạn chỉ muốn làm việc với mảng, cái nào không phải thì bỏ qua, vậy thì:
Mã:
If isArray(arr) then
   ''Code của bạn
End If
2> Nếu bạn muốn làm việc với.. mọi thứ thì
Mã:
If Not IsArray(arr) Then arr = Array(arr)
Vậy thôi!
Mã:
Function CombineArrays1D(ParamArray Arrays())
  Dim i As Long, j As Long, k As Long, Result(), arr
  j = LBound(Array(0))
  For k = LBound(Arrays) To UBound(Arrays)
    arr = Arrays(k)
    If Not IsArray(arr) Then arr = Array(arr)
    For i = LBound(arr) To UBound(arr)
      ReDim Preserve Result(j)
      Result(j) = arr(i)
      j = j + 1
    Next i
  Next k
  CombineArrays1D = Result
End Function
Em thì nghĩ khác. Đã là hàm nối mảng 1 chiều thì muốn dùng thì đầu vào phải là mảng 1 chiều. Ai bỏ tầm bậy vào thì lỗi ráng chịu.
Như anh nói phần tử trong ParamArray Arrays có thể là bất cứ thứ gì, vậy ta có thể kiểm soát hết tất cả các trường hợp không. Nếu nó là 1 mảng 2 chiều, 3 chiều thì sao, hay thậm chí là object thì sao.
 
Upvote 0
Như anh nói phần tử trong ParamArray Arrays có thể là bất cứ thứ gì, vậy ta có thể kiểm soát hết tất cả các trường hợp không. Nếu nó là 1 mảng 2 chiều, 3 chiều thì sao, hay thậm chí là object thì sao.
Chỗ này tôi cũng định nói đây (nhưng thấy nhiều quá sợ tác giả bị... hoảng)
Tức câu lệnh IsArray(arr) chỉ nói lên được rằng Arr là 1 array chứ không hề biết nó thuộc loại mấy chiều
Nói chung, rất nhiều thứ ta không lường trước được và đó là lý do PHẢI LUÔN LUÔN BẪY LỖI. Nếu như ta đã viết thành 1 hàm hoàn chỉnh, trường hợp người dùng cố tình (hoặc vô ý) truyền vào sai kiểu biến thì cùng lắm code sẽ bỏ qua không làm gì cả chứ không thể để đến mức báo lỗi được
 
Upvote 0
Hàm gộp các mảng 1 chiều:

Bạn có thể thiết lập một hàm chính để làm việc, và một hàm phụ bọc lấy hàm chính. Nhiệm vụ của hàm phụ là bẫy lỗi hoặc tẩy rác trước khi gọi hàm chính. Code cần nối mảng chỉ cần biết hàm phụ, không cần biết tới hàm chính.
Như vậy bạn chỉ cần chú trọng vào hàm chính. Một khi hàm chính chạy ngon rồi thì bạn nên để nó yên, không chỉnh sửa gì nữa.
Phần lỗi này nọ để hàm phụ lo sau; lúc nảy sinh thêm tình huống nào thì nó thêm code để xử lý tình huống ấy - như vậy bạn vẫn có thể đáp ứng điều kiện của bài #17 như thường.


Giải thật ở bài #2 tôi thiết kế theo tinh thần trên. Hàm phụ có thể nối hàng chục mảng bằng cách gọi hàm chính chục lần. Hàm chính thực ra nó chỉ cần biết là nó cần phải chép một mảng vào một vị trí nhất định của một mảng khác. Cái phần nới rộng chiều dài cho đủ chỗ thì chính nó có thể gọi đệ quy nó (cái chỗ code tôi bỏ lửng). Nối ai với ai và nối vào chỗ nào là quyết định của hàm phụ.

Cái Option Base đó anh. Anh thử xem...

Option Base là câu lệnh chủ yếu dùng để phù hợp với code đời thượng cổ. Ngày xưa lệnh Dim mặc định base 1. Vì vậy các code thời thượng viết theo kiểu coi như lbound của mảng là 1. Các project dùng lại code thời thượng bắt buộc phải nhét lệnh này vào nếu không muốn sửa code.

Ở đây, bạn dùng code mới, không cóp lại code của 30 năm trước cho nên coi như câu Option Base không nên dùng.
 
Lần chỉnh sửa cuối:
Upvote 0
Chỗ này tôi cũng định nói đây (nhưng thấy nhiều quá sợ tác giả bị... hoảng)
Cảm ơn anh.
Chẳng mấy khi được anh trực tiếp giảng giải, anh không cần lo lắng tới em bị hoảng gì đâu, có Panadol rồi ạ. :)
Còn rất nhiều thành viên tham gia học tập nữa mà anh. Sẵn tiện ở topic này anh giảng luôn phần "ParamArray " và phần dưới:
Nói chung, rất nhiều thứ ta không lường trước được và đó là lý do PHẢI LUÔN LUÔN BẪY LỖI. Nếu như ta đã viết thành 1 hàm hoàn chỉnh, trường hợp người dùng cố tình (hoặc vô ý) truyền vào sai kiểu biến thì cùng lắm code sẽ bỏ qua không làm gì cả chứ không thể để đến mức báo lỗi được

Chúc anh ngày vui!
 
Upvote 0
Cảm ơn anh.
Chẳng mấy khi được anh trực tiếp giảng giải, anh không cần lo lắng tới em bị hoảng gì đâu, có Panadol rồi ạ. :)
Tôi hiểu cái khó khăn những người làm chủ topic, đặc biệt là những topic có tính chuyên môn cao. Không ít lần những topic được lập ra đã nhận không ít "gạch đá". Người chân tình góp ý không được bao nhiêu mà kẻ châm chọc thì lại quá nhiều. Tôi cũng không muốn mình trở thành kẻ "ném đá" khi tạo ra quá nhiều áp lực cho chủ topic bằng những "moi móc" dồn dập (dù tôi không cho đó là "moi móc").
Thôi thì cứ từ từ, đến đâu ta bàn đến đó nhé
Sẵn tiện ở topic này anh giảng luôn phần "ParamArray " và phần dưới
Về ParamArray, bạn đã áp dụng được tin chắc bạn đã hiểu khá nhiều rồi. Tôi cũng không hơn gì bạn ở phần kiến thức, cũng không giỏi chuyện lý thuyết nhưng vốn liếng thuộc dạng kinh nghiệm thì tôi cũng.. tạm tạm
Ở đây tôi muốn nhấn mạnh chuyện bẫy lỗi, thứ mà những ai viết code ít khi thích nhưng buộc phải làm. Cụ thể ở bài 17 tôi có đề cập về việc làm sao để tin chắc rằng đối số truyền vào là mảng 1 chiều? Không biết bạn có ý tưởng nào khác, còn tôi thì làm như sau:
- Viết 1 hàm xác định số chiều của mảng (hàm ABC gì đó)
- Ở hàm chính, sau khi xác định arr chính là array, bạn thêm công đoạn kiểm tra ABC(arr) xem có đúng bằng 1 hay không
- Cuối cùng mới là code của bạn
Ngoài ra, cho dù bạn có bẫy bao nhiêu lỗi cũng sẽ không lường trước tất cả các tính huống có thể xảy ra. Vậy bạn có 2 lựa chọn:
1> On Error Resume Next ---> Cho qua mọi thứ
2> Giao công việc báo lỗi cho anh Bill quản lý, theo kiểu:
Mã:
Function Hàm của bạn(....)
  On Error GoTo ErrHandler
  ''Code của bạn
ErrHandler:   MsgBox Err.Description
End Function
Vài góp ý nhỏ thuộc dạng kinh nghiệm cá nhân, cũng không phải kiến thức ghê gớm gì cả
 
Upvote 0
Web KT

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

Back
Top Bottom