Sendkeys lỗi out of memory (1 người xem)

  • Thread starter Thread starter dskhoa
  • Ngày gửi Ngày gửi
Liên hệ QC

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

dskhoa

Thành viên mới
Tham gia
2/5/16
Bài viết
28
Được thích
0
Tình hình là em có file excel với cột để search là cột B; cột cần điền dữ liệu là cột cách đó 2 ô (send key chứ ko offset đuợc vì có rất nhiều dòng ẩn biến động)
Em muốn sau khi find (sẽ nhảy cell select vào cột B) thì sendkeys "{Right 2}. đồng thời xét nếu cell null thì tự động thêm dấu "=". Phần thêm dấu tạm e chưa nghi.
Code như sau ạ.

Mã:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 2 Then
        SendKeys "{Right 2}"
    End If
End Sub

Em chỉ là đọc với cố hiểu chứ chưa có gì về VBA ạ.
Nhờ các Cụ giúp em với.

Em xin gưử toàn bộ code em sử dụng luôn ạ.

Tại This Workbook

Mã:
Option Explicit

Sub Workbook_Open()
On Error Resume Next
ThisWorkbook.Names("secret_name").Delete
Application.OnKey "{F1}", ""
Application.OnKey "{F3}", ""
Application.OnKey "{UP}", ""
Application.OnKey "{DOWN}", ""
Application.OnKey "^{g}", ""
Application.OnKey "^{d}", ""
Application.OnKey "^{r}", ""
Application.OnKey "^{w}", ""

MsgBox "Done!"""
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    DoHook False
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 2 Then
        SendKeys "{Right 2}"
    End If
End Sub

Module 1
Mã:
Private Const WM_KEYDOWN = &H100
Private Const HC_ACTION = 0
Private Const WH_KEYBOARD_LL = 13
Private Const VK_F1 = 112
'khai bao phim f1
Private Const VK_F2 = 113
'khai bao phim F2
Private Const VK_F3 = 114
'khai bao phim f3

Private Type KBDLLHOOKSTRUCT
    vkCode As Long
    scanCode As Long
    flags As Long
    time As Long
    dwExtraInfo As Long
End Type

Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As Long
Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal ncode As Long, ByVal wParam As LongPtr, lParam As Any) As Long
Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As Long
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public HookHandle As Long

Function LowLevelKeyboardProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim hs As KBDLLHOOKSTRUCT
    If code = HC_ACTION Then
'        chi xu ly khi nhan phim
        If wParam = WM_KEYDOWN Then
            CopyMemory hs, ByVal lParam, LenB(hs)
            If (hs.vkCode = VK_F1) Or (hs.vkCode = VK_F3) Then
                LowLevelKeyboardProc = 1
                     Exit Function
            End If
            End If
         End If
         LowLevelKeyboardProc = CallNextHookEx(HookHandle, code, wParam, lParam)
End Function

Sub DoHook(ByVal SetHook As Boolean)
    If SetHook Then
        HookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, Application.Hinstance, 0)
    Else
        UnhookWindowsHookEx (HookHandle)
        HookHandle = 0
    End If
End Sub
 
Lần chỉnh sửa cuối:
Tình hình là em có file excel với cột để search là cột B; cột cần điền dữ liệu là cột cách đó 2 ô (send key chứ ko offset đuợc vì có rất nhiều dòng ẩn biến động)
Em muốn sau khi find (sẽ nhảy cell select vào cột B) thì sendkeys "{Right 2}. đồng thời xét nếu cell null thì tự động thêm dấu "=". Phần thêm dấu tạm e chưa nghi.
Code như sau ạ.

Mã:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 2 Then
        SendKeys "{Right 2}"
    End If
End Sub

Em chỉ là đọc với cố hiểu chứ chưa có gì về VBA ạ.
Nhờ các Cụ giúp em với.
Nếu chỉ là chọn ô ở cột B thì "nhảy" qua phải 2 ô thì code chạy bình thường. Nhưng tôi chưa hiểu chỗ "sau khi find thì sendkeys...". Việc tìm thấy và chọn ô chứa giá trị cần tìm (trên cột B) không được ghi nhận là sự kiện SelectionChange đâu bạn.
 
Nếu chỉ là chọn ô ở cột B thì "nhảy" qua phải 2 ô thì code chạy bình thường. Nhưng tôi chưa hiểu chỗ "sau khi find thì sendkeys...". Việc tìm thấy và chọn ô chứa giá trị cần tìm (trên cột B) không được ghi nhận là sự kiện SelectionChange đâu bạn.
Cảm ơn Bạn. Cột B là cột chứa tên sản phẩm, cột C là đơn vị tính. các cột tiếp theo là số lượng từng ngày, trong đó mỗi ngày lại cộng nhiều người. Mình sẽ tìm hiểu tiếp, trong khi đó bạn có thể chỉ hướng giúp mình thêm với ạ.
 
Cứ thích suy nghĩ độc đáo.
Tôi nghĩ là nhu cầu này cũng bình thường mà, chẳng hạn như nhập dữ liệu cho ngày gần cuối tháng thì có thể ẩn các cột của những ngày phía trước đi cho đỡ rối mắt (tất nhiên đó chỉ là ví dụ thôi).
 
Tôi nghĩ là nhu cầu này cũng bình thường mà, chẳng hạn như nhập dữ liệu cho ngày gần cuối tháng thì có thể ẩn các cột của những ngày phía trước đi cho đỡ rối mắt (tất nhiên đó chỉ là ví dụ thôi).
Chính xác là như thế Bác ạ. Cứ phải Find rồi right 2 lần mỏi tay lắm. mà nhập nhiều nữa.
 
em nghĩ là offset sẽ dùng cho địa chỉ chính xác ạ. ví dụ là đang ở ô 1 là a thì qua 3 là C ạ Liệu em sai rồi sao?
Tôi nghĩ là nhu cầu này cũng bình thường mà, chẳng hạn như nhập dữ liệu cho ngày gần cuối tháng thì có thể ẩn các cột của những ngày phía trước đi cho đỡ rối mắt (tất nhiên đó chỉ là ví dụ thôi).
Bản chất là tìm cột thứ hai không ẩn tính từ cột B trờ đi, code để làm việc này dễ như ăn kẹo thì phải, sendkey nghe tới đã là thất bại rồi. Tất cả các cách lập trình mà bắt trước ( mô phỏng lại) hành động trên giao diện ( chuột, bàn phím) đều chả hay tẹo nào.
 
Chính xác là như thế Bác ạ. Cứ phải Find rồi right 2 lần mỏi tay lắm. mà nhập nhiều nữa.
À, mà bạn tìm theo cách nào vậy? Tìm bằng cách nhấn Ctrl+F à? Sao bạn không tạo một macro phục vụ việc này? Nếu làm như vậy thì có thể giải quyết được cái vụ "Find rồi right 2 lần" đấy.
 
Bản chất là tìm cột thứ hai không ẩn tính từ cột B trờ đi, code để làm việc này dễ như ăn kẹo thì phải, sendkey nghe tới đã là thất bại rồi. Tất cả các cách lập trình mà bắt trước ( mô phỏng lại) hành động trên giao diện ( chuột, bàn phím) đều chả hay tẹo nào.
Thì em đã bảo là em không biết về lập trình nên tìm cách mô phỏng thôi ạ. Bác có cao kiến gì giúp em với ạ.
 
Bản chất là tìm cột thứ hai không ẩn tính từ cột B trờ đi, code để làm việc này dễ như ăn kẹo thì phải, sendkey nghe tới đã là thất bại rồi. Tất cả các cách lập trình mà bắt trước ( mô phỏng lại) hành động trên giao diện ( chuột, bàn phím) đều chả hay tẹo nào.
Với người biết thì dễ, với người không biết thì khó, đó là chuyện thường mà. Vậy nên nếu bạn giúp người ta cách làm sao để giải quyết vấn đề thì hay hơn nhiều.
 
À, mà bạn tìm theo cách nào vậy? Tìm bằng cách nhấn Ctrl+F à? Sao bạn không tạo một macro phục vụ việc này? Nếu làm như vậy thì có thể giải quyết được cái vụ "Find rồi right 2 lần" đấy.
Em tìm bằng Ctrl F ạ. Có code cho việc tìm dữ liệu theo ý mình hả bác. Rồi khi tìm xong, sửa số lượng (cộng thêm) nó có tự cho mình tìm tiếp không ạ.
Bài đã được tự động gộp:

Với người biết thì dễ, với người không biết thì khó, đó là chuyện thường mà. Vậy nên nếu bạn giúp người ta cách làm sao để giải quyết vấn đề thì hay hơn nhiều.
cảm ơn Bác đã thông cảm cho em nhiều lắm ạ.
 
Với người biết thì dễ, với người không biết thì khó, đó là chuyện thường mà. Vậy nên nếu bạn giúp người ta cách làm sao để giải quyết vấn đề thì hay hơn nhiều.
Thì em đã bảo là em không biết về lập trình nên tìm cách mô phỏng thôi ạ. Bác có cao kiến gì giúp em với ạ.
Nhìn cái mớ code dùng api thì mình đã toát mồ hôi rồi, còn nói gì tới giúp hay suy nghĩ. Đưa file lên, nói rõ mục đích ra, kiểu gì chả có các cao thủ ra tay giúp.
Mà thuật toán cũng đã nói gần hết rồi còn gì.
 
Nhìn cái mớ code dùng api thì mình đã toát mồ hôi rồi, còn nói gì tới giúp hay suy nghĩ. Đưa file lên, nói rõ mục đích ra, kiểu gì chả có các cao thủ ra tay giúp.
Nhờ các bác giúp em. Công việc chỉ là tìm tên thuốc, nhập số lượng theo ngày, không tự cộng số lượng trong ô thành 1 số để em còn đối chiếu xem mình nhập sai hay đúng ạ.
 

File đính kèm

Nhờ các bác giúp em. Công việc chỉ là tìm tên thuốc, nhập số lượng theo ngày, không tự cộng số lượng trong ô thành 1 số để em còn đối chiếu xem mình nhập sai hay đúng ạ.
Bạn thử code này (đặt trong module) nhé, để thuận tiện thì đặt cho nó một phím tắt để dễ gọi.
Mã:
Sub TimKiem()
    Dim S As String, Cll As Range
    On Error Resume Next
    S = InputBox("Nhap tu can tim", "Tim kiem")
    If S <> "" Then
        Set Cll = [B:B].Find(S, , xlValues, xlPart).Offset(, 2)
        If Cll Is Nothing Then
            MsgBox "Khong tim thay"
        Else
            Do While Cll.EntireColumn.Hidden
                Set Cll = Cll.Offset(, 1)
            Loop
            Cll.Select
        End If
    End If
End Sub
 
Bạn thử code này (đặt trong module) nhé, để thuận tiện thì đặt cho nó một phím tắt để dễ
Cảm ơn các Bác, đặc biệt là bác nghiaphuc đã giúp đỡ. Vấn đề của em đã được giải quyết.
em dùng code sau>

Mã:
Sub TimKiem()
    Dim S As String, Cll As Range
    On Error Resume Next
    S = InputBox(Prompt & "Nhap tu can tim", "Tim kiem")
    If S <> "" Then
        Set Cll = [B:B].Find(S, , xlValues, xlPart).Offset(, 2)
        If Cll Is Nothing Then
            MsgBox "Khong tim thay"
        Else
            Do While Cll.EntireColumn.Hidden
                Set Cll = Cll.Offset(, 1)
            Loop
            Cll.Select
            If Cll.Value <> 0 Then
            Application.SendKeys "{F2}"
            Else: Cll.Value = "="
            Application.SendKeys "{F2}"
            End If
           
        End If
    End If
End Sub

blink key
Mã:
Application.OnKey "^{f}", "TimKiem"

Cảm giác thật là toẹt vời ông mặt trời :)
 
Tình hình là em có file excel với cột để search là cột B; cột cần điền dữ liệu là cột cách đó 2 ô (send key chứ ko offset đuợc vì có rất nhiều dòng ẩn biến động)
Em muốn sau khi find (sẽ nhảy cell select vào cột B) thì sendkeys "{Right 2}. đồng thời xét nếu cell null thì tự động thêm dấu "=". Phần thêm dấu tạm e chưa nghi.
Code như sau ạ.

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 2 Then
        SendKeys "{Right 2}"
    End If
End Sub
Trong Workbook làm gì có sự kiện Worksheet_SelectionChange mà chạy chứ. Sự kiện Change nếu viết trong Thisworkbook thì phải là
Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Có vẽ như bạn copy sự kiện trong sheet rồi paste vào Thisworkbook?
Ngoài ra thì xem file + đọc mô tả:
Công việc chỉ là tìm tên thuốc, nhập số lượng theo ngày...
cũng hổng hiểu muốn làm cái gì luôn
Nói chung: SendKeys là thứ dở tệ trong lập trình và bạn nên tránh càng xa càng tốt
 
Trong Workbook làm gì có sự kiện Worksheet_SelectionChange mà chạy chứ. Sự kiện Change nếu viết trong Thisworkbook thì phải là
Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Có vẽ như bạn copy sự kiện trong sheet rồi paste vào Thisworkbook?
Ngoài ra thì xem file + đọc mô tả:

cũng hổng hiểu muốn làm cái gì luôn
Vấn đề đã được giải quyết bác ạ.
 
Web KT

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

Back
Top Bottom