VB.NET dành cho người đã có nền tảng VBA

vbano1

SMod
Thành viên BQT
[VB.NET-1.1]Khai báo biến
Khai báo biến nội bộ-Local
Cách khai báo giống với VBA:
Mã:
Dim TenBien As String
Gọi là biến local (nội bộ) vì nó được khai báo bên trong thân của chương trình, nằm giữa Sub và End Sub. Ví dụ:
Mã:
Sub abc()
Dim i as Integer
...
End Sub
Nên nạp giá trị khởi tạo cho biến ngay khi khai báo biến
Mã:
Dim thvba As String = ""
Hoặc:
Mã:
Dim i As Integer = 0
Chương trình mẫu
Mã:
Module Module1
    Sub Main()
       ' Khai bao va tao gia tri khoi tao cho bien so
       Dim str1 As String = ""
       Dim str2 As String = ""
       Dim str3 As String = ""

       ' Xu ly gi do o day
    End Sub
End Module
 
  • Love
Reactions: CRV
T

thanhphong

Guest
Mọi người sẽ không phải học các toán tử (cộng, trừ , nhân, chia , số dư, nối ký tự,...) vì trước nay với VBA như thế nào thì VB.NET cũng y như vậy.
Với các lệnh điều khiển (for, do loop until, do while loop) cũng y như VBA, nên cũng không cần học gì thêm. Vậy là bớt đi được kha khá thời gian rồi.
[VB.NET-1.2]Làm việc với mảng
Phần này có chút xíu khác biệt so với VBA.
1.2.1 Với một mảng được khai báo rõ ràng kiểu dữ liệu:
Mã:
Module Module1

    Sub Main()
        ' Khai bao mang
        Dim str(10) As String

        For i As Integer = 0 To 10
            ' Gian gia tri cho mang
            str(i) = "dong thu: " & (i + 1)
            ' Hien thi ket qua ra man hinh
            Console.WriteLine(str(i))
        Next

    End Sub

End Module
Hoặc:
Mã:
  'Khai bao mang va nap gia tri khoi tao luon
  Dim kakaku() As Integer = {120, 80, 55, 300, 168}
1.2.2 Kích thước của mảng là từ 0 tới arr.Length - 1
Với VBA ta có Ubound(arr).
Lệnh trên vẫn dùng được cho VB.Net nếu là mảng một chiều. Nhưng các bạn nên làm quen với cấu trúc Length, vì nó được sử dụng nhiều hơn trong VB.Net.
Mã:
Module Module1

  Sub Main()
' Khai bao mang mot chieu va nap gia tri khoi tao
Dim arrthvba() As Integer = {120, 80, 55, 300, 168}
' Thay doi gia tri cua mang
arrthvba(1) = arrthvba(1) * -1
arrthvba(3) = arrthvba(3) * -1
' Liet ke cac phan tu cua mang
For i As Integer = 0 To arrthvba.Length - 1
Console.WriteLine(arrthvba(i))
Next
  End Sub

End Module
Chú ý: array.Length sẽ trả về kiểu Integer. Nếu bạn làm việc với mảng lớn, hãy dùng array.LongLength nó trả về kiểu Long.
1.2.3 Mảng hai chiều
Khai báo cũng giống với VBA.
Mã:
  ' khai bao mang hai chieu
  Dim arr(5, 4) As Integer
Điều đó có nghĩa là:
Mã:
arr(0, 0)、arr(0, 1)、arr(0, 2)、arr(0, 3)、arr(0, 4)

arr(1, 0)、arr(1, 1)、arr(1, 2)、arr(1, 3)、arr(1, 4)

arr(2, 0)、arr(2, 1)、arr(2, 2)、arr(2, 3)、arr(2, 4)

arr(3, 0)、arr(3, 1)、arr(3, 2)、arr(3, 3)、arr(3, 4)

arr(4, 0)、arr(4, 1)、arr(4, 2)、arr(4, 3)、arr(4, 4)

arr(5, 0)、arr(5, 1)、arr(5, 2)、arr(5, 3)、arr(5, 4)
1.2.4 Khai báo và đặt giá trị khởi tạo cho mảng hai chiều:
Mã:
' khai bao va thiet dinh gia tri khoi tao cho mang
  Dim arr(,) As Integer = New Integer(,) {{50, 80}, {105, 70}}
  ' hoac la
  Dim arr(,) As Integer = {{50, 80}, {105, 70}}
Ví dụ:
Mã:
Module Module1

  Sub Main()
' row
Dim r As Integer = 5
' column
Dim c As Integer = 3
' Khai bao mang co 3 cot thong tin{Toan, Tieng Anh, Vat Ly}
Dim seiseki(,,) As Integer = { _
{75, 85, 90}, _
{100, 80, 80}, _
{90, 90, 90}, _
{65, 90, 80}, _
{80, 85, 100} _
}
' Tong diem
Dim tongdiem(0, 2) As Integer
' Diem trung binh, chu y kieu du lieu
Dim diemtb(0, 2) As Double
' Tong diem
For i As Integer = 0 To r - 1
tongdiem(0, 0) = tongdiem(0, 0) + seiseki(i, 0)
tongdiem(0, 1) = tongdiem(0, 1) + seiseki(i, 1)
tongdiem(0, 2) = tongdiem(0, 2) + seiseki(i, 2)
Next
' Diem trung binh
For j As Integer = 0 To c - 1
diemtb(0, j) = tongdiem(0, j) / r
Console.Write("diemtb(0, " & j & ") = ")
Console.WriteLine(diemtb(0, j))
Next
  End Sub

End Module
1.2.5 Giá trị trả về của hàm là mảng
Dùng Return khá giống code c. Nếu bạn không quen, thì cứ viết như VBA cũng không sao cả.
Tên_Hàm= Giá_Trị
Mã:
Function Example() As String()
        Dim array(1) As String
array(0) = "Tuhoc"
        array(1) = "VBA"
        Return array
    End Function
1.2.6 Kiểm tra mảng rỗng:
Mã:
If array.Length = 0 Then
Logic trên đi từ suy nghĩ thông thường, không có gì mới.

Đây là phần rộng, cho nên chúng ta sẽ còn quay lại sau.

 
Sửa lần cuối bởi điều hành viên:

tuhocvba

Administrator
Thành viên BQT
Một điều khó khăn rất lớn là anh em không dùng được mảng khai báo variant trong VB.NET, nó không hiểu đâu.
Đặc biệt là mảng là input của function hay sub.
Bài toán của tôi như sau:
Tôi cần ghi ra mảng xrr kết quả truy xuất ADO.

Do dữ liệu có thể là số, là chữ. Chúng ta nghĩ tới variant trong VBA. Nhưng điều này không xử lý được trong VB.NET.
Vậy chi bằng khai báo nó là một mảng hai chiều dạng string. Kích thước mảng không xác định do đó tôi khai báo là:
Mã:
'=====Sub
Dim xrr(,) As String
If laydulieuExcelADO(SQL, xrr) = False Then
            Exit Sub
End If
'=====Function
Private Function laydulieuExcelADO(ByVal SQL As String, ByRef arr(,) As String) As Boolean
r = rs.RecordCount
        c = rs.Fields.Count
        If r > 0 Then
            ReDim arr(r - 1, c - 1)
            rs.MoveLast()
            rs.MoveFirst()

            For i = 1 To rs.RecordCount
                For j = 1 To rs.Fields.Count
                    arr(i - 1, j - 1) = CStr(rs.Fields(j - 1).Value)
                Next j
                rs.MoveNext()
            Next i
            laydulieuExcelADO = True
        Else
            MessageBox.Show _
                    ("File Excel không có dữ liệu")
            GoTo thoat
        End If
 
T

thanhphong

Guest
1.2.7 Kích thước của mảng.
Trong VB.NET, mảng bắt đầu từ chỉ mục 0.
arr.Length sẽ cho biết mảng có bao nhiêu phần tử.
Đối với mảng hai chiều thì chúng ta sử dụng:
arr.GetLength(0) : Số hàng
arr.GetLength(1) : Số cột

Nếu trong VBA thì các bạn có thể khai báo mảng là variant. Tức là vừa là số integer, cũng có thể là ký tự string.
Nhưng trong VB.NET bạn không thể khai báo mảng có kiểu như vậy. Do đó chúng ta hãy khai báo mảng string.
Từ string chúng ta cũng có thể convert ra được số.
 
Sửa lần cuối bởi điều hành viên:
T

thanhphong

Guest
1.2.8 Các lệnh Redim và Redim Preserve vẫn dùng được

Mã:
Dim array(4) As Integer
array(0) = 150
array(1) = 160
array(2) = 170
array(3) = 180
array(4) = 190

ReDim Preserve array(5)

For i As Integer = 0 To array.Length - 1
    Console.Write(array(i) & " ")
Next

Console.WriteLine()
Kết quả:
Mã:
150 160 170 180 190 0
 

tuhocvba

Administrator
Thành viên BQT
Lệnh Redim của VBA Excel có thể nói là cực kỳ bất tiện.
Nếu như không viết Option Base thì phần tử mảng nhỏ nhất của VBA Excel mặc định là 0.
Nhưng từ khi khởi tạo mảng tới lúc cần phán đoán đây có phải là mảng rỗng hay không thì lại là vấn đề.
Ở VB.NET thì mọi người có thể viết là ReDim tblValue(-1) . Sau đó mọi người kiểm tra độ dài mảng có phải là 0 , thì sẽ phán đoán được đây là mảng rỗng :
Mã:
tblValue.Length
Chỉ mục lớn nhất sẽ viết là : tblValue.GetUpperBound(0) (VBA thì viết là UBound ) có giá trị trả về là -1.

Ngược lại ở VBA mọi người không thể viết là ReDim tblValue(-1) , việc này sẽ gây ra lỗi.
Khởi tạo mảng trong VBA chỉ có cách là viết như sau :
Mã:
ReDim tblValue(0)
Khi đó sẽ không thể phán đoán mảng rỗng hay không hay là đã có một phần tử mảng được nạp vô rồi, nếu như dựa vào UBound(tblValue) (lúc này giá trị trả về là 0 ).
Có lẽ chỉ còn cách kiểm tra nội dung của tblValue(0) mà thôi.

Trong VBA nếu như viết Option Base 1, chỉ mục mảng sẽ bắt đầu là 1, vấn đề tưởng như được giải quyết, nhưng nếu lúc này bạn dùng lệnh ReDim tblValue(0) , thì sẽ xảy ra lỗi.

Thông thường tôi sẽ dùng thêm một biến phụ là cnt để xác định quá trình nạp vào mảng đã được tiến hành hay chưa. Các bạn có thể thấy điều này được sử dụng rất nhiều trong các đoạn code của tôi.

Tuy nhiên với VB.NET, việc kiểm tra mảng rỗng hay đã được nạp giá trị rồi, có vẻ là đơn giản hơn.
 

phuonghong1997

Yêu THVBA như điếu đổ
Đúng là VB.NET không có kiểu dữ liệu variant, điều này khác với VBA. Vì vậy khi khai báo bên VB.NET các bạn có thể cho nó là kiểu string.
VBA:
Dim tblValue As Variant
tblValue = Array("AAA", "BBB", "CCC")
VB.NET:
Dim tblValue() As String = New String() {"AAA", "BBB", "CCC"}
 
Trong VB.NET người ta có thể dùng Array.Resize để lưu giá trị cũ và thay đổi kích thước mảng.
Mã:
Module Module1

    Sub Main()

        Dim x() As Integer = New Integer() {1, 2, 3}
        ' This keeps the existing elements.
        Array.Resize(x, 6)
        Console.WriteLine(String.Join(",", x))
    End Sub

End Module
Kết quả:
Mã:
1,2,3,0,0,0
Nguồn:
 

17namvu

Yêu THVBA
Một điều khó khăn rất lớn là anh em không dùng được mảng khai báo variant trong VB.NET, nó không hiểu đâu.
Đặc biệt là mảng là input của function hay sub.
Bài toán của tôi như sau:
Tôi cần ghi ra mảng xrr kết quả truy xuất ADO.

Do dữ liệu có thể là số, là chữ. Chúng ta nghĩ tới variant trong VBA. Nhưng điều này không xử lý được trong VB.NET.
Vậy chi bằng khai báo nó là một mảng hai chiều dạng string. Kích thước mảng không xác định do đó tôi khai báo là:
Mã:
'=====Sub
Dim xrr(,) As String
If laydulieuExcelADO(SQL, xrr) = False Then
            Exit Sub
End If
'=====Function
Private Function laydulieuExcelADO(ByVal SQL As String, ByRef arr(,) As String) As Boolean
r = rs.RecordCount
        c = rs.Fields.Count
        If r > 0 Then
            ReDim arr(r - 1, c - 1)
            rs.MoveLast()
            rs.MoveFirst()

            For i = 1 To rs.RecordCount
                For j = 1 To rs.Fields.Count
                    arr(i - 1, j - 1) = CStr(rs.Fields(j - 1).Value)
                Next j
                rs.MoveNext()
            Next i
            laydulieuExcelADO = True
        Else
            MessageBox.Show _
                    ("File Excel không có dữ liệu")
            GoTo thoat
        End If
cái này mình khai báo mảng thành object được này ad, chứa được cả dạng số và string
 
Top