Vba sang Vb.net

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Bùi Đức Dương

Thành viên mới
Tham gia
15/4/24
Bài viết
2
Được thích
0
Dạ em chào các anh chị, Dạ em hiện tại đang viết 1 đoạn chuyển đổi code vba sang vb.net mà hiện tại em viết mãi đoạn code này không được , dạ anh chị nào viết được , viết giúp em ạ, em gửi phí cf ạ , Dạ mong anh chị giúp đỡ em ạ
Bài đã được tự động gộp:

Dạ em chào các anh chị, Dạ em hiện tại đang viết 1 đoạn chuyển đổi code vba sang vb.net mà hiện tại em viết mãi đoạn code này không được , dạ anh chị nào viết được , viết giúp em ạ, em gửi phí cf ạ , Dạ mong anh chị giúp đỡ em ạ
 

File đính kèm

  • codechuyen.xlsm
    2 MB · Đọc: 9
Dạ em chào các anh chị, Dạ em hiện tại đang viết 1 đoạn chuyển đổi code vba sang vb.net mà hiện tại em viết mãi đoạn code này không được , dạ anh chị nào viết được , viết giúp em ạ, em gửi phí cf ạ , Dạ mong anh chị giúp đỡ em ạ
Bài đã được tự động gộp:
Khai báo của bạn chỉ có giá trị trong sub mà bạn khai báo thôi.
Khi bạn dùng
PHP:
Sub Khai_Bao()
    Set IP_Sht = ThisWorkbook.Sheets("INPUT_DATA")
    Set SD_Sht = ThisWorkbook.Sheets("SUM_DATA")
....
thì giá trị IP_Sht và SD_Sht chỉ có ý nghĩa trong Sub Khai_Bao, nên khi bạn gọi tại Sub Sum_Force() thì máy báo không hiểu định nghĩa;
PHP:
Sub Sum_Force()
    Call Khai_Bao
    Call Tat_man_hinh
...
Bạn tìm hiểu thêm biến toàn cục / biến cục bộ để hiểu về việc này.
p/s:
(1) VBA với mình là ngôn ngữ rất thân thiện, code như lời nói, dễ ứng dụng. Đặc biệt đối tượng bạn đang hướng tới vẫn là file excel (.xls) thì VBA là một lợi thế lớn.
(2) Bạn cần phải nắm rõ việc khai báo trong VBA, các đối tượng ít nhất là trong bảng tính hiện tại thì mới nghĩ đến chuyển đổi code sang ngôn ngữ khác.
- VB.Net cũng gần gủi với VBA vì đều họ VB, nhưng VB.net thì cần cài netframe tương ứng, khai báo và lưu trữ tận dụng tốt tài nguyên của máy thì ở tầm khác rồi. Một code đơn giản để xử lý trên Excel có thể rất nhẹ nhàng, nhưng chạy độc lập trên VB.Net thì cũng không đơn giản.
- Còn thuần nhúng *.dll để chạy cho người khác không dòm thì bạn nên tận dụng để tìm hiểu VBA trước đã.
 
Lần chỉnh sửa cuối:
VB.Net nếu dùng đúng chức năng của nó thì là loại ngôn ngữ Hướng Đối Tượng.
VBA không phải, và cũng không bao giờ có ý định Hướng Đối Tượng.

Là dân HĐT thì ai cũng biết khái niệm Toàn Cục/Nội Bộ hãy nên quên đi.
Trong môi trường này, Wrapper Classes (Static) làm công việc của Toàn Cục. Và người thông thạo môi trường này biết cách gói gọn Nội Bộ.
 
Khai báo của bạn chỉ có giá trị trong sub mà bạn khai báo thôi.
Khi bạn dùng
PHP:
Sub Khai_Bao()
    Set IP_Sht = ThisWorkbook.Sheets("INPUT_DATA")
    Set SD_Sht = ThisWorkbook.Sheets("SUM_DATA")
....
thì giá trị IP_Sht và SD_Sht chỉ có ý nghĩa trong Sub Khai_Bao, nên khi bạn gọi tại Sub Sum_Force() thì máy báo không hiểu định nghĩa;
PHP:
Sub Sum_Force()
    Call Khai_Bao
    Call Tat_man_hinh
..
[QUOTE="huhumalu, post: 1130863, member: 234335"]
Khai báo của bạn chỉ có giá trị trong sub mà bạn khai báo thôi.
Khi bạn dùng
[CODE=php]
Sub Khai_Bao()
    Set IP_Sht = ThisWorkbook.Sheets("INPUT_DATA")
    Set SD_Sht = ThisWorkbook.Sheets("SUM_DATA")
....
thì giá trị IP_Sht và SD_Sht chỉ có ý nghĩa trong Sub Khai_Bao, nên khi bạn gọi tại Sub Sum_Force() thì máy báo không hiểu định nghĩa;
PHP:
Sub Sum_Force()
    Call Khai_Bao
    Call Tat_man_hinh
...
Bạn tìm hiểu thêm biến toàn cục / biến cục bộ để hiểu về việc này.
p/s:
(1) VBA với mình là ngôn ngữ rất thân thiện, code như lời nói, dễ ứng dụng. Đặc biệt đối tượng bạn đang hướng tới vẫn là file excel (.xls) thì VBA là một lợi thế lớn.
(2) Bạn cần phải nắm rõ việc khai báo trong VBA, các đối tượng ít nhất là trong bảng tính hiện tại thì mới nghĩ đến chuyển đổi code sang ngôn ngữ khác.
- VB.Net cũng gần gủi với VBA vì đều họ VB, nhưng VB.net thì cần cài netframe tương ứng, khai báo và lưu trữ tận dụng tốt tài nguyên của máy thì ở tầm khác rồi. Một code đơn giản để xử lý trên Excel có thể rất nhẹ nhàng, nhưng chạy độc lập trên VB.Net thì cũng không đơn giản.
- Còn thuần nhúng *.dll để chạy cho người khác không dòm thì bạn nên tận dụng để tìm hiểu VBA trước đã.
À, cố gắng đừng viết tắt, chấm phẩy, hoa thường cho gọn gàng nhé.
Dạ vâng ạ, do em muốn viết dạng bên vb.net mà nhìu chỗ em viết nó chưa chạy được, nó rất nhìu dạng mới , nên em mới hỏi để tham khảo đoạn code tìm hiểu dễ hơn ạ
.
[/CODE]
Bạn tìm hiểu thêm biến toàn cục / biến cục bộ để hiểu về việc này.
p/s:
(1) VBA với mình là ngôn ngữ rất thân thiện, code như lời nói, dễ ứng dụng. Đặc biệt đối tượng bạn đang hướng tới vẫn là file excel (.xls) thì VBA là một lợi thế lớn.
(2) Bạn cần phải nắm rõ việc khai báo trong VBA, các đối tượng ít nhất là trong bảng tính hiện tại thì mới nghĩ đến chuyển đổi code sang ngôn ngữ khác.
- VB.Net cũng gần gủi với VBA vì đều họ VB, nhưng VB.net thì cần cài netframe tương ứng, khai báo và lưu trữ tận dụng tốt tài nguyên của máy thì ở tầm khác rồi. Một code đơn giản để xử lý trên Excel có thể rất nhẹ nhàng, nhưng chạy độc lập trên VB.Net thì cũng không đơn giản.
- Còn thuần nhúng *.dll để chạy cho người khác không dòm thì bạn nên tận dụng để tìm hiểu VBA trước đã.
À, cố gắng đừng viết tắt, chấm phẩy, hoa thường cho gọn gàng nhé.
[/QUOTE]
VB.Net nếu dùng đúng chức năng của nó thì là loại ngôn ngữ Hướng Đối Tượng.
VBA không phải, và cũng không bao giờ có ý định Hướng Đối Tượng.

Là dân HĐT thì ai cũng biết khái niệm Toàn Cục/Nội Bộ hãy nên quên đi.
Trong môi trường này, Wrapper Classes (Static) làm công việc của Toàn Cục. Và người thông thạo môi trường này biết cách gói gọn Nội Bộ.
Imports Microsoft.Office.Interop.Excel

Public Class Class1
Public Shared Sub Sum_Force()
Dim IP_Sht As Object = Myaddin.Sh_INPUTDATA
Dim SD_Sht As Object = Myaddin.Sh_SUMDATA
Dim i As Long

Dim lr As Long
lr = Math.Max(IP_Sht.Cells(1048576, "AD").End(XlDirection.xlUp).Row, 3)

Dim Pt_rngData As Object(,) = IP_Sht.Range("AE3:AK" & lr).Value
Dim Pt_rng As New System.Data.DataTable()

For j As Integer = 1 To Pt_rngData.GetLength(1)
Dim newColumn As New DataColumn()
newColumn.ColumnName = "Column " & j.ToString() ' Đặt tên cho cột mới
Pt_rng.Columns.Add(newColumn) ' Thêm cột mới vào DataTable
Next

For z As Integer = 1 To Pt_rngData.GetLength(0)
Dim newRow As DataRow = Pt_rng.NewRow()
For j As Integer = 1 To Pt_rngData.GetLength(1)
newRow(j - 1) = Pt_rngData(z, j) ' Thêm giá trị từ mảng vào từng cột tương ứng trong DataTable
Next
Pt_rng.Rows.Add(newRow) ' Thêm dòng mới vào DataTable
Next

lr = IP_Sht.Cells(1048576, "R").End(XlDirection.xlUp).Row
SD_Sht.Range("A2:R1048576").ClearContents()
SD_Sht.Range("A2").Resize(lr - 2, 6).Value = IP_Sht.Range("R3:W" & lr).Value

lr = SD_Sht.Cells(1048576, "A").End(XlDirection.xlUp).Row
Dim Angle_Arr(,) As Object
ReDim Angle_Arr(lr - 1, 10)


For i = 2 To lr
Dim S_Point As Object, E_Point As Object
S_Point = SD_Sht.Cells(i, "D").Value
E_Point = SD_Sht.Cells(i, "E").Value

Tim_XYZ(S_Point, E_Point, Pt_rng, Angle_Arr(i - 1, 0), Angle_Arr(i - 1, 1), Angle_Arr(i - 1, 2),
Angle_Arr(i - 1, 3), Angle_Arr(i - 1, 4), Angle_Arr(i - 1, 5), Angle_Arr(i - 1, 6),
Angle_Arr(i - 1, 7), Angle_Arr(i - 1, 8), Angle_Arr(i - 1, 9), Angle_Arr(i - 1, 10))
Next i

SD_Sht.Range("G2").Resize(lr - 1, 11).Value = Angle_Arr
End Sub

Private Shared Sub Tim_XYZ(ByVal S_Point As Object, ByVal E_Point As Object, ByVal Pt_rng As Range,
ByRef Angle As Object, ByRef X_Start As Object, ByRef Y_Start As Object,
ByRef Z_Start As Object, ByRef X_End As Object, ByRef Y_End As Object,
ByRef Z_End As Object, ByRef X_Cen As Object, ByRef Y_Cen As Object,
ByRef Z_Cen As Object, ByRef CHIEU As Object)
X_Start = Math.Round(Pt_rng.Application.WorksheetFunction.VLookup(S_Point, Pt_rng, 5, 0), 3)
Y_Start = Math.Round(Pt_rng.Application.WorksheetFunction.VLookup(S_Point, Pt_rng, 6, 0), 3)
Z_Start = Math.Round(Pt_rng.Application.WorksheetFunction.VLookup(S_Point, Pt_rng, 7, 0), 3)

X_End = Math.Round(Pt_rng.Application.WorksheetFunction.VLookup(E_Point, Pt_rng, 5, 0), 3)
Y_End = Math.Round(Pt_rng.Application.WorksheetFunction.VLookup(E_Point, Pt_rng, 6, 0), 3)
Z_End = Math.Round(Pt_rng.Application.WorksheetFunction.VLookup(E_Point, Pt_rng, 7, 0), 3)

X_Cen = Math.Round((X_Start + X_End) / 2, 3)
Y_Cen = Math.Round((Y_Start + Y_End) / 2, 3)
Z_Cen = Math.Round((Y_Start + Z_End) / 2, 3)

If X_End > X_Start Then
CHIEU = "THUAN"
ElseIf X_End < X_Start Then
CHIEU = "NGUOC"
Else
If Y_End > Y_Start Then
CHIEU = "THUAN"
Else
CHIEU = "NGUOC"
End If
End If

Angle = Math.Round(Math.Acos((X_End - X_Start) / Math.Sqrt((X_End - X_Start) ^ 2 + (Y_End - Y_Start) ^ 2)) * (180 / Math.PI), 3)
End Sub

End Class

Cho em hỏi tý là em viết tới chỗ Tim XYZ hiện tại nó không chạy được dữ liệu ạ, TimXYZ báo lỗi liên tục
1716197311988.png
 
Trong ngôn ngữ HĐT, Cast là hàm của nền tảng (platform) dùng để đưa tham số hàm từ kiểu/class này sang lớp kia vào chỗ có thể dùng được bên trong hàm.

Error message đó toi tạm đọc là hàm cast khong thành công mà bên trong bạn không có chỗ bắt lỗi chính thức, và nó không có chỗ bảo tự bubble lên được.
 
Web KT
Back
Top Bottom