[Hỏi]Chuyển đổi VBA sang VB6

  • Thread starter Deleted member 293
  • Ngày gửi
D

Deleted member 293

Guest
Em chào các anh chị trên diễn đàn THVBA.
Em thấy ngôn ngữ VBA và VB6 giống nhau tới hơn 90%. Vì vậy em thử chuyển đổi code từ VBA sang VB6, em đã thực hiện thử và gặp các vấn đề như sau.
Từ Excel em export (xuất ra) form, class, standard module, rồi sau đó import (nạp vào) VB6.
Userform của VBA khi sang VB6 thì thiết kế bị biến đổi.
Em tạo form mới trên VB6 và thực hiện copy các nút bấm , label từ VBA sang nhưng không được.

Câu hỏi 1: Có cách nào tạo lại form trên VB6 không?

Câu hỏi 2: Lý do không copy paste được là gì?

Em mong các anh chị giải đáp dùm em.
 

phuonghong1997

Yêu THVBA như điếu đổ
Form mà VBA Excel sử dụng là Microsoft Form 2.0 Form .
Form mà VB6 sử dụng là VB.Form.
Hai object này khác nhau, vì vậy bạn không thể chuyển đổi qua lại chúng với nhau.
Phần mở rộng file khi xuất ra đều là [*.frm] nhưng nội dung bên trong thì khác nhau rất lớn.
File frm mà bạn xuất ra từ VBA, Layout control của nó được cất vào tập tin nhị phân (frx - Binary File). Ta không thể sử dụng thao tác bằng tay chân biên tập trực tiếp frm. (Trả lời câu hỏi 2)
Về câu hỏi có thể chuyển đổi hay không, tôi nghĩ chỉ có cách duy nhất là bạn phải tạo lại form trên VB6 từ đầu. (Trả lời câu hỏi 1)
 

NhanSu

SMod
Thành viên BQT
@hoamattroi mình thấy bạn cũng dùng cả vb.net, theo mình nên chuyển sang .net vì VB6 thiếu tính thừa kế rất quan trọng để được coi là ngôn ngữ hướng đối tượng nhưng lại thường xuyên phải làm việc với đối tượng. Ngoài ra VB6 đã quá cũ rồi.
 
D

Deleted member 293

Guest
Dạ em cảm ơn.
@NhanSu : Em code cũng đơn giản thôi, không có gì phức tạp, tại em mới học code.
À anh cho em hỏi, hiện tại khi sử dụng các hàm API thì trong VB.Net anh đang khai báo như nào, anh có thể chia sẻ được không ạ?
 

phuonghong1997

Yêu THVBA như điếu đổ
VB.NET thì vẫn vậy, nhìn hơi khác một xíu thôi bạn.
Mã:
Imports System.Runtime.InteropServices

Public Class Form1
    <DllImport("user32.dll", EntryPoint:="FindWindowW")>
    Public Shared Function FindWindowW(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpClassName As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpWindowName As String) As IntPtr
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim hWnd As IntPtr = FindWindowW("TheClassName", Nothing)
        If hWnd <> IntPtr.Zero Then
            'do whatever you need with the window handle....
        End If
    End Sub
End Class
 
D

Deleted member 199

Guest
Sao tôi nhìn thấy khác nhau nhiều chứ đâu có ít đâu :
VB6:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
VB.NET:
Public Shared Function FindWindowW(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpClassName As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpWindowName As String) As IntPtr
End Function
Ví dụ:
Kiểu IntPtr này chưa gặp trong VBA cũng như VB6.
<MarshalAs(UnmanagedType.LPTStr)> : Cái cụm này là gì, sao lại xuất hiện trước các đối số vậy mọi người?
 

tuhocvba

Administrator
Thành viên BQT
Chắc là cũng phải học đó. Không biết đối số nếu là Long thì cần khai báo như nào. Với string, thì dịch cho các bạn nhé:
UnmanagedType.LPStr : Con trỏ chỉ tới một mảng ký tự có vị trí kết thúc mảng là ký tự null của chuỗi ký tự ANSI.
UnmanagedType.LPWStr : Con trỏ chỉ tới một mảng ký tự có vị trí kết thúc mảng là ký tự null của chuỗi ký tự Unicode.
UnmanagedType.LPTStr : Con trỏ chỉ tới một mảng ký tự có vị trí kết thúc mảng phụ thuộc vào platform (chắc là phụ thuộc OS-Lời người dịch) có vị trí kết thúc mảng là ký tự null
Nguồn:
 

NhanSu

SMod
Thành viên BQT
Code trong .net được biên dịch và hầu hết chạy dưới sự quản lý của CLR, đây là môi trường đảm nhiệm cấp phát bộ nhớ, thu dọn rác... Code này được gọi là managed code. Unmanaged code chạy dưới sự quản lý của hệ điều hành, ví dụ lệnh gọi đến dll của windows (không phải dll của .net) hay lệnh liên quan đến con trỏ trong C#. MarshalAs dùng để chuyển đổi kiểu dữ liệu giữa managed và unmanaged. IntPtr là kiểu dữ liệu object có giá trị là số nguyên kích thước bằng con 32 hoặc 64 bit.
 

NhanSu

SMod
Thành viên BQT
Trong .net thì kiểu int có kích thước 4 bytes, long là 8 bytes nên nếu chuyển từ vba sang .net thì long sẽ thành int còn longlong thành long.
 
T

thanhphong

Guest
Mã:
    Public Shared Function FindWindowW(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpClassName As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpWindowName As String) As IntPtr
    End Function
Sao khai báo lại có End Function ạ. Khai báo lằng nhằng vậy ạ. Có lý thuyết bài bản về việc này, hay là có nơi nào tra cứu không các bác?
 

phuonghong1997

Yêu THVBA như điếu đổ
Có chứ.
Ví dụ mấy cái hàm của @NhanSu hôm rồi giúp đỡ bạn.
VB6:
Declare PtrSafe Function GetDesktopWindow Lib "USER32" () As LongPtr
Declare PtrSafe Function GetWindow Lib "USER32" (ByVal hwnd As LongPtr, ByVal wCmd As Long) As LongPtr
Declare PtrSafe Function GetWindowText Lib "USER32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As LongPtr) As Long
Chuyển:
VB.NET:
<DllImport("user32.dll", SetLastError:=False)> _
Private Shared Function GetDesktopWindow() As IntPtr
End Function

<DllImport("user32.dll", EntryPoint:="GetWindowText")>
Public Function GetWindowText(ByVal hwnd As Integer, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
End Function

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function GetWindow(ByVal hWnd As IntPtr, ByVal uCmd As UInt32) As IntPtr
    End Function

Private Enum GetWindowType As UInteger
    GW_HWNDFIRST = 0
    GW_HWNDLAST = 1
    GW_HWNDNEXT = 2
    GW_HWNDPREV = 3
    GW_OWNER = 4
    GW_CHILD = 5
    GW_ENABLEDPOPUP = 6
End Enum
Cái này thì bạn cứ tra cứu trên trang này, ví dụ:
 

snow26

Yêu THVBA
theo mình nên chuyển sang .net vì VB6 thiếu tính thừa kế rất quan trọng
Phần mềm viết trên vb.net đòi hỏi phải có net.framework mới chạy được còn vb6 thì chạy ngon chả cần gì cả ,bạn thấy đó không phải máy nào cũng cài net.framework đâu.
 

NhanSu

SMod
Thành viên BQT
VB6 cũng cần phải có msvbvm60.dll mà bạn. .NET hỗ trợ đầy đủ unicode, 64 bit; VB6 cũng có thể làm được nhưng mất nhiều công sức. Sử dụng WIN API là phần nhỏ thôi, .NET có nhiều thư viện thay thế rồi. Riêng mình thích C# hơn VB.NET
 
Sửa lần cuối:
Top