Lập Trình Excel Server Và Client - Phương Thức TCP/IP (1 người xem)

Liên hệ QC

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

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,133
Giới tính
Nam
I/ Chuẩn bị Control VB6 để tiến hành lập trình VBA :
Server & Client - Phương Thức TCP/IP

1/ Nếu Bạn nào đã cài đặt VB6 trên máy thì bỏ qua Mục I này
2/ Nếu Bạn nào chưa cài VB6 thì tìm trên Google tải về giải nén ra Tìm trong File ISO theo đường dẫn sau:


VB6.ISO\os\system\MSWINSCK.OCX ( Control )

VB6.ISO\os\system\MSWINSCK.OCA ( Control )

3/ Áp dụng cho Windows_x64
Mã:
Copy 2 File (MSWINSCK.OCX & MSWINSCK.oca ) Vào c:\windows\SysWOW64\
4/ Áp dụng cho Windows_x32
Mã:
Copy 2 File (MSWINSCK.OCX & MSWINSCK.oca ) Vào c:\windows\system32\
5/ Xong đăng ký sử dụng thực hiện: Run cmd Run As: ( cmd Run: Administrator )

Áp dụng cho Windows_x64:
Mã:
regsvr32 c:\windows\SysWOW64\MSWINSCK.OCX
Áp dụng cho Windows_x32:
Mã:
regsvr32 c:\windows\System32\MSWINSCK.OCX

II/ Sử dụng Microsoft Winsock Control 6.0 (SP6) Từ Excel (VBA)

1/ Tools/References/Browse.../c:\windows\SysWOW64\MSWINSCK.OCX/OK
2/ Khai báo sử dụng trên VBA
*/ Sự kiện trên Sheet
Mã:
Private WithEvents tcpClient As MSWinsockLib.Winsock
*/ Tạo kết nối
Mã:
Set tcpClient = New MSWinsockLib.Winsock
3/ Xong thử code xem là ok chưa ta chép code sau và chạy nó
***/ Khai báo kết nối muộn

Mã:
Sub Test_VBA_WinSock()
    With CreateObject("MSWinSock.WinSock")
        MsgBox "IP La :" & Space(1) & .LocalIP & vbCrLf _
            & vbCrLf & "ComputerName La: " & Space(1) & .LocalHostName
    End With
End Sub
***/ Khai báo kết nối Sớm và khi viết tcpClient. (Chấm) Nó sổ ra List của Hàm (Gợi ý khi viết code)
Mã:
Sub Test_VBA_WinSock_2()
    Dim tcpClient As MSWinsockLib.Winsock
    Set tcpClient = New MSWinsockLib.Winsock
    MsgBox tcpClient.LocalIP ''Lay IP LAN
    MsgBox tcpClient.LocalHostName''Lay Ten Computer
End Sub
Nếu chạy code trên thấy cái IP Address LANTên Máy tính của Mình nổi lên là OK .... vậy là xong cái khâu chuẩn bị

III/ Tiến hành khai báo sử dụng và Viết Server & Client

1/ Tạo một File tạm keo là: Server.xlsb
2/ Tạo một File tạm keo là: Client.xlsb
3/ Viết code kết nối Server và Client với nhau thông Qua IP .... chát chít qua lại xem ok chưa
3/ Tạo kết nối từ Client To Server ( Từ Server kết nối Tới Database.accdb)
4/ Từ Client truyền 1 tham số Tạm keo Query sang Server ... xong Server lưu vào Database.accdb
5/ lấy dữ liệu từ Server về ...vvv

IV/ Khi các phần trên làm xong ta chuyển toàn bộ các phần đã làm trên Từ Control VB6 Sang Lập trình bằng Hàm Windows API

1/ Làm lại các bước đã làm viết bằng Hàm Windows API
2/ Vì khi ta viết API nó sẻ xài trên các máy khác nhau mà ko phụ thuộc vào cài Control VB6 kia đã về nghỉ hưu rồi (công nghệ bỏ quên trên 10 năm tuổi)

3/ Sử dụng Hàm API là rất khó ... cực khó luôn .... vì vậy ta làm quen cái dễ trước đã hiểu được phương thức kết nối và truyền tham số xong ... ta bước qua nghiên cứu Hàm API viết Server & Client

V/ Trên Tinh thần Mạnh vừa mò vừa viết rất mong các bạn tham gia xây dựng viết 1 cái Server và Client trên Excel để ứng dụng tốt vào công việc

1/ Bước đầu ta kết nối chat chít Qua IP LAN, Internet thành công
2/ Lấy và ghi dữ liệu Qua IP LAN, Internet thành công
3/ Chuyển toàn bộ code trên viết trên API ....
....................
Định hướng nghiên cứu là vậy .... khó khăn và phát sinh tới đâu ta cùng nhau mò tới đó .... sai ta viết lại cho đúng
Nghiên cứu mà có mất cái chi mà sợ sai hay thất bại ....?????????????!!!!!!!!!!!!
Quan trọng là ta có tinh thần, đam mê và dám nhảy xuống Sông Sài Gòn bơi hay ko thui he ===\.-0-0-0-


Vui lòng chưa trích dẫn bài này vì Mạnh đang viết cái kế hoạch nghiên cứu chưa hoàn thiện ...
còn điều chỉnh bổ sung thêm .... xong mới chính thức bước vào nghiên cứu ...

Mục tiêu sơ bộ là vậy .... Bạn nào có ý kiến cứ viết bài xuống dưới he ....

Rất mong có nhiều thành viên tham gia cùng nhau nghiên cứu Lập trình Excel Server & Client - Phương Thức TCP/IP

Chúc Thành công !
 
Lần chỉnh sửa cuối:
Chủ đề hay bạn ạ.
Bạn cho mình hỏi thêm, nếu mình cài 1 SQL Server và dùng excel để tương tác với server, database này thì sẽ khác như thế nào với việc "1/ Tạo một File tạm keo là: Server.xlsb " bạn nhỉ?
 
Upvote 0
Chủ đề hay bạn ạ.
Bạn cho mình hỏi thêm, nếu mình cài 1 SQL Server và dùng excel để tương tác với server, database này thì sẽ khác như thế nào với việc "1/ Tạo một File tạm keo là: Server.xlsb " bạn nhỉ?
1/ Nếu bạn cài SQL Server thì cứ khai báo cái chuỗi kết nối mà lấy bình thường thôi mà ... trên GPE có hết rồi đó (lấy qua LAN)

2/ Nếu lấy qua Internet thì Phải
***/ Open Port Modem cho phép kết nối từ ngoài vào trong LAN
***/ Open Port dưới tường lửa cho phép kết nối từ xa vào máy Tính .... Google ra nhiều lắm
3/ Cái vụ NAT Port modem là công phu lắm đó nếu là đăng ký gói IP tĩnh thì đơn giản lắm ... còn IP động thì cực lắm
 
Upvote 0
1/ Nếu bạn cài SQL Server thì cứ khai báo cái chuỗi kết nối mà lấy bình thường thôi mà ... trên GPE có hết rồi đó (lấy qua LAN)

2/ Nếu lấy qua Internet thì Phải
***/ Open Port Modem cho phép kết nối từ ngoài vào trong LAN
***/ Open Port dưới tường lửa cho phép kết nối từ xa vào máy Tính .... Google ra nhiều lắm
3/ Cái vụ NAT Port modem là công phu lắm đó nếu là đăng ký gói IP tĩnh thì đơn giản lắm ... còn IP động thì cực lắm
Tức là chúng ta sẽ cùng vọc control trong MSWINSCK.OCXMSWINSCK.OCA, còn client, server kia chỉ là ví dụ thôi đúng không bạn.
OK bạn, rất mong bạn tiếp tục.
(Nếu có thể thì bạn làm 1 server trên máy tính bạn, cung cấp địa chỉ, đường dẫn, tham số, rồi mọi người sẽ cùng tham gia viết client để truy suất, xử lý dữ liệu từ server máy tính bạn qua internet xem sao ^^)
 
Upvote 0
Tức là chúng ta sẽ cùng vọc control trong MSWINSCK.OCXMSWINSCK.OCA, còn client, server kia chỉ là ví dụ thôi đúng không bạn.
OK bạn, rất mong bạn tiếp tục.
(Nếu có thể thì bạn làm 1 server trên máy tính bạn, cung cấp địa chỉ, đường dẫn, tham số, rồi mọi người sẽ cùng tham gia viết client để truy suất, xử lý dữ liệu từ server máy tính bạn qua internet xem sao ^^)
Theo Mạnh tìm hiểu thì vầy:

1/ Từ xa xưa trên Windows đã có 1 số Hàm API cho người lập trình có thể ứng dụng nó Viết Server & Client ( Nhưng ứng dụng nó viết rất khó khăn và phức tạp ....rất khó với mình)

2/ Nếu bạn nào Cài VB6 thì bản thân trên VB6 nó có hổ trợ 1 Control MSWINSCK.OCX cho dân lập trình Viết Server & Client đơn giản
mà không nhất thiết phải xài tới Hàm API

3/ Sử dụng Control MSWINSCK.OCX viết Server & Client sẻ rất gần gũi với VBA ... và ta mới bắt đầu nên làm cái dễ trước
khi hiểu được các phương thức của Server và Client rồi thì ta chuyển qua xài trên Hàm API .... bỏ cái OCX kia đi cho gọn

VD vầy nếu ta lấy cái IP LAN ta phải bê cả một mớ code API hay cái gì đó dài dòng mới lấy ra
Còn ta xài MSWINSCK.OCX thì chỉ đơn giản như sau là lấy OK
Mã:
Sub Test_VBA_WinSock()
    With CreateObject("MSWinSock.WinSock")
        MsgBox "IP La :" & Space(1) & .LocalIP & vbCrLf _
            & vbCrLf & "ComputerName La: " & Space(1) & .LocalHostName
    End With
End Sub
Hay khi viết như sau: tcpClient . (Chấm) là nó sổ ra cái List tham số hay đối số của Hàm
điều đó giúp ta mới làm quen mò code sẻ thuận lợi hơn vvv...
Mã:
Sub Test_VBA_WinSock_2()
    Dim tcpClient As MSWinsockLib.Winsock
    Set tcpClient = New MSWinsockLib.Winsock
    MsgBox tcpClient.LocalIP
    MsgBox tcpClient.LocalHostName
End Sub
4/ Còn nếu ta ứng dụng Hàm API viết 1 cái Server & Client thì ta phải bê nguyên một mớ API sau + linh tinh nữa .... khó là xài sao đây... viết nó sổ ra cái List gọi ý code hay ko ?????????????!!!!!
Mã:
Public Const WS_VERSION_REQD As Long = &H101

' winsock error return
Public Const SOCKET_ERROR As Long = -1

' Address Family
Public Const AF_UNSPEC      As Long = 0
Public Const AF_INET        As Long = 2
Public Const AF_IPX         As Long = 6
Public Const AF_APPLETALK   As Long = 16
Public Const AF_NETBIOS     As Long = 17
Public Const AF_INET6       As Long = 23
Public Const AF_IRDA        As Long = 26
Public Const AF_BTH         As Long = 32

' socket type
Public Const SOCK_STREAM    As Long = 1
Public Const SOCK_DGRAM     As Long = 2
Public Const SOCK_RAW       As Long = 3
Public Const SOCK_RDM       As Long = 4
Public Const SOCK_SEQPACKET As Long = 5

' Protocol
Public Const IPPROTO_IP         As Long = 0
Public Const IPPROTO_ICMP       As Long = 1
Public Const IPPROTO_IGMP       As Long = 2
Public Const BTHPROTO_RFCOMM    As Long = 3
Public Const IPPROTO_TCP        As Long = 6
Public Const IPPROTO_UDP        As Long = 17
Public Const IPPROTO_ICMPV6     As Long = 58
Public Const IPPROTO_RM         As Long = 113

' shutdown type
Public Const SD_RECEIVE         As Integer = 0
Public Const SD_SEND            As Integer = 1
Public Const SD_BOTH            As Integer = 2

Public Const WSADESCRIPTION_LEN     As Integer = 256
Public Const WSASYS_STATUS_LEN      As Integer = 128

Public Type WSAData
    wVersion As Integer
    wHighVersion As Integer
    szDescription(WSADESCRIPTION_LEN + 1) As Byte
    szSystemStatus(WSASYS_STATUS_LEN + 1) As Byte
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpVendorInfo As Long
End Type

Public Type hostent
     h_name As LongPtr          'pointer to hostname string
     h_aliases As LongPtr       '
     h_addrtype As Integer      'address type
     h_length As Integer        'length of each address
     h_addr_list As LongPtr     'list of addresses (null end)
End Type

' address storage
Public Type sockaddr
    sa_family As Integer
    sa_data(14) As Byte
End Type

' IPv4 address
Public Type sockaddr_in
    sin_family As Integer
    sin_port As Integer
    sin_addr As Long
    sin_zero1 As Long
    sin_zero2 As Long
End Type

'---ioctl Constants
Public Const FIONREAD As Long = &H8004667F
Public Const FIONBIO  As Long = &H8004667E
Public Const FIOASYNC As Long = &H8004667D

'-------------------------------------------
' for Server:
'
Public Const FD_SETSIZE = 64
' Public Const FIONBIO = 2147772030#
'Public Const SOCKADDR_SIZE                      = 16
'Public Const SOCKADDR_IN_SIZE                   = 16
Public Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

Public Const IP_SUCCESS             As Long = 0
Public Const IP_ADD_MEMBERSHIP  As Long = 12
Public Const IP_DROP_MEMBERSHIP As Long = 13
'---network events
Public Const FD_READ                     As Long = &H1&
Public Const FD_WRITE                    As Long = &H2&
Public Const FD_OOB                      As Long = &H4&
Public Const FD_ACCEPT                   As Long = &H8&
Public Const FD_CONNECT                  As Long = &H10&
Public Const FD_CLOSE                    As Long = &H20&
Public Const FD_QOS                      As Long = &H40&
Public Const FD_GROUP_QOS                As Long = &H80&
Public Const FD_ROUTING_INTERFACE_CHANGE As Long = &H100&
Public Const FD_ADDRESS_LIST_CHANGE      As Long = &H200&

Public Const FD_MAX_EVENTS As Integer = 10

Public Type LPWSANETWORKEVENTS
    lNetworkEvents As Long
    iErrorCode(FD_MAX_EVENTS) As Long
End Type

Public Type fd_set
    fd_count As LongPtr
    fd_array(FD_SETSIZE) As Long
End Type

Public Type timeval
    tv_sec As Long
    tv_usec As Long
End Type

Public Type ip_mreq
     imr_multiaddr As Long
     imr_interface As Long
End Type

'--------------------------------------------------------------------
'- ????
'- char     :Byte
'- Int      :Long
'- short    :Integer
'- long     :Long
'- pointer  :LongPtr
'- WORD     :Integer
'- DWORD    :Long
' WSA??
Private Declare PtrSafe Function WSAStartup Lib "ws2_32.dll" (ByVal wVersionRequested As Integer, ByRef lpWSAData As WSAData) As Long
Private Declare PtrSafe Function WSACleanup Lib "ws2_32.dll" () As Long
Private Declare PtrSafe Function WSAGetLastError Lib "ws2_32.dll" () As Long
'Private Declare PtrSafe Function WSAEventSelect Lib "ws2_32.dll" (ByVal s As Long, ByVal hEventObject As Long, ByVal lNetworkEvents As Long) As Long
'Private Declare PtrSafe Function WSAAsyncSelect Lib "ws2_32.dll" (ByVal s As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal lngEvent As Long) As Long
'Private Declare PtrSafe Function WSACreateEvent Lib "ws2_32.dll" () As Long
'Private Declare PtrSafe Function WSACloseEvent Lib "ws2_32.dll" (ByVal hEvent As Long) As Boolean
'Private Declare PtrSafe Function WSAWaitForMultipleEvents Lib "ws2_32.dll" (ByVal cEvents As Long, ByVal lphEvents As Long, ByVal bWaitAll As Boolean, ByVal nTimeout As Long, ByVal bAlertable As Boolean) As Long
'Private Declare PtrSafe Function WSAWaitForMultipleEvents Lib "ws2_32.dll" (ByVal cEvents As Long, ByVal lphEvents As LongPtr, ByVal fWaitAll As Boolean, ByVal dwTimeout As Long, ByVal fAlertable As Boolean) As Long
'Private Declare PtrSafe Function WSAEnumNetworkEvents Lib "ws2_32.dll" (ByVal s As Long, ByVal hEventObject As Long, ByRef lpNetworkEvents As LPWSANETWORKEVENTS) As Long

' ??
Private Declare PtrSafe Function w_socket Lib "ws2_32.dll" Alias "socket" (ByVal af As Long, ByVal socketType As Long, ByVal protocol As Long) As Long
Private Declare PtrSafe Function w_connect Lib "ws2_32.dll" Alias "connect" (ByVal s As Long, ByRef name As sockaddr_in, ByVal namelen As Long) As Long
Private Declare PtrSafe Function w_shutdown Lib "ws2_32.dll" Alias "shutdown" (ByVal s As Long, ByVal how As Long) As Long
Private Declare PtrSafe Function w_closesocket Lib "ws2_32.dll" Alias "closesocket" (ByVal s As Long) As Long
Private Declare PtrSafe Function w_select Lib "ws2_32.dll" Alias "select" (ByVal nfds As Long, readFds As fd_set, writeFds As fd_set, exceptFds As fd_set, TIMEOUT As timeval) As Long
Private Declare PtrSafe Function w_setsockopt Lib "ws2_32.dll" Alias "setsockopt" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, ByVal optlen As Long) As Long
Private Declare PtrSafe Function w_ioctlsocket Lib "ws2_32.dll" Alias "ioctlsocket" (ByVal s As Long, ByVal cmd As Long, argp As LongPtr) As Long

' ???
Private Declare PtrSafe Function w_send Lib "ws2_32.dll" Alias "send" (ByVal s As Long, ByRef buf As Any, ByVal length As Long, ByVal flags As Long) As Long
Private Declare PtrSafe Function w_sendTo Lib "ws2_32.dll" Alias "sendto" (ByVal s As Long, ByRef buf As Any, ByVal length As Long, ByVal flags As Long, ByRef remoteAddr As sockaddr_in, ByVal remoteAddrSize As Long) As Long
Private Declare PtrSafe Function w_recv Lib "ws2_32.dll" Alias "recv" (ByVal s As Long, ByVal buf As LongPtr, ByVal length As Long, ByVal flags As Long) As Long
Private Declare PtrSafe Function w_recvFrom Lib "ws2_32.dll" Alias "recvfrom" (ByVal s As Long, ByVal buf As LongPtr, ByVal length As Long, ByVal flags As Long, fromAddr As sockaddr_in, ByVal fromAddrSize As Long) As Long

' ????
Private Declare PtrSafe Function w_bind Lib "ws2_32.dll" Alias "bind" (ByVal s As Long, ByRef name As sockaddr, ByVal namelen As Long) As Long
Private Declare PtrSafe Function w_listen Lib "ws2_32.dll" Alias "listen" (ByVal s As Long, ByVal backlog As Long) As Long
Private Declare PtrSafe Function w_accept Lib "ws2_32.dll" Alias "accept" (ByVal s As Long, ByRef addr As sockaddr, ByRef addrlen As Long) As Long

' Utility
Private Declare PtrSafe Function getsockname Lib "ws2_32.dll" (ByVal s As Long, ByRef name As sockaddr, ByRef namelen As Long) As Long
' ??????????
Private Declare PtrSafe Function gethostname Lib "ws2_32.dll" (ByVal host_name As String, ByVal namelen As Integer) As Integer
' ?????????????
Private Declare PtrSafe Function gethostbyaddr Lib "ws2_32.dll" (ByRef addr As Long, ByVal length As Long, ByVal af As Long) As LongPtr
' ??????IP???????
Private Declare PtrSafe Function gethostbyname Lib "ws2_32.dll" (ByVal host_name As String) As LongPtr
' IP??????(x.x.x.x)????????? ?8??16????
Private Declare PtrSafe Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long
' ??????????????????????????
Private Declare PtrSafe Function htons Lib "ws2_32.dll" (ByVal hostshort As Long) As Integer
Private Declare PtrSafe Function htonl Lib "ws2_32.dll" (ByVal hostlong As Long) As Long
' ??????????????????????????
Private Declare PtrSafe Function ntohl Lib "ws2_32.dll" (ByVal netlong As Long) As Long

Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal hpvDest As LongPtr, ByVal hpvSource As LongPtr, ByVal cbCopy As Long)
Private Declare PtrSafe Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal Buffer As String, ByRef Size As Long) As Long
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

' error code
Private Const WSABASEERR             As Long = 10000 'No Error
Private Const WSAEINTR               As Long = 10004 'Interrupted by system call
Private Const WSAEBADF               As Long = 10009 '???????????????????????
Private Const WSAEACCES              As Long = 10013 'access denied
Private Const WSAEFAULT              As Long = 10014 '???????????
Private Const WSAEINVAL              As Long = 10022 '?????
Private Const WSAEMFILE              As Long = 10024 'Too many open files
Private Const WSAEWOULDBLOCK         As Long = 10035 'Operation would block
Private Const WSAEINPROGRESS         As Long = 10036 'Operation now in progress
Private Const WSAEALREADY            As Long = 10037 'Operation already in progress
Private Const WSAENOTSOCK            As Long = 10038 'Socket operation on non-socket
Private Const WSAEDESTADDRREQ        As Long = 10039 '
Private Const WSAEMSGSIZE            As Long = 10040
Private Const WSAEPROTOTYPE          As Long = 10041
Private Const WSAENOPROTOOPT         As Long = 10042
Private Const WSAEPROTONOSUPPORT     As Long = 10043
Private Const WSAESOCKTNOSUPPORT     As Long = 10044
Private Const WSAEOPNOTSUPP          As Long = 10045
Private Const WSAEPFNOSUPPORT        As Long = 10046
Private Const WSAEAFNOSUPPORT        As Long = 10047
Private Const WSAEADDRINUSE          As Long = 10048
Private Const WSAEADDRNOTAVAIL       As Long = 10049
Private Const WSAENETDOWN            As Long = 10050
Private Const WSAENETUNREACH         As Long = 10051
Private Const WSAENETRESET           As Long = 10052
Private Const WSAECONNABORTED        As Long = 10053
Private Const WSAECONNRESET          As Long = 10054
Private Const WSAENOBUFS             As Long = 10055
Private Const WSAEISCONN             As Long = 10056
Private Const WSAENOTCONN            As Long = 10057
Private Const WSAESHUTDOWN           As Long = 10058
Private Const WSAETOOMANYREFS        As Long = 10059
Private Const WSAETIMEDOUT           As Long = 10060
Private Const WSAECONNREFUSED        As Long = 10061
Private Const WSAELOOP               As Long = 10062
Private Const WSAENAMETOOLONG        As Long = 10063
Private Const WSAEHOSTDOWN           As Long = 10064
Private Const WSAEHOSTUNREACH        As Long = 10065
Private Const WSAENOTEMPTY           As Long = 10066
Private Const WSAEPROCLIM            As Long = 10067
Private Const WSAEUSERS              As Long = 10068
Private Const WSAEDQUOT              As Long = 10069
Private Const WSAESTALE              As Long = 10070
Private Const WSAEREMOTE             As Long = 10071
Private Const WSASYSNOTREADY         As Long = 10091
Private Const WSAVERNOTSUPPORTED     As Long = 10092
Private Const WSANOTINITIALISED      As Long = 10093
Private Const WSAEDISCON             As Long = 10101
Private Const WSAENOMORE             As Long = 10102
Private Const WSAECANCELLED          As Long = 10103
Private Const WSAEINVALIDPROCTABLE   As Long = 10104
Private Const WSAEINVALIDPROVIDER    As Long = 10105
Private Const WSAEPROVIDERFAILEDINIT As Long = 10106
Private Const WSASYSCALLFAILURE      As Long = 10107
Private Const WSASERVICE_NOT_FOUND   As Long = 10108
Private Const WSATYPE_NOT_FOUND      As Long = 10109
Private Const WSA_E_NO_MORE          As Long = 10110
Private Const WSA_E_CANCELLED        As Long = 10111
Private Const WSAEREFUSED            As Long = 10112
Private Const WSAHOST_NOT_FOUND      As Long = 11001
Private Const WSATRY_AGAIN           As Long = 11002
Private Const WSANO_RECOVERY         As Long = 11003
Private Const WSANO_DATA             As Long = 11004
Private Const WSANO_ADDRESS          As Long = 11004
Private Const sckInvalidOp           As Long = 40020

'--------------------------------------------------
' Utilities
'

Private Function IPToText(ByVal IPAddress As Long) As String
    Dim bytes(3) As Byte
    MoveMemory VarPtr(bytes(0)), VarPtr(IPAddress), 4
    IPToText = _
        CStr(bytes(0)) & "." & _
        CStr(bytes(1)) & "." & _
        CStr(bytes(2)) & "." & _
        CStr(bytes(3))
End Function

Private Function UnsignedLongToInteger(uLong As Long) As Integer
     If uLong > 32767 Then
         UnsignedLongToInteger = uLong - 65536
     Else
         UnsignedLongToInteger = uLong
     End If
End Function
Khi bạn mới nhập nha viết Server bạn coi cái mớ code đó .... thì khả năng của bạn ngộ ra điều gì ..... Quá khó đúng không
Vậy nên làm cái đơn giản trước ok .... xong mới từng bước nghiên cứu Hàm API viết Server & Client chạy trên Excel ... vvv
 
Lần chỉnh sửa cuối:
Upvote 0
Nói về Windows Socket, tôi có một số đóng góp hiểu biết cơ bản về nó và ứng dụng nó trong môi trường kết nối Server/ Client.
Đính kèm file Demo ứng dụng của socket trên nền ứng dụng Excel. Tôi không rành lắm về Excel nên chỉ dùng UserForm trong Excel để thiết kế chứ không biết khai báo, tham chiếu để hiển thị dữ liệu lên các Sheet, range, cell trong Excel nhé.


Như bạn Mạnh đã nói, để dùng Windows Socket thì nhanh nhất là cài cái OCX của nó. Người ta đã viết, tích hợp sẳn hết rồi thì xài cho nhanh. Tất nhiên cũng có cái hạn chế của nó là tính tương thích, vụ này cũng gây đau đầu lắm. Khi phân phối ứng dụng cũng có thể viết cái hàm cài đặt tự động OCX cho máy khác. Nên cài Windows Socket Control 6.0 (SP6) nhé (đã fix một số lỗi).

Về việc tự viết lại cái MSWINSCK.OCX dựa trên các hàm API để khỏi phụ thuộc thì trên VB6 cũng đã có bạn viết lại thành công cái Class cho Windows socket rồi và xài OK nhưng chưa có ai chuyển về code VBA.

Một cái hạn chế khác khi dùng Winsock trên VBA là không dùng được kiểu Mảng (control array) mặc định có sẳn của nó. Do khả năng còn hạn chế nên trong demo tôi phải “insert” nhiều socket control thay cho mảng để có thể nhận kết nối từ nhiều Client. Bạn nào biết hướng dẫn vụ này giùm nhé.

Nói sơ qua về Winsock, theo tôi biết thì nó thường dùng trong truyền thông: Chat, video stream, tải file, nghe nhạc v.v.. Giao tiếp giữa các máy con và máy chủ qua môi trường internet. Tôi chưa thấy ứng dụng nào sử dụng Winsock để giao tiếp xử lý cơ sở dữ liệu qua mạng (chủ quan nhé). Thư viện ADO hỗ trợ tốt hơn nhiều cho việc xử lý CSDL qua mạng so với windows socket. Winsock chỉ gửi/ nhận được dữ liệu dạng chuỗi (string) thôi, không gửi được dạng đối tượng (object) như ADO recordset (VB.Net thì đã tích hợp winsock và hỗ trợ dạng object này).
Tuy ít dùng Winsock để xử lý CSDL nhưng cũng không phải là không làm được. Về chuyên sâu nữa, có hạn chế gì thì tôi cũng chưa làm qua, chưa test hết nên chưa so sánh được.


Trong Demo lần này, tôi không làm về Chat vì nó cũng không khó, mà làm về truy vấn dữ liệu từ ADO Recordset và cũng trả về ADO recordset. Demo cho trường hợp đơn giản, ít field , ít record là truy vấn Username/ Password trong CSDL Access Login.mdb để đăng nhập.
Kỹ thuật để khắc phục vụ không gửi được dạng đối tượng (recordset) qua winsock là dùng công cụ chuyển đổi Recordset sang dạng XML rồi gửi đi. Bên nhận được sẽ chuyển từ XML về lại Recordset để xử lý.


Demo:
- Client gửi thông tin Tên User/Pass cần đăng nhập dạng chuỗi về Server.
- Server dùng ADO kết nối csdl Access (login.mdb), table tblUsers để truy vấn User/pass có tồn tại và có đúng không, nếu đúng thì gửi dữ liệu về cho Client, không thì báo lỗi đăng nhập. từ demo này có thể dùng để truy vấn giá bán, sản phẩm, gửi về danh sách nhân viên v.v..
- Server dùng 6 winsock control cho 5 client kết nối (1 cái socket tôi dùng để listen thôi).


- Copy file login.mdb vào máy bạn rồi chỉnh lại đường dẫn trong chuỗi kết nối.
strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\login.mdb;Persist Security Info=False;"
- File chưa bẫy lỗi gì cả.
- Chưa viết hàm Timer trong Excel VBA nên code kiểm tra định kỳ hiện trạng kết nối của winsock chưa đầy đủ lắm nhưng cơ bản vẫn đáp ứng đúng yêu cầu gửi/nhận dữ liệu.

- Code toàn tự học nên không bài bản cho lắm. Các bạn góp ý để học hỏi thêm.

Link demo: http://www.mediafire.com/file/555pudz0ehrni1o/Winsock_ExcelDemo.rar/file

Hình minh hoạ:

 

File đính kèm

Upvote 0
Nói về Windows Socket, tôi có một số đóng góp hiểu biết cơ bản về nó và ứng dụng nó trong môi trường kết nối Server/ Client.
Đính kèm file Demo ứng dụng của socket trên nền ứng dụng Excel. Tôi không rành lắm về Excel nên chỉ dùng UserForm trong Excel để thiết kế chứ không biết khai báo, tham chiếu để hiển thị dữ liệu lên các Sheet, range, cell trong Excel nhé.


Như bạn Mạnh đã nói, để dùng Windows Socket thì nhanh nhất là cài cái OCX của nó. Người ta đã viết, tích hợp sẳn hết rồi thì xài cho nhanh. Tất nhiên cũng có cái hạn chế của nó là tính tương thích, vụ này cũng gây đau đầu lắm. Khi phân phối ứng dụng cũng có thể viết cái hàm cài đặt tự động OCX cho máy khác. Nên cài Windows Socket Control 6.0 (SP6) nhé (đã fix một số lỗi).

Về việc tự viết lại cái MSWINSCK.OCX dựa trên các hàm API để khỏi phụ thuộc thì trên VB6 cũng đã có bạn viết lại thành công cái Class cho Windows socket rồi và xài OK nhưng chưa có ai chuyển về code VBA.

Một cái hạn chế khác khi dùng Winsock trên VBA là không dùng được kiểu Mảng (control array) mặc định có sẳn của nó. Do khả năng còn hạn chế nên trong demo tôi phải “insert” nhiều socket control thay cho mảng để có thể nhận kết nối từ nhiều Client. Bạn nào biết hướng dẫn vụ này giùm nhé.

Nói sơ qua về Winsock, theo tôi biết thì nó thường dùng trong truyền thông: Chat, video stream, tải file, nghe nhạc v.v.. Giao tiếp giữa các máy con và máy chủ qua môi trường internet. Tôi chưa thấy ứng dụng nào sử dụng Winsock để giao tiếp xử lý cơ sở dữ liệu qua mạng (chủ quan nhé). Thư viện ADO hỗ trợ tốt hơn nhiều cho việc xử lý CSDL qua mạng so với windows socket. Winsock chỉ gửi/ nhận được dữ liệu dạng chuỗi (string) thôi, không gửi được dạng đối tượng (object) như ADO recordset (VB.Net thì đã tích hợp winsock và hỗ trợ dạng object này).
Tuy ít dùng Winsock để xử lý CSDL nhưng cũng không phải là không làm được. Về chuyên sâu nữa, có hạn chế gì thì tôi cũng chưa làm qua, chưa test hết nên chưa so sánh được.


Trong Demo lần này, tôi không làm về Chat vì nó cũng không khó, mà làm về truy vấn dữ liệu từ ADO Recordset và cũng trả về ADO recordset. Demo cho trường hợp đơn giản, ít field , ít record là truy vấn Username/ Password trong CSDL Access Login.mdb để đăng nhập.
Kỹ thuật để khắc phục vụ không gửi được dạng đối tượng (recordset) qua winsock là dùng công cụ chuyển đổi Recordset sang dạng XML rồi gửi đi. Bên nhận được sẽ chuyển từ XML về lại Recordset để xử lý.


Demo:
- Client gửi thông tin Tên User/Pass cần đăng nhập dạng chuỗi về Server.
- Server dùng ADO kết nối csdl Access (login.mdb), table tblUsers để truy vấn User/pass có tồn tại và có đúng không, nếu đúng thì gửi dữ liệu về cho Client, không thì báo lỗi đăng nhập. từ demo này có thể dùng để truy vấn giá bán, sản phẩm, gửi về danh sách nhân viên v.v..
- Server dùng 6 winsock control cho 5 client kết nối (1 cái socket tôi dùng để listen thôi).


- Copy file login.mdb vào máy bạn rồi chỉnh lại đường dẫn trong chuỗi kết nối.
strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\login.mdb;Persist Security Info=False;"
- File chưa bẫy lỗi gì cả.
- Chưa viết hàm Timer trong Excel VBA nên code kiểm tra định kỳ hiện trạng kết nối của winsock chưa đầy đủ lắm nhưng cơ bản vẫn đáp ứng đúng yêu cầu gửi/nhận dữ liệu.

- Code toàn tự học nên không bài bản cho lắm. Các bạn góp ý để học hỏi thêm.

Link demo: http://www.mediafire.com/file/555pudz0ehrni1o/Winsock_ExcelDemo.rar/file

Hình minh hoạ:

Mình cũng di theo cách này, tuy nhien chua hiểu cách tham chiếu share range giữa client và shever trong excel
 
Upvote 0
Nói về Windows Socket, tôi có một số đóng góp hiểu biết cơ bản về nó và ứng dụng nó trong môi trường kết nối Server/ Client.
Đính kèm file Demo ứng dụng của socket trên nền ứng dụng Excel. Tôi không rành lắm về Excel nên chỉ dùng UserForm trong Excel để thiết kế chứ không biết khai báo, tham chiếu để hiển thị dữ liệu lên các Sheet, range, cell trong Excel nhé.


Như bạn Mạnh đã nói, để dùng Windows Socket thì nhanh nhất là cài cái OCX của nó. Người ta đã viết, tích hợp sẳn hết rồi thì xài cho nhanh. Tất nhiên cũng có cái hạn chế của nó là tính tương thích, vụ này cũng gây đau đầu lắm. Khi phân phối ứng dụng cũng có thể viết cái hàm cài đặt tự động OCX cho máy khác. Nên cài Windows Socket Control 6.0 (SP6) nhé (đã fix một số lỗi).

Về việc tự viết lại cái MSWINSCK.OCX dựa trên các hàm API để khỏi phụ thuộc thì trên VB6 cũng đã có bạn viết lại thành công cái Class cho Windows socket rồi và xài OK nhưng chưa có ai chuyển về code VBA.

Một cái hạn chế khác khi dùng Winsock trên VBA là không dùng được kiểu Mảng (control array) mặc định có sẳn của nó. Do khả năng còn hạn chế nên trong demo tôi phải “insert” nhiều socket control thay cho mảng để có thể nhận kết nối từ nhiều Client. Bạn nào biết hướng dẫn vụ này giùm nhé.

Nói sơ qua về Winsock, theo tôi biết thì nó thường dùng trong truyền thông: Chat, video stream, tải file, nghe nhạc v.v.. Giao tiếp giữa các máy con và máy chủ qua môi trường internet. Tôi chưa thấy ứng dụng nào sử dụng Winsock để giao tiếp xử lý cơ sở dữ liệu qua mạng (chủ quan nhé). Thư viện ADO hỗ trợ tốt hơn nhiều cho việc xử lý CSDL qua mạng so với windows socket. Winsock chỉ gửi/ nhận được dữ liệu dạng chuỗi (string) thôi, không gửi được dạng đối tượng (object) như ADO recordset (VB.Net thì đã tích hợp winsock và hỗ trợ dạng object này).
Tuy ít dùng Winsock để xử lý CSDL nhưng cũng không phải là không làm được. Về chuyên sâu nữa, có hạn chế gì thì tôi cũng chưa làm qua, chưa test hết nên chưa so sánh được.


Trong Demo lần này, tôi không làm về Chat vì nó cũng không khó, mà làm về truy vấn dữ liệu từ ADO Recordset và cũng trả về ADO recordset. Demo cho trường hợp đơn giản, ít field , ít record là truy vấn Username/ Password trong CSDL Access Login.mdb để đăng nhập.
Kỹ thuật để khắc phục vụ không gửi được dạng đối tượng (recordset) qua winsock là dùng công cụ chuyển đổi Recordset sang dạng XML rồi gửi đi. Bên nhận được sẽ chuyển từ XML về lại Recordset để xử lý.


Demo:
- Client gửi thông tin Tên User/Pass cần đăng nhập dạng chuỗi về Server.
- Server dùng ADO kết nối csdl Access (login.mdb), table tblUsers để truy vấn User/pass có tồn tại và có đúng không, nếu đúng thì gửi dữ liệu về cho Client, không thì báo lỗi đăng nhập. từ demo này có thể dùng để truy vấn giá bán, sản phẩm, gửi về danh sách nhân viên v.v..
- Server dùng 6 winsock control cho 5 client kết nối (1 cái socket tôi dùng để listen thôi).


- Copy file login.mdb vào máy bạn rồi chỉnh lại đường dẫn trong chuỗi kết nối.
strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\login.mdb;Persist Security Info=False;"
- File chưa bẫy lỗi gì cả.
- Chưa viết hàm Timer trong Excel VBA nên code kiểm tra định kỳ hiện trạng kết nối của winsock chưa đầy đủ lắm nhưng cơ bản vẫn đáp ứng đúng yêu cầu gửi/nhận dữ liệu.

- Code toàn tự học nên không bài bản cho lắm. Các bạn góp ý để học hỏi thêm.

Link demo: http://www.mediafire.com/file/555pudz0ehrni1o/Winsock_ExcelDemo.rar/file

Hình minh hoạ:

Trước khi Mạnh lập ra thớt này thì Mạnh cũng đã vọc các kiểu rồi ... Mạnh thấy như sau

1/ Nếu Bạn kéo thả mấy cái Winsock Control đó vào Form thì khi mở Form lên nó hay báo lỗi theo hình sau ... còn lý do sao mạnh chưa xử lý được
Capture.PNG
2/ Thay vì ta kéo 5 cái Control vào Form thì ta tạo cho nó 5 cái set là hết lỗi đó
Mã:
Sub Set_Winsock()
    Dim tcpClient1, tcpClient2 As MSWinsockLib.Winsock
    Dim tcpClient3, tcpClient4, tcpClient5
   
    Set tcpClient1 = New MSWinsockLib.Winsock
    Set tcpClient2 = New MSWinsockLib.Winsock
    Set tcpClient3 = New MSWinsockLib.Winsock
    Set tcpClient4 = New MSWinsockLib.Winsock
    Set tcpClient5 = New MSWinsockLib.Winsock
End Sub
3/ Mạnh thử ko cài VB6 mà chỉ lấy mỗi 2 File MSWINSCK.OCXMSWINSCK.OCA
Mang qua máy khác đăng ký sử dụng thì nó không cho
.... Cái này Mạnh đang tìm cách xử lý nó ( khả năng là ok thôi .... viết 1 Tools add nó vào xong đăng ký cho nó)

4/ Về đính kèm file *.OCX trên Access mình không biết .... còn trên Excel Bạn có thể tham khảo bài #26 của Anh @batman1 Link sau
https://www.giaiphapexcel.com/diendan/threads/lập-trình-vba-tạo-bs-treeview-unicode-và-task-pane.136235/page-2

5/ Hiện Mạnh đang rất kẹt là:

*/ Trên file Data.acdb kia khi mạnh tạo ra VD: 20 cái Tablename xong từ Client Mạnh truyền tham số của các hàm sang làm sao nó hiểu cái nào của cái TableName nào mà ghi vào Tablename ( đang rối tinh hết lên khúc này không biết làm sao cả ???!!! )

* / khi lấy từ Server về cũng thế .....làm sao Server nó hiểu ý của Client lấy cái gì mà nó lấy cho khi có quá nhiều Hàm và Sub vvv....

6/ Từ từ sẻ tháo gỡ khó khăn từng bước 1 ... sai viết lại cho đúng vvv

Cảm ơn Bạn tham gia nghiên cứu cùng Mạnh
Bài đã được tự động gộp:

Mình cũng di theo cách này, tuy nhien chua hiểu cách tham chiếu share range giữa client và shever trong excel
ý định nghiên cứu share range để chơi cờ caro sao ????!!!!
Theo Mạnh nghĩ cái Share đó quá ít người xài tới nó và không cần thiết lắm (Theo cá nhân Mạnh) hay là thấy người ta làm được thì mình cũng cố mà làm coi sao đúng không ???!!!===\.-0-0-0-
 
Lần chỉnh sửa cuối:
Upvote 0
ý định nghiên cứu share range để chơi cờ caro sao ????!!!!
Theo Mạnh nghĩ cái Share đó quá ít người xài tới nó và không cần thiết lắm (Theo cá nhân Mạnh) hay là thấy người ta làm được thì mình cũng cố mà làm coi sao đúng không ???!!!===\.-0-0-0-
Úi giời, anh mà đã Share range đó được tức là anh đã lấy được dữ liệu thiếu gì việc để làm, ở đó mà chơi cờ caro. Đây là diễn đàn Excel thì phải làm trên Excel chứ. Cái nào hay thì nghiên cứu.
Còn anh muốn Client, Sever thì cài cái SQL Sever vừa bảo mật, vừa linh động..... chứ anh mò cái này làm gì cho nó khổ vậy.
Kiến thức em thì chỉ mò cho nó biết thôi chứ muốn làm Clien Sever phải nhiều thứ lắm không phải Connect được và insert, update, delete là xong đâu hehhehehe.
Giống như cái hàm mãng cũng vậy, viết 1 hàm mà sài cho rất là nhiều trường hợp để báo cáo rất là linh động (thay vì hồi xưa viết code làm báo cáo theo tiêu chí A, giờ muốn đổi mẫu báo cáo theo tiêu chí B lại chỉnh sửa lại code mất công không)Gruop.jpg
Hồi xưa em viết chương trình Group dữ liệu đây, nhưng nó không có linh động trong báo cáo đây
 
Lần chỉnh sửa cuối:
Upvote 0
Úi giời, anh mà đã Share range đó được tức là anh đã lấy được dữ liệu thiếu gì việc để làm, ở đó mà chơi cờ caro. Đây là diễn đàn Excel thì phải làm trên Excel chứ. Cái nào hay thì nghiên cứu.
Còn anh muốn Client, Sever thì cài cái SQL Sever vừa bảo mật, vừa linh động..... chứ anh mò cái này làm gì cho nó khổ vậy.
Kiến thức em thì chỉ mò cho nó biết thôi chứ muốn làm Clien Sever phải nhiều thứ lắm không phải Connect được và insert, update, delete là xong đâu hehhehehe.
Giống như cái hàm mãng cũng vậy, viết 1 hàm mà sài cho rất là nhiều trường hợp để báo cáo rất là linh động (thay vì hồi xưa viết code làm báo cáo theo tiêu chí A, giờ muốn đổi mẫu báo cáo theo tiêu chí B lại chỉnh sửa lại code mất công không)
1/ Vậy hả ... tại thấy cái Video VD cho cái Server và Client kết nối với nhau xong Share Range 2 người chơi Caro với nhau trên cells đó nên phán vậy :p:p

Còn Viết Server + Client trên Delphi xài các thành phần của Delphi Mạnh cảm giác thấy viết sướng hơn Trên *.OCX hay API
Mã:
begin
  LTcpClient := TIdTCPClient.Create(nil);  
  try
    try
      LTcpClient.Host := AAddress;     
      LTcpClient.Port := APort;         
      LTcpClient.ConnectTimeout := 200; 
      LTcpClient.Connect;               
      result := true;                   
    except
      result := false;      
    end;
  finally
    freeAndNil(LTcpClient);
  end;
2/ Còn tại sao Mạnh mở cái thớt này thì có lý do của nó cả đấy .... Tại sư phụ chưa nhìn thấy đó thôi he ... và cũng để có nhiều thành viên tham gia có nhiều ý kiếm và phương pháp làm khác nhau thì từ đó ta có cái nhìn bao quát hơn .... vận dụng thuật toán tốt hơn VD trên Delphi chẳng hạn vvv

3/ Còn vận dụng *.OCX để viết Server + Client là rất hạn chế nhưng khởi đầu phải qua nó để hiểu phương thức của Server và Client thôi ( quen rồi thì bỏ đi chứ ai xài OCX làm chi nữa.... Công nghệ bỏ quên trên 10 năm tuổi rồi còn chi)

4/ Có chăng viết cái Add-ins đơn giản chát chít qua LAN hay Internet cho vui vậy hay làm cái đơn giản và cũng để cho mọi người hiểu là Excel cũng viết được Server + Client chứ ko nhất thiết phải trên 1 cái Tools gì nó ghê gớm lắm ... đại khái thế vv.........
 
Upvote 0
Viết Client Server trên Excel tôi đã làm cách đây 9 năm và rất nhiều người đã biết và ứng dụng nó. Các bạn cố học làm đc là tốt chứ không cÀn chứng minh việc này nữa, nó đã có lâu rồi. :) Để làm đc những cái như báo cáo động, share range excel đều là những việc rất khó và gian nan, cần nhiều thời gian.
 
Upvote 0
*/ Trên file Data.acdb kia khi mạnh tạo ra VD: 20 cái Tablename xong từ Client Mạnh truyền tham số của các hàm sang làm sao nó hiểu cái nào của cái TableName nào mà ghi vào Tablename ( đang rối tinh hết lên khúc này không biết làm sao cả ???!!! )

* / khi lấy từ Server về cũng thế .....làm sao Server nó hiểu ý của Client lấy cái gì mà nó lấy cho khi có quá nhiều Hàm và Sub vvv....

Đây là đoạn bạn phải qui ước cá chuỗi gửi đi như thế nào để Server phân biệt. Dùng hàm Split() để lấy ra từng tham số trong chuỗi rồi so sánh, xử lý.
Ví dụ:
Dim sData As String
sData ="Access|login.mdb | tblUser | txtUsername | txtPass"
Client.SendData sData
------------------------------
Phía Server, sau khi nhậ sData sẽ Split

Dim para() As String
Dim sDatabase As String
Dim sTblName As String

para = Split (sData,"|")

Select Case para(0)
Case "Access"
sDatabase = para(1)
sTblName = para(2)
....
Case "Excel"
....
End Select



Cơ bản là vậy.
 
Upvote 0
Nói sơ qua về Winsock, theo tôi biết thì nó thường dùng trong truyền thông: Chat, video stream, tải file, nghe nhạc v.v.. Giao tiếp giữa các máy con và máy chủ qua môi trường internet. Tôi chưa thấy ứng dụng nào sử dụng Winsock để giao tiếp xử lý cơ sở dữ liệu qua mạng (chủ quan nhé). Thư viện ADO hỗ trợ tốt hơn nhiều cho việc xử lý CSDL qua mạng so với windows socket. Winsock chỉ gửi/ nhận được dữ liệu dạng chuỗi (string) thôi, không gửi được dạng đối tượng (object) như ADO recordset (VB.Net thì đã tích hợp winsock và hỗ trợ dạng object này).
Tuy ít dùng Winsock để xử lý CSDL nhưng cũng không phải là không làm được. Về chuyên sâu nữa, có hạn chế gì thì tôi cũng chưa làm qua, chưa test hết nên chưa so sánh được.

mình cũng đóng góp chút hiểu biết nhất định về Winsock nên đóng góp tí gọi là ^^,
mình nghĩ là vọc cái này nếu muốn hiểu bản chất thì phải có kiến thức nền , giống như lập trình thì phải biết chút thuật toán vậy !
kiến thức nền là mô hình mạng OSI 7 lớp , và tìm hiểu công dụng của từng lớp !
theo như mô hình thì Winsock nó nằm ở mức ứng dụng đầu tiên , hệ điều hành sẽ cung cấp các hàm và thủ tục trong Winsock để điều khiển được thiết bị mạng , theo mô hình thì trong win các lớp ứng dụng bên trên muốn xài dịch vụ mạng chỉ có thể thông qua Winsock thôi , mình thì biết có 1 cách hồi đi học can thiệp được là thông qua hàm ngắt của driver nhưng ấy là làm trong môi trường dos ^^

dưới Winsock 1 chút là lớp vận chuyển , với phương thức TCP và UPD

TCP là phương thức truyền gói tin có kiểm tra , tức là gói tin truyền đi từ A ->B thì B nó gửi xác nhận ngược về A xem có đúng là gói tin đó không , nên sẽ đảm bảo gói tin không bị thất thoát dữ liệu trong quá trình truyền tải , thích hợp với việc áp dụng cho các hệ thống cơ sở dữ liệu , chuyển khoản 1 triệu mà nhận lại 2 triệu là biết rùi đó , nhược điểm là chậm

UPD là phương thức truyền gói tin không xác nhận , tức là gửi rùi ko quan tâm gói tin chạy đi đâu ^^ , ưu điểm nhanh , nhược điểm thất thoát dữ liệu trong quá trình gửi nhận , áp dụng trong truyền thông giải trí , ví dụ các kênh coi phim lag tí không sao đúng ko , coi lại mấy hồi ^^ , hoặc bắn đột kích , xả nguyên băng đạn có trúng hay không cũng ko sao đúng ko ^^

ngoài ra còn có các phương thức truyền tin bằng các thiết bị riêng để bảo mật hơn như thiết bị truyền tín hiệu của máy ATM chẳng hạn , thiết bị khác nhau thì chắc chỉ hack phần cứng mới chui vào được ^^

còn mình để cho đơn gian thì thỉnh thoảng làm 1 cái access trung gian , rồi cho 2 bảng tính Excel vài giây kiểm tra 1 lần thì cũng đồng bộ được 2 bên , dữ liệu chính xác mà bảo trì cũng dễ

1550288649794.png

1550288313347.png
 
Upvote 0
Bài #13 có dòng sau hay đó ... tuy nhiên chi tiết thực hiện sao ... Vui lòng chỉ dùm cho mọi người một chút được không ???

còn mình để cho đơn gian thì thỉnh thoảng làm 1 cái access trung gian , rồi cho 2 bảng tính Excel vài giây kiểm tra 1 lần thì cũng đồng bộ được 2 bên , dữ liệu chính xác mà bảo trì cũng dễ
 
Lần chỉnh sửa cuối:
Upvote 0
thank bác đã quan tâm , mình mô tả mô hình đồng bộ dữ liệu như sau

1)nêu vấn đề
giả sử có 2 ô Excel , A1 và B1 ,
A1 là để máy tính 1 nhập liệu ,
B1 là để máy tính 2 nhập liệu
vấn đề là làm sao để đồng bộ 2 máy tính , máy 1 nhập liệu ô A1 nhưng vẫn thấy ô B1 cập nhật dữ liệu mới nhất !
hoặc , máy 2 nhập liệu ô B1 nhưng vẫn thấy ô A1 cập nhật dữ liệu mới nhất !
2) giải pháp
- ta làm 1 cơ sở dữ liệu ( = access hoặc sql .v.v. ) tạo 1 bảng gồm 2 cột A , B ,
- file Excel máy 1 sẽ update dữ liệu liên tục vào cột A , khi có thay đổi dữ liệu ,
- file Excel máy 2 sẽ update dữ liệu liên tục vào cột B , khi có thay đổi dữ liệu ,
- file Excel máy 1 khoảng 3 giây 1 lần lấy dữ liệu từ cột B trên database để cập nhật vào cột B trên lưới Excel
- file Excel máy 2 khoảng 3 giây 1 lần lấy dữ liệu từ cột A trên database để cập nhật vào cột A trên lưới Excel
- dữ liệu trên database sẽ là dữ liệu chính thức ,

3) các công cụ cần !
- Excel + macro
+ bộ công cụ ADODB kết nối database , insert , udate , delete
+ bộ công cụ đặt thời gian chạy tự động Application.OnTime, tham khảo bài viết làm đồng hồ
- Dadabase access hoặc sql
chào thân ái và quyết thắng ^^
 
Upvote 0
thank bác đã quan tâm , mình mô tả mô hình đồng bộ dữ liệu như sau

1)nêu vấn đề
giả sử có 2 ô Excel , A1 và B1 ,
A1 là để máy tính 1 nhập liệu ,
B1 là để máy tính 2 nhập liệu
vấn đề là làm sao để đồng bộ 2 máy tính , máy 1 nhập liệu ô A1 nhưng vẫn thấy ô B1 cập nhật dữ liệu mới nhất !
hoặc , máy 2 nhập liệu ô B1 nhưng vẫn thấy ô A1 cập nhật dữ liệu mới nhất !
2) giải pháp
- ta làm 1 cơ sở dữ liệu ( = access hoặc sql .v.v. ) tạo 1 bảng gồm 2 cột A , B ,
- file Excel máy 1 sẽ update dữ liệu liên tục vào cột A , khi có thay đổi dữ liệu ,
- file Excel máy 2 sẽ update dữ liệu liên tục vào cột B , khi có thay đổi dữ liệu ,
- file Excel máy 1 khoảng 3 giây 1 lần lấy dữ liệu từ cột B trên database để cập nhật vào cột B trên lưới Excel
- file Excel máy 2 khoảng 3 giây 1 lần lấy dữ liệu từ cột A trên database để cập nhật vào cột A trên lưới Excel
- dữ liệu trên database sẽ là dữ liệu chính thức ,

3) các công cụ cần !
- Excel + macro
+ bộ công cụ ADODB kết nối database , insert , udate , delete
+ bộ công cụ đặt thời gian chạy tự động Application.OnTime, tham khảo bài viết làm đồng hồ
- Dadabase access hoặc sql
chào thân ái và quyết thắng ^^
Cơ bản hiểu rồi đó

1/ Vấn đề là ta lấy qua LAN như thế nào ... Share Full hay là xài TCP/IP

2/ Nếu Share Full thì mạnh ko thích lắm

3/ Điều bắt buột là ta phải thêm 1 cái Database.accdb ... để lưu mọi cái Link tinh vào đó và lấy ra sử dụng khi cần thiết đúng không?!

4/ Mạnh Úp hình sau chỉ Mang tính minh họa bổ trợ cho Ý kiếm của Mạnh ngoài gia ko có ý đồ chi hết
( Rất Mong tác giả Hình minh Họa thông Cảm một chút ??!!! :p)


Capture.PNG
 
Upvote 0
thank bác đã quan tâm , mình mô tả mô hình đồng bộ dữ liệu như sau
3) các công cụ cần !
- Excel + macro
+ bộ công cụ ADODB kết nối database , insert , udate , delete
+ bộ công cụ đặt thời gian chạy tự động Application.OnTime, tham khảo bài viết làm đồng hồ
- Dadabase access hoặc sql
chào thân ái và quyết thắng ^^
Mình hiểu chút đỉnh rồi

Cơ bản hiểu rồi đó

1/ Vấn đề là ta lấy qua LAN như thế nào ... Share Full hay là xài TCP/IP

2/ Nếu Share Full thì mạnh ko thích lắm

3/ Điều bắt buột là ta phải thêm 1 cái Database.accdb ... để lưu mọi cái Link tinh vào đó và lấy ra sử dụng khi cần thiết đúng không?!

4/ Mạnh Úp hình sau chỉ Mang tính minh họa bổ trợ cho Ý kiếm của Mạnh ngoài gia ko có ý đồ chi hết
( Rất Mong tác giả Hình minh Họa thông Cảm một chút ??!!! :p)


View attachment 212251
Em nghĩ cái Database Access là chỉ lưu thông tin User để phân quyền thôi. Vì cái Data máy Clien luu vào File Excel máy Sever rồi
 
Upvote 0
Mình hiểu chút đỉnh rồi


Em nghĩ cái Database Access là chỉ lưu thông tin User để phân quyền thôi. Vì cái Data máy Clien luu vào File Excel máy Sever rồi
Sử dụng file access trung gian, là các bạn đang đi theo hướng (hình như thế) của phần mềm đang hiện diện trên GPE này thì phải
Tuy thế, giải pháp kiểu đó khá manh mún, khi phải dựa vào cơ sở dữ liệu khác.
Có lẽ phiên bản sau của Excel sẽ phát huy và nâng sức mạnh lên giống 365 hiện tại (khi đó thì người dùng sẽ thoải mãi sử dụng chung trong mạng LAN hơn)
 
Upvote 0
Cơ bản hiểu rồi đó

1/ Vấn đề là ta lấy qua LAN như thế nào ... Share Full hay là xài TCP/IP

2/ Nếu Share Full thì mạnh ko thích lắm

3/ Điều bắt buột là ta phải thêm 1 cái Database.accdb ... để lưu mọi cái Link tinh vào đó và lấy ra sử dụng khi cần thiết đúng không?!

4/ Mạnh Úp hình sau chỉ Mang tính minh họa bổ trợ cho Ý kiếm của Mạnh ngoài gia ko có ý đồ chi hết
( Rất Mong tác giả Hình minh Họa thông Cảm một chút ??!!! :p)

nói chung đồ nghề có đủ , tùy theo ứng biến của mỗi người ,
nếu làm dữ liệu tập trung thì đưa hết lên file access ,
nếu dữ liệu chính nằm trên file Excel thì chỉ thông qua access để gửi dữ liệu đến các thành viên thôi , hồn ai nấy giữ ^^ !
về bảo mật thì có thể phân quyền thư mục share access để quản lý người dùng !

mô hình dùng access này nó khác mô hình chương trình client ,server ở 1 điểm , đó là nếu có chương trình server , thì server sẽ làm nhiệm vụ lắng nghe các client , rồi thông báo cho các client nếu có thay đổi dữ liệu !
còn mô hình này thì giống như cái bảng thông báo ở khuôn viên trường học đó , ai muốn đăng thông tin thì tự lên mà đăng , ai muốn xem thông tin thì tự lên xem , cái bảng thông báo nó ko làm gì hết ^^

không nhất thiết phải là file access , file txt cũng được , miễn là có chỗ lưu dữ liệu tạm !
nhưng dùng access thì có sẵn các công cụ truy vấn dữ liệu !
còn về đồng bộ có đảm bảo hay không thì nếu viết công cụ càng đảm bảo thì càng chính xác !
các thông tin về ngày giờ , tên máy , user phải đầy đủ nó sẽ thành phần mềm chuyên nghiệp
các bạn có thể xây dựng phần mềm chat = mô hình này thử xem !
 
Lần chỉnh sửa cuối:
Upvote 0
Còn có điểm này mình chưa hình dung ra.
1. Ví dụ File Excel gồm công thức và Value cả ngàn dòng, bao gồm 10 Sheet, như vậy Server làm sao Share được.
2. Hình như mình có thể sử dụng MySQL cho Acces thì phải.
 
Upvote 0
Viết Client Server trên Excel tôi đã làm cách đây 9 năm và rất nhiều người đã biết và ứng dụng nó. Các bạn cố học làm đc là tốt chứ không cÀn chứng minh việc này nữa, nó đã có lâu rồi. :) Để làm đc những cái như báo cáo động, share range excel đều là những việc rất khó và gian nan, cần nhiều thời gian.

Tôi rất nể các công trình ngâm cứu của BlueSofts để ra các sản phẩm bổ sung cho Excel những cái mà bản thân Excel thuần không hỗ trợ. Nó không hề đơn giản,không thể chỉ học vài ngôn ngữ làm được.
Đối với tôi thì chỉ chọn giải pháp đơn giản hơn chút là khi đã xác định ứng dụng phân phối qua mạng thì cứ dùng ngôn ngữ, nền tảng nào hỗ trợ tốt cho nó thì mình chọn nó để học và lập trình. Tất nhiên tôi cũng chỉ làm những ứng dụng đơn giản trong khả năng tự học được thôi. :)
Các ứng dụng nhỏ nhỏ đơn giản thì tôi cứ đùng Access làm Front end và SQL server làm Back end thì LAN hay WAN đều chạy tốt. Dễ phát triển, dễ bảo trì. Các báo cáo (Report) Access quá tệ thì export sang Excel, Word template là cũng đáp ứng nhu cầu. :)
 
Upvote 0
Còn có điểm này mình chưa hình dung ra.
1. Ví dụ File Excel gồm công thức và Value cả ngàn dòng, bao gồm 10 Sheet, như vậy Server làm sao Share được.
2. Hình như mình có thể sử dụng MySQL cho Acces thì phải.
nói chung theo mình thì đồng bộ dữ liệu chỉ thích hợp với các loại chương trình cần cập nhật dữ liệu thường xuyên trong thời gian thực ,

mình ví dụ : ở trong bệnh viện , sảnh chờ khám bệnh , có vài màn hình máy tính , chạy chương trình excel , sẽ thể hiện danh sách các bệnh nhân đến lượt vào khám , y tá chỉ cần ngồi ở 1 máy tính nào đó nhập tên bệnh nhân lên lưới Excel thì các màn hình đều được đồng bộ dữ liệu , nó cao lắm thì cần khoảng 20-30 dòng dữ liệu là cùng !

còn công việc xử lý vài ngàn dòng Excel của bạn đâu nhất thiết phải chạy trong thời gian thực , nó thuộc dạng công việc tính toán -> trả kết quả -> xác nhận -> chuyển tiếp , tức là cứ tuần tự mà làm , bạn cứ tính Excel của bạn , rồi trả file kết quả cho người kế tiếp tính toán thôi ,
vấn đề của bạn có chăng chỉ là việc quản lý số liệu , vì càng ngày nó càng phình ra , việc chuẩn hóa dữ liệu , nó là nhánh gọi là phân tích cơ sở dữ liệu , rồi nhờ IT làm thành 1 ứng dụng , hoặc bạn có thể tự viết chương trình theo mô hình dữ liệu tập trung bằng access hoặc Excel kết nối và nhập liệu vào access chẳng hạn , Excel đóng vai trò là input dữ liệu , tức là chỉ là chương trình quản lý bình thường thôi

thêm nữa là trong trường hợp có đồng bộ vài ngàn dòng trong thời gian thực đi nữa (tôi cũng chưa hình dung ra công việc gì ) thì lại không nên dùng access , acces lúc đó trở thành tối kiến , vì khi cập nhật dữ liệu vào database , ta chỉ có thể cập nhật từng dòng 1 , ví dụ vòng for từ 1 -> 2000 để update từng dòng 1 sẽ làm máy ì đi khoảng nửa phút ( từng thử máy tui) , vì máy tính phải chạy qua chạy lại giữa client và sever khoảng 2000 lần , lúc này ta lên làm file text , ghi dữ liệu bảng tính vào text , rồi copy lên ổ đĩa dùng chung , các máy client khác copy file text về và đọc vào lưới Excel , tốc độ cải thiện đáng kể !
 
Lần chỉnh sửa cuối:
Upvote 0
thêm nữa là trong trường hợp có đồng bộ vài ngàn dòng trong thời gian thực đi nữa (tôi cũng chưa hình dung ra công việc gì ) thì lại không nên dùng access , acces lúc đó trở thành tối kiến , vì khi cập nhật dữ liệu vào database , ta chỉ có thể cập nhật từng dòng 1 , ví dụ vòng for từ 1 -> 2000 để update từng dòng 1 sẽ làm máy ì đi khoảng nửa phút ( từng thử máy tui) , vì máy tính phải chạy qua chạy lại giữa client và sever khoảng 2000 lần , lúc này ta lên làm file text , ghi dữ liệu bảng tính vào text , rồi copy lên ổ đĩa dùng chung , các máy client khác copy file text về và đọc vào lưới Excel , tốc độ cải thiện đáng kể !
Cái này khong nhất thiết phải chép nguyên filetext chỉ can chuyen xml hay json sentext la ok roi dâu cần gởi nguyên file text làm gi
 
Upvote 0
thêm nữa là trong trường hợp có đồng bộ vài ngàn dòng trong thời gian thực đi nữa (tôi cũng chưa hình dung ra công việc gì ) thì lại không nên dùng access , acces lúc đó trở thành tối kiến , vì khi cập nhật dữ liệu vào database , ta chỉ có thể cập nhật từng dòng 1 , ví dụ vòng for từ 1 -> 2000 để update từng dòng 1 sẽ làm máy ì đi khoảng nửa phút ( từng thử máy tui) , vì máy tính phải chạy qua chạy lại giữa client và sever khoảng 2000 lần , lúc này ta lên làm file text , ghi dữ liệu bảng tính vào text , rồi copy lên ổ đĩa dùng chung , các máy client khác copy file text về và đọc vào lưới Excel , tốc độ cải thiện đáng kể !

Tôi đã test lấy 80.000 dòng (10 cột) từ Excel vào table Access trong 7s với ACE.OLEDB 12.0.
Nếu update hàng loạt thì nên dùng UpdateBatch của ADO sẽ cải thiện tốc độ đáng kể thay vì dùng vòng lặp và Insert Into...


[url=https://flic.kr/p/24aQXXB]
[/url]
 
Lần chỉnh sửa cuối:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
@thuyyeu99
Nghĩ Mạnh nói chơi sao .... Xem caro nè ... Hình đó trên GPE có đầy Mạnh Copy Từ GPE đó ??!!
Server và Client Share Range chơi Caro đó
Linh sau ... chịu khó nghiên cứu đi ha sẻ có 1 Cái ExTools đang hình thành rồi đó ???!!! :p
https://www.giaiphapexcel.com/diendan/threads/có-thể-sử-dụng-1-file-excel-cho-nhiều-người-cùng-update-không.9642/#post-373593

Hình sau Mạnh lấy từ Link Trên Của Add-ins Atools

View attachment 212307
View attachment 212308
dạo này anh thay em không da động tới client sever do em không có nhu cầu phát triển trên excel. Còn trên access biết rồi mà cũng không thích sài nên không phát triển tiếp. Em chỉ quan tâm nhập liệu và bao cao thoi hehe
 
Upvote 0
Lại lòng vòng trở lại điểm ban đầu, gánh thêm 1 mớ hỗn độn _)()(-
 
Upvote 0
Lại lòng vòng trở lại điểm ban đầu, gánh thêm 1 mớ hỗn độn _)()(-
sư phụ lại thích mò lại hả ... ta lại chơi thui
có điều sư phụ có chi share cho mạnh học với thì mạnh sẻ làm ngược lại như vậy he
đó thấy ai đó keo là tương tác cùng tiến bộ đó he :p

====== tám tí
mởi thử kiểu gõ VNI và TL trên Windows 10 thấy hay ghê ...vậy là UniKeyNT vào bảo tàng quá
chuyển kiểu gõ bấm tổ hợp phím Alt + Shift là xong
 
Upvote 0
Hihihi Chưa tới lúc em Share, tới lúc thì tự khắc em sẽ se ++--//* mờ mờ ảo nó mới hấp dẫn
Em đang vướng chỗ này chưa hình dung được cái chỗ connect open File Exell trên sever từ Client (giải được chỗ này thì khả năng cao lắm ah nha hihihih)
 
Lần chỉnh sửa cuối:
Upvote 0
Hihihi Chưa tới lúc em Share, tới lúc thì tự khắc em sẽ se ++--//* mờ mờ ảo nó mới hấp dẫn
Em đang vướng chỗ này chưa hình dung được cái chỗ connect open File Exell trên sever từ Client (giải được chỗ này thì khả năng cao lắm ah nha hihihih)
coi kỹ lại bài #6 là hình dung ra thui mà :p
 
Upvote 0
Anh text thử xem ví dụ trên Sever có các hàm thì Client mở lên có không
Còn truyền ghi các vùng thì em làm được

Anh nghiên cứu chỗ này giúp em, em đi công chuyện đã chiều họp mặt rồi :cc_chinese:
 
Upvote 0
Anh text thử xem ví dụ trên Sever có các hàm thì Client mở lên có không
Còn truyền ghi các vùng thì em làm được

Anh nghiên cứu chỗ này giúp em, em đi công chuyện đã chiều họp mặt rồi :cc_chinese:
Tình hình sao Rồi ???
Mạnh mới mò ra cái Server thấy hay hay ... nó keo kết nối khoãng 200 máy chạy ok
và quan trọng là biết lấy dữ liệu từ Server về rùi
Biết chút xài API và ko lệ thuộc vào OCX của bill nữa .... mò diết ra à

Nếu viết trên Delphi thì mạnh rối tinh hết lên ... Còn VB6 làm tạm ok ... vì vậy đang làm quen phương thức, cách thức của nó trên VB6 cho ngon lành xong sau đó tới Delphi sau

Có code mẫu API chạy trên Access đó ... mà Access hay Excel thì nó cũng thế
Không biết có ai có ý kiếm gì không nhỉ ... ta tính tiếp
Capture.PNG
 
Lần chỉnh sửa cuối:
Upvote 0
To @ongke0711 + n nick có ai còn thích nghiên Cứu Server + Client lấy dữ liệu theo Phương thức TCP/IP không nhỉ ????
Mạnh Úp Code API x32 trên Access lên cho mà tham khảo .... chỉ là chát qua chát lại thôi .... còn ứng dụng sao thì tùy vào khả năng của từng Bạn
 
Upvote 0
To @ongke0711 + n nick có ai còn thích nghiên Cứu Server + Client lấy dữ liệu theo Phương thức TCP/IP không nhỉ ????
Mạnh Úp Code API x32 trên Access lên cho mà tham khảo .... chỉ là chát qua chát lại thôi .... còn ứng dụng sao thì tùy vào khả năng của từng Bạn

:) Thực ra thì mấy ứng dụng nho nhỏ của tôi làm chủ yếu về CSDL nên không có nhu cầu dùng phương thức này và cũng không ngâm cứu nó nữa. Cứ Access làm Front end, SQL Server làm Back end thì cứ kết nối qua internet chạy phà phà thôi, khỏi mất công code kiết gửi nhận gói tin. Còn các tính năng trò chuyện (Chat), gửi tin nhắn (instant message) giữa ứng dụng với nhau thì tôi thấy không cần thiết, làm cho vui thôi, chứ xài ứng dụng bên thứ 3 (zalo, fb messenger, viber...) tiện hơn nhiều.
Nếu bạn Kiều Mạnh thấy chia sẻ công sức code của mình được thì post lên, chia sẻ cho mọi người tham khảo học hỏi khi cần dùng đến.
 
Upvote 0
:) Thực ra thì mấy ứng dụng nho nhỏ của tôi làm chủ yếu về CSDL nên không có nhu cầu dùng phương thức này và cũng không ngâm cứu nó nữa. Cứ Access làm Front end, SQL Server làm Back end thì cứ kết nối qua internet chạy phà phà thôi, khỏi mất công code kiết gửi nhận gói tin. Còn các tính năng trò chuyện (Chat), gửi tin nhắn (instant message) giữa ứng dụng với nhau thì tôi thấy không cần thiết, làm cho vui thôi, chứ xài ứng dụng bên thứ 3 (zalo, fb messenger, viber...) tiện hơn nhiều.
Nếu bạn Kiều Mạnh thấy chia sẻ công sức code của mình được thì post lên, chia sẻ cho mọi người tham khảo học hỏi khi cần dùng đến.
vậy thôi nhé .... nó cũng ko thật sự cần thiết nữa rồi .... Có lẻ xóa Files đó trên máy của Mạnh đi cho nó Gọn thôi :p :D

Rất lấy làm tiếc ko ai nhắc lại bài này nữa he
Xin cảm Ơn
 
Upvote 0
:unknw:vậy thì làm nhanh và lẹ ngay và liền đi hihi@>><M?
 
Upvote 0
1/ Vậy là sau gần 2 năm tính từ ngày mở thớt này .... Việc lấy dữ liệu quan Internet Theo phương thức TCPIP gửi từng gói tin 1 thì đã biết từ lâu ==> Nó quá chậm chạp và rất khó ứng dụng vào thực tế và thân thiện với người sử dụng nó mà ko biết code trong đó viết gì khi xài nó

2/ Còn 1 cách là gửi 1 Array từ Server qua Client ..... cách này có nhiều hạn chế + khó khăn cho người sử dụng và lập trình với nó vv...

3/ Tới ngày hôm qua được sự chỉ dẫn của Google đã mò ra Phương Thức kết nối ADODB từ Client Tới Server ... Thì mọi vấn đề trở nên đơn giản như ta viết trên VBA vậy

4/ vậy là cái SQL phương thức TCPIP nằm chắc trong tầm tay rồi đó ... khi xong cái này nữa thì mọi cái sẻ rất Ok

Hiện tại đang là code trên VB6 Khi nào viết trên Delphi thành công sẻ úp tặng cho Ai đó cần mà sử dụng không giới hạn

Sử dụng rất đơn giản như VBA vậy
cách 1
Mã:
Public Sub GetDatabase_VB6()
    Dim Rst As ADODB.Recordset
    Dim Xnet As New Network
    Dim SQL As String
    Rem SQL = "select * from NhapXuatTon"
    Rem SQL = "select * from DataBaseNhap"
    SQL = "select * from DataBaseXuat"
    Rem SQL = Range("A8").Value
    Set Rst = Xnet.connect("192.168.1.9", 8181, SQL)
    Range("A1:M1000").ClearComments
    Range("A1").CopyFromRecordset Rst
    Rst.Close: Set Rst = Nothing
End Sub

cách 2
Mã:
Public Sub GetDatabase2_VB6()
    Dim Rst As ADODB.Recordset
    Dim Xnet As New Network
    Dim SQL As String, i As Long
    Rem SQL = "select * from NhapXuatTon"
    SQL = "select * from DataBaseNhap"
    Rem SQL = Range("A8").Value
    Set Rst = Xnet.connect("192.168.1.9", 8181, SQL)
    Range("A1:M1000").ClearComments
    For i = 0 To Rst.Fields.Count - 1
        Cells(1, 1 + i).Value = Rst.Fields(i).Name
    Next i
    Range("A2").CopyFromRecordset Rst
    Rst.Close: Set Rst = Nothing
End Sub

cách 3
có thể viết hàm trên Cells truyền tham số IP,Port,SQL vào cũng ok ... vì nó như viết trên VBA vậy
VD:
IP = 192.168.1.9
Port = 8181
SQL = "select * from NhapXuatTon"
Mã:
[A1] = Hàm (IP, Port, SQL)

Trả kết quả về là 1 hàm mảng ko xóa được vài Cells trong vùng dữ liệu của Hàm hay kiểu Office 365 cũng được hết
 
Lần chỉnh sửa cuối:
Upvote 0
3/ Tới ngày hôm qua được sự chỉ dẫn của Google đã mò ra Phương Thức kết nối ADODB từ Client Tới Server ... Thì mọi vấn đề trở nên đơn giản như ta viết trên VBA vậy
4/ vậy là cái SQL phương thức TCPIP nằm chắc trong tầm tay rồi đó ... khi xong cái này nữa thì mọi cái sẻ rất Ok

Chúc mừng bạn.
Quan trọng là bạn viết ra được cái Class Xnet như bác Tuân chưa? Và tôi nghĩ là đây chỉ là code để Client kết nối thôi, còn phải code phía Server nữa.
 
Upvote 0
Chúc mừng bạn.
Quan trọng là bạn viết ra được cái Class Xnet như bác Tuân chưa? Và tôi nghĩ là đây chỉ là code để Client kết nối thôi, còn phải code phía Server nữa.
Cái Mở kết Nối Class Xnet Từ Client Tới Server đã xong .... Tuyệt nhất cái đó nó mở đường cho ta code rất thân thiện như trên VBA Vậy

Lấy Từ Server về Client là Ok hết rồi đó bạn ... còn lưu từ Client tới Server chưa làm được
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh có Tìm hiểu + Hỏi nhiều tay đã từng viết Google sheet rồi ... nó keo cà chua lắm
cách củ chuối nhất cái SQL của mạnh cho Link nó tải File Google về xong gán vào SQL là ok nhất .... còn lại rất khoai

Với Mạnh Google Sheet cũng chỉ Vui vẻ là chính và làm quen với nó thôi ... biết đâu một ngày x nào đó thì xài nó
 
Upvote 0
Nhân dịp 20/10 khoe mai mốt bigUpdate Công nghệ DataHubTool /-*+/
XnectDataHubToolGoogleSheet chỉ cho cập nhật cột B C

:clap:. Em ngâm cứu luôn việc chia sẻ file .accdb (.mdb) của Access mà có thể dùng Linked Table được luôn thì Tool này đem bán ra thị trường quốc tế luôn. Cho những ai trung thành với CSDL back end là Access mà vẫn muốn kết nối qua internet.
Anh hỏi chút là đối với file Excel chia sẻ, nếu 2 User nhập liệu cùng lúc thì như thế nào nhỉ? cập nhật thời gian thật?
 
Upvote 0
:clap:. Em ngâm cứu luôn việc chia sẻ file .accdb (.mdb) của Access mà có thể dùng Linked Table được luôn thì Tool này đem bán ra thị trường quốc tế luôn. Cho những ai trung thành với CSDL back end là Access mà vẫn muốn kết nối qua internet.
Anh hỏi chút là đối với file Excel chia sẻ, nếu 2 User nhập liệu cùng lúc thì như thế nào nhỉ? cập nhật thời gian thật?
Hiện tại em chưa bẫy lỗi 2 người nhập cùng lúc anh, em cũng đang đau đầu chưa nghiệm ra phương án thích hợp để cho nhiều người dùng, người nào nhập sau cùng thì nó cập nhật của người đó anh
 
Upvote 0
xin mời ta qua đây Xem phim cho vui 1 chút ... Cái TCPIP của Mạnh chỉ có thế ... khai báo rất đơn giản như xài trên VBA vậy
Biết chút ADO trên VBA là xài quá OK -0-0-0-

 
Upvote 0
I/ Chuẩn bị Control VB6 để tiến hành lập trình VBA :
Server & Client - Phương Thức TCP/IP

1/ Nếu Bạn nào đã cài đặt VB6 trên máy thì bỏ qua Mục I này
2/
Nếu Bạn nào chưa cài VB6 thì tìm trên Google tải về giải nén ra Tìm trong File ISO theo đường dẫn sau:

VB6.ISO\os\system\MSWINSCK.OCX ( Control )

VB6.ISO\os\system\MSWINSCK.OCA ( Control )


3/ Áp dụng cho Windows_x64
Mã:
Copy 2 File (MSWINSCK.OCX & MSWINSCK.oca ) Vào c:\windows\SysWOW64\
4/ Áp dụng cho Windows_x32
Mã:
Copy 2 File (MSWINSCK.OCX & MSWINSCK.oca ) Vào c:\windows\system32\
5/ Xong đăng ký sử dụng thực hiện: Run cmd Run As: ( cmd Run: Administrator )

Áp dụng cho Windows_x64:

Mã:
regsvr32 c:\windows\SysWOW64\MSWINSCK.OCX
Áp dụng cho Windows_x32:
Mã:
regsvr32 c:\windows\System32\MSWINSCK.OCX

II/ Sử dụng Microsoft Winsock Control 6.0 (SP6) Từ Excel (VBA)

1/ Tools/References/Browse.../c:\windows\SysWOW64\MSWINSCK.OCX/OK
2/ Khai báo sử dụng trên VBA
*/ Sự kiện trên Sheet
Mã:
Private WithEvents tcpClient As MSWinsockLib.Winsock
*/ Tạo kết nối
Mã:
Set tcpClient = New MSWinsockLib.Winsock
3/ Xong thử code xem là ok chưa ta chép code sau và chạy nó
***/ Khai báo kết nối muộn

Mã:
Sub Test_VBA_WinSock()
    With CreateObject("MSWinSock.WinSock")
        MsgBox "IP La :" & Space(1) & .LocalIP & vbCrLf _
            & vbCrLf & "ComputerName La: " & Space(1) & .LocalHostName
    End With
End Sub
***/ Khai báo kết nối Sớm và khi viết tcpClient. (Chấm) Nó sổ ra List của Hàm (Gợi ý khi viết code)
Mã:
Sub Test_VBA_WinSock_2()
    Dim tcpClient As MSWinsockLib.Winsock
    Set tcpClient = New MSWinsockLib.Winsock
    MsgBox tcpClient.LocalIP ''Lay IP LAN
    MsgBox tcpClient.LocalHostName''Lay Ten Computer
End Sub
Nếu chạy code trên thấy cái IP Address LANTên Máy tính của Mình nổi lên là OK .... vậy là xong cái khâu chuẩn bị

III/ Tiến hành khai báo sử dụng và Viết Server & Client

1/ Tạo một File tạm keo là: Server.xlsb
2/ Tạo một File tạm keo là: Client.xlsb
3/ Viết code kết nối Server và Client với nhau thông Qua IP .... chát chít qua lại xem ok chưa
3/ Tạo kết nối từ Client To Server ( Từ Server kết nối Tới Database.accdb)
4/ Từ Client truyền 1 tham số Tạm keo Query sang Server ... xong Server lưu vào Database.accdb
5/ lấy dữ liệu từ Server về ...vvv

IV/ Khi các phần trên làm xong ta chuyển toàn bộ các phần đã làm trên Từ Control VB6 Sang Lập trình bằng Hàm Windows API

1/ Làm lại các bước đã làm viết bằng Hàm Windows API
2/ Vì khi ta viết API nó sẻ xài trên các máy khác nhau mà ko phụ thuộc vào cài Control VB6 kia đã về nghỉ hưu rồi (công nghệ bỏ quên trên 10 năm tuổi)

3/ Sử dụng Hàm API là rất khó ... cực khó luôn .... vì vậy ta làm quen cái dễ trước đã hiểu được phương thức kết nối và truyền tham số xong ... ta bước qua nghiên cứu Hàm API viết Server & Client

V/ Trên Tinh thần Mạnh vừa mò vừa viết rất mong các bạn tham gia xây dựng viết 1 cái Server và Client trên Excel để ứng dụng tốt vào công việc


1/ Bước đầu ta kết nối chat chít Qua IP LAN, Internet thành công
2/ Lấy và ghi dữ liệu Qua IP LAN, Internet thành công
3/ Chuyển toàn bộ code trên viết trên API ....
....................
Định hướng nghiên cứu là vậy .... khó khăn và phát sinh tới đâu ta cùng nhau mò tới đó .... sai ta viết lại cho đúng
Nghiên cứu mà có mất cái chi mà sợ sai hay thất bại ....?????????????!!!!!!!!!!!!
Quan trọng là ta có tinh thần, đam mê và dám nhảy xuống Sông Sài Gòn bơi hay ko thui he ===\.-0-0-0-


Vui lòng chưa trích dẫn bài này vì Mạnh đang viết cái kế hoạch nghiên cứu chưa hoàn thiện ...
còn điều chỉnh bổ sung thêm .... xong mới chính thức bước vào nghiên cứu ...

Mục tiêu sơ bộ là vậy .... Bạn nào có ý kiến cứ viết bài xuống dưới he ....

Rất mong có nhiều thành viên tham gia cùng nhau nghiên cứu Lập trình Excel Server & Client - Phương Thức TCP/IP

Chúc Thành công !
Cho mình hỏi bạn có chương trình cho mình xin được không.
mình chạy đoạn chương trình như bạn hướng dẫn cứ báo lỗi "Invalid use of New keyword" tại dòng lệnh "Set tcpClient = New MSWinsockLib.Winsock" dù đã khai báo "Private WithEvents tcpClient As MSWinsockLib.Winsock" và làm đầy đủ các bước trên
Sub Test_VBA_WinSock_2()
Dim tcpClient As MSWinsockLib.Winsock
Set tcpClient = New MSWinsockLib.Winsock
MsgBox tcpClient.LocalIP ''Lay IP LAN
MsgBox tcpClient.LocalHostName''Lay Ten Computer
End Sub
Cảm ơn bạn rất nhiều!
 
Upvote 0
Cho mình hỏi bạn có chương trình cho mình xin được không.
mình chạy đoạn chương trình như bạn hướng dẫn cứ báo lỗi "Invalid use of New keyword" tại dòng lệnh "Set tcpClient = New MSWinsockLib.Winsock" dù đã khai báo "Private WithEvents tcpClient As MSWinsockLib.Winsock" và làm đầy đủ các bước trên
Sub Test_VBA_WinSock_2()
Dim tcpClient As MSWinsockLib.Winsock
Set tcpClient = New MSWinsockLib.Winsock
MsgBox tcpClient.LocalIP ''Lay IP LAN
MsgBox tcpClient.LocalHostName''Lay Ten Computer
End Sub
Cảm ơn bạn rất nhiều!
Bạn qua 2 link sau tham khảo nhé



Nếu bạn biết VB6 thì cả nên tham khảo 1 loạt bài thớt này .... vì nguyên lý chung nó như nhau cả thôi .... thong thả dò đi he

Ngày qua tôi mới được 1 người bạn chia sẽ cho 1 con Virus nổi tiếng thế giới mã hóa hết toàn bộ dữ liệu rồi ....

Sẽ mất nhiều tháng để tôi mày mò nhớ lại và viết lại.... giờ này hơi buồn chút... vài điều vậy thôi
 
Upvote 0
Bạn qua 2 link sau tham khảo nhé



Nếu bạn biết VB6 thì cả nên tham khảo 1 loạt bài thớt này .... vì nguyên lý chung nó như nhau cả thôi .... thong thả dò đi he

Ngày qua tôi mới được 1 người bạn chia sẽ cho 1 con Virus nổi tiếng thế giới mã hóa hết toàn bộ dữ liệu rồi ....

Sẽ mất nhiều tháng để tôi mày mò nhớ lại và viết lại.... giờ này hơi buồn chút... vài điều vậy thôi
Bác không quét vi rút trước khi dùng file à ?
 
Upvote 0
Rảnh ngồi chơi nên xem lại thớt này sau khoãng 5 năm

Giờ này máy chủ và máy khách nhờ Em ChatGPT mà tôi viết đủ thứ chạy đa tầng đa dịch vụ các kiểu

Truy xuất dữ liệu từ xa bao gồm: Excel, Access và SQLite thao tác như thao tác trên PC vậy

Nhìn lại mới thấy là từ xa xưa trên VB6 họ đa làm tốt rồi và bây giờ nếu sử dụng thuần VB6 vẫn viết tốt cho dữ liệu là Excel và Access còn SQLite thì không thể trừ khi tự viết DLL hay sử dụng của bên thứ 3

cái cốt lõi là tìm ra phương pháp và cách vận chuyển dữ liệu đến và đi qua Internet xong từ đó viết trên bất cứ ngôn ngữ lập trình nào cũng vậy thôi

vì đó là tiêu chuẩn chung rồi chỉ khác Tools viết và cách diễn đạt ( thực hiện ) mà thôi

ai đó rảnh thử dò lại trên VB6 sử dụng Winsock viết xem là ok xong từ đó hiểu ra nguyên lý, phương thức của nó viết lại trên các ngôn ngữ lập trình hiện đại là xong vì bên ta có Em ChatGPT trợ lý là đỉnh cao của chóp rồi mờ --=0--=0--=0

Tại sao Tôi lại keo dò lại trên VB6 vì VB6 nó là Anh em ruột thịt của VBA nên code két như VBA vậy nhưng nó hổ trợ tốt hơn VBA nhiều nhiều lần và tốc độ mã máy nhanh hơn ... dựa vào đó chủ yếu tìm ra nguyên lý và phương pháp viết thôi ............ hiểu xong lại sếp vào xó khi cần chỉ tra cứu _)()(-
 
Upvote 0

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

Back
Top Bottom