Lập Trình Excel Server Và Client - Phương Thức TCP/IP

Liên hệ QC

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,421
Được thích
4,032
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

  • Winsock_ExcelDemo.rar
    93.6 KB · Đọc: 106
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
Web KT
Back
Top Bottom