Chọn nhiều Cell liên tục để thi hành một lệnh!

Liên hệ QC

HoaVoTuyet1980

Thành viên mới
Tham gia
22/2/08
Bài viết
12
Được thích
2
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
If Target.Address = "$A$3" Then
Call NhapLieu
End If
End Sub
Tôi tìm thấy 1 Code và ứng dụng được như vầy. Nhưng không biết có cách nào để có thể chọn 2 hay 3 Cell liên tục để chạy lệnh được không? Tức là nhấp chọn A3 rồi nhấn tiếp D5 rồi nhấn tiếp F12 mới chạy một lệnh được không.
 
Bác Anhtuan1066 nói cũng có lý.
Nhưng tôi muốn hiện đại hóa quá trình nhập dữ liệu kết hợp tính toán bằng VBA luôn khỏi cần phải nhấn phím tắt hay nhấp vào một nút lệnh rồi lại tiếp tục gõ -> rồi nhấn nút lệnh khác -> Rồi gõ ->...v.v.v. Mệt lắm
À, Bạn nhấp một cài lèo từ A -> Z bằng bàn phím thì tất cả các quá trình sử lý dữ liệu được tự động đưa vào đúng vị trí. Khi tính đến tiền lương thì nhấp vào dưới ô Lương là tự động tính ra nếu số liệu chưa đầy đủ từ các nguồn. Còn nếu đã đầy đủ rồi thì chọn vào ô Ghép lệnh trước rồi nhấn lần lượt các vị trí muốn tính toán theo thứ tự (Trái sang phải hay Trên xuống dưới .v.v..) thì nó sẽ chạy cái ào cho ra nguyên bản tính hoàn chỉnh có cả định dạng rồi tự in ra luôn. Nhưng bạn vẫn có thể làm từng bước bằng cách nhấn từng vị trí (Hay dùng phím tắt cũng được).
Mục đích là làm cho nhân viên kế toán giảm được thời gian sử lý thông tin. Họ chỉ còn nhập liệu là xong mọi công việc luôn đó mà...
-0-/.
Không biết đây có phải là ý tồi không nữa? Nhưng xin mạn phép được nhờ mọi người phần này. Là giúp tôi tạo thêm lệnh ghép các lệnh khác lại với nhau theo 1 chuỗi thứ tự lệnh nhất định. //////
Thankx..
 
Upvote 0
Hình như tôi hơi hiểu ý bạn, muốn tự động tính cái gì đó khi theo dỏi nhập liệu... Nếu thế thì xài Private Sub Worksheet_Change chứ ko phải Private Sub Worksheet_SelectionChange
Tức macro sẽ theo dỏi bạn đang gõ cái gì, đúng ý nó là nó "phi" liền...
Và nếu đúng thế thì.. phải đưa file mẫu lên thôi, chứ hướng dẩn 1 đàng, file thực tế lại 1 nẻo thì cũng bằng ko!
ANH TUẤN
 
Upvote 0
HoaVoTuyet1980 đã viết:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
If Target.Address = "$A$3" Then
Call NhapLieu
End If
End Sub
Tôi tìm thấy 1 Code và ứng dụng được như vầy. Nhưng không biết có cách nào để có thể chọn 2 hay 3 Cell liên tục để chạy lệnh được không? Tức là nhấp chọn A3 rồi nhấn tiếp D5 rồi nhấn tiếp F12 mới chạy một lệnh được không.
Bạn nghiên cứu bài của Bác SA nhé!
http://www.giaiphapexcel.com/forum/showthread.php?t=480
 
Upvote 0
Tôi nghĩ là không cần thiết lắm đâu chỉ cần tôi tìm được vị trí bác đặt lệnh ghép đó ở ô nào và các lệnh được ghép kèm theo là được rồi tôi có thể sử lý được phần còn lại. Còn dữ liệu thì chưa có. Phải đến 25 mới cần xài lận...
 
Upvote 0
Ai cha, bài toán này cũng hơi bị.. nhọc à nha...
Tôi đang nghĩ đến 1 hướng: Khi bạn nhấp chọn 1 cell nào đó (do bạn chỉ định trước trong code) thì lập tức sẽ có 1 biến hoạt động (biến K chẳng hạn)... Nó sẽ tăng giãm thế nào đó phụ thuộc vào cách tính toán của bạn... Và chỉ khi K đạt dc giá trị nào đó thì mới chạy lệnh...
Vậy nhiệm vụ của bạn là tính toán để chi khi bạn nhấp đúng cell theo trình tự thì K mới đạt dc giá trị ấy, nhấp sai nó sẽ reset... vậy thôi...
ANH TUẤN
 
Upvote 0
Bác nói vậy thì tui cũng bó tay luôn...Hổng hiểu gì hết rọi!
Có thể nói là ý tôi muốn gần giống với phím Ctrl nhưng không cần phải chọn (Tô đen) nhưng các vị trí nhất định được chọn phải thỏa một điều kiện thứ tự vậy.
Chứ nói như bác thì nó lại phải quét tất cả bảng tính xem mình đã làm đến đâu rồi à. Vậy biết khi nào nên và không nên định dạng bảng tính hay làm các bước không liên quan đên số liệu. Còn những bước liên quan đên số liệu thì có nên (hay không nên) làm cùng lúc...
Tôi cũng bí nhiều tuần rồi mới xin mạn phép hỏi diễn đàn (Nơi quy tựu nhân tài mọi miền) này tìm hướng "Tối ưu hóa hệ thống".. của mình..

Không có tài liệu nhưng có ví dụ được không bác..

Thật sự thì cái này có rất nhiều trường hợp. Nhưng tình huống lại không cho ta chọn theo trường hợp có thứ tự cố định như thứ tự tính toán dữ liệu mà tùy thuộc vào người dùng thích cái nào trước. Như in trước để xem thử hay định dạng luôn rồi,.. hay viết nháp....
Nên phần chọn xử lý tình huống thì rộng quá còn trường hợp loại bỏ thì ít. Chỉ có vài trường hợp là: nếu không có cái trước thì làm sao có cái sao được nên phải loại ra thôi..Và báo rằng lỗi kỹ thuật...
Còn đa số thì muốn nhấn sao cũng được.
Ở đây tôi loại trường hợp chọn hai ô xem như ví dụ trường hợp loại do điều kiện chưa đủ..
Còn vị trí cách chọn 3 ô thay đổi là cho độ phong phú của cách dùng...

Buồn một cái là tôi chỉ đang tìm cách thôi chứ chưa có dữ liệu. Mục đích chỉ là chọn một chũi 4 (hay nhiều hơn nếu còn sức) để làm cho linh hoạt tình huống thôi.
Tại tôi có một số công thức VBA ở đây. Theo tôi nghĩ có thể để được sắp xếp theo một trình tự nào đó mà không phải viết quá nhiều trình tự chạy cho mỗi tình huống sử lý. Như lệnh 1 chạy a, b, c; lệnh 2 chạy b, a, c, d; lệnh 3 chạy a, c, b, d..v.v.//
Mà chỉ muốn loại bỏ những lệnh thừa khi gặp lỗi thôi. Như chạy c, a, g là vô lý vì f chưa được chạy. Vì tình huống xử lý phải cực nhọc chọn If rồi lại IFElse..IFElse... hay Case...Case... vô số lần (khoảng 5!, 6!) là vất vả rồi. Sao không để người dùng tự quyết định lấy nhỉ... Mình cần cho họ biết cái nào sai thôi.
Sẳn gặp thằng Click lên Cell nên thấy tiện cho công việc này vì nút lệnh đâu có ghép được lệnh chứ. Mà không thể viết code chỉ để xử lý tình huống từng cái đúng không?
Vậy ta vẫn xử lý tình huống nhưng chỉ chọn những cái sai thôi..
Hiện nay tôi thấy cùng lắm thì nút lệnh chỉ xử lý tối đa là 3 trường hợp là đã viết code "Mệt xỉu" rồi mà đưa lên 5, 6, 7... thì thua là cái chắc.. nên mới nghĩ ra trò này..
Mà công cụ được viết cho Excel thì ngày càng phong phú tốc độ sử lý dữ liệu cũng nhanh nữa nên mắc gì mình phải làm hết những công đoạn đó chứ...hãy để cho máy tính nó làm là được rồi!

À, Ở đây chỉ liên quan đến những vấn đề là các lệnh (Sub) rời rạt không thể không chạy riêng thôi.
Nếu không được cũng chẳng lấy gì làm lạ. Vì mấy khi cuộc sống cho ta tất cả bao giờ đâu? Thanks bác AnhTuan nhiều nha!...
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn thử với macro này xem sao?

PHP:
Public A1C As Boolean
Public StrC As String

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Not Intersect(Range("A1"), Target) Is Nothing Then
    A1C = True:             StrC = ""
 ElseIf Not Intersect(Range("A4"), Target) Is Nothing Then
    If A1C = False Then
        ba
    Else
        StrC = StrC & "A4"
    End If
 ElseIf Not Intersect(Range("A3"), Target) Is Nothing Then
    If Not A1C Then
        hai
    Else
        If StrC = "A4A2" Then
            ba
            hai
            mot
            A1C = False:        Range("E2") = "FA 1"
        Else
            StrC = StrC & "A3"
        End If
    End If
 ElseIf Not Intersect(Range("A2"), Target) Is Nothing Then
    If A1C = False Then
        mot
    Else
        If StrC = "A3A4" Then
            hai
            ba
            mot
            A1C = False:        Range("E2") = "FA 2"
        Else
            StrC = StrC & "A2"
        End If
    End If
 
 End If
 
End Sub
Câu này: "Còn nếu chọn chỉ hai ô thôi thì không có Sub nào chạy cả vì sai thứ tự chọn lệnh hay hiện ra bảng thông báo sai thứ tự chọn lệnh (hay Sub Msg)." Chưa hiểu rõ vì khi chọn 1 ô nó đã chạy 1 macro rồi còn gì!!
 
Upvote 0
Ai chà em không nghĩ lại có người ứng dùng cách này đó Nghe! Em tưởng một ô được chọn là hay nhất rồi chứ! Không ngờ còn có cao thủ cao tay hơn! Yêu cầu những trường hợp này nữa chứ! "Bái phục, bái phục.." -0-/. -0-/. -0-/. Bác SA_DQ ơi theo em hiểu thì bác HoaVoTuyet1980 nói rằng nhấp vào A1 rồi chỉ nhấp vào ô A3 và A4 thôi thì nó chẳng chạy gì hết [hay một thông báo yêu cầu nhập thông tin đầy đủ, tức Msgbox("Chua du thong tin!")] không biết có đúng không vậy...@!##
HoaVoTuyet1980 đã viết:
Ở đây tôi loại trường hợp chọn hai ô xem như ví dụ trường hợp loại do điều kiện chưa đủ..
Cũng phải công nhận Bác SA_DQ này giỏi thật nha! Đề vầy mà cũng giải được..luôn. "Bái phục xát đất luôn!".
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ ta nên giãi bài toán này theo hướng tổng quát hơn bằng các bước:
1> Số hóa quá trình chọn cell, mỗi cell tương ứng với 1 số nào đó, ví dụ trong file tôi cho:
k = 1 khi chọn cell A1
k = 2 khi chọn cell A2
k = 3 khi chọn cell A3
k = 4 khi chọn cell A4
2> Thu thập k theo trình tự trước sau, ví du:
-Lúc đầu ta chọn A1, tương đương k = 1 thì biến M = M&k =1
-Tiếp theo ta chọn A3, tương đương k = 3 thì biến M = M&k = 13
-Quá trình cứ thế tiếp diển...
3> So sánh M với từ khóa nào đó, giã sử ta gõ vào cell E1 từ khóa 2413... vậy ta sẽ so sánh M với cell E1, nếu kết quả = xuất hiện thì chạy code
Từ ý tưởng này, có thể chạy bất cứ cái gì theo điều kiện cho trước... do mỗi bước select là 1 số khác nhau nên chắc ăn ko có vụ nhằm lẩn... Cái này gần giống với việc mở ổ khóa số (đúng số thì mở), lại vừa giống với việc mở cửa đi xuyên qua đường hầm (Cửa thứ nhất đã mở mới có thể mở dc của thứ 2...)
Xem ý tưởng tại Sheet1 và Sheet2... Tôi nghĩ nó khá đơn giản và dể hiểu đấy!
Code:
PHP:
Public M As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   'Xoa M khi chon ngoai vung A1:A4
   If Intersect(Range("A1:A4"), Target) Is Nothing Then
      M = ""
   End If
   'So hoa qua trinh chon cell
   If Target.Address = "$A$1" Then k = 1
   If Target.Address = "$A$2" Then k = 2
   If Target.Address = "$A$3" Then k = 3
   If Target.Address = "$A$4" Then k = 4
   'Nap gia tri k cho M theo trinh tu truoc sau
   M = M & k
   'So sanh M voi tu khoa, neu dung se chay code
   If M = Range("E1").Value Then
      Call Test
      M = ""
   End If
End Sub
ANH TUẤN
 

File đính kèm

Upvote 0
anhtuan1066 đã viết:
Xem ý tưởng tại Sheet1 và Sheet2... Tôi nghĩ nó khá đơn giản và dể hiểu đấy!
Oh, cách atuan khá hay NHƯNG theo atuan thì hóa ra là chọn đúng thì chạy - khác hướng của bạn hoavotuyet1980 rùi - bạn ý mún là thay đổi trình tự chạy của 1 tổ hợp các sub VBA (hoavotuyen1980 xác nhận đúng/không điều này nhé, tks)

SA_DQ đã viết:
Bạn thử với macro này xem sao?
Bác SA_DQ ah, hình như code của bạn lại trở lại một serri IF ELSE rùi - mà hoavotuyet1980 lại đang sơ serri này rùi???

hoavotuyet1980 đã viết:
Tại tôi có một số công thức VBA ở đây. Theo tôi nghĩ có thể để được sắp xếp theo một trình tự nào đó mà không phải viết quá nhiều trình tự chạy cho mỗi tình huống sử lý. Như lệnh 1 chạy a, b, c; lệnh 2 chạy b, a, c, d; lệnh 3 chạy a, c, b, d..v.v.//
Mà chỉ muốn loại bỏ những lệnh thừa khi gặp lỗi thôi. Như chạy c, a, g là vô lý vì f chưa được chạy. Vì tình huống xử lý phải cực nhọc chọn If rồi lại IFElse..IFElse... hay Case...Case... vô số lần (khoảng 5!, 6!) là vất vả rồi. Sao không để người dùng tự quyết định lấy nhỉ... Mình cần cho họ biết cái nào sai thôi.
Sẳn gặp thằng Click lên Cell nên thấy tiện cho công việc này vì nút lệnh đâu có ghép được lệnh chứ. Mà không thể viết code chỉ để xử lý tình huống từng cái đúng không?
Vậy ta vẫn xử lý tình huống nhưng chỉ chọn những cái sai thôi.

một ý tưởng - mới đọc sơ, thấy khá hay (khá khen cho 8X); góp ý mấy điểm thế này nhé:

- bạn ah, việc viết CT với ý tưởng chia thành SUB/ FUNCTION (chương trình con / hàm) là ý tưởng rút ngắn các đoạn code và có thể sử dụng đi sử dụng lại nhiều lần, cũng như trình tự thực hiện chúng rùi

- thứ 2 bạn nói là "ta vẫn xử lý tình huống nhưng chỉ chọn những cái sai" vậy phải cân nhắc là tổ hợp sai phải nhỏ hơn tổ hợp đúng thì mới nên cân nhắc nếu k thì giống như: ta trộn thóc với gạo -> nhặt riêng ra ta phải cân nhắc cái nào ít hơn mới nên chọn (thóc / gạo)

- Có vài ý thế này góp ý tưởng của bạn:
+ bạn muốn xét được trình tự và tổ hợp chọn --> bạn phải bắt được cả quá trình người SD chọn chứ k chỉ bắt target 1 ô như vậy -> vì thế theo tôi thì bạn nên có điều kiện : khi nào thì kết thúc chọn (Vd tổ hợp phải đủ 4 / hay có 1 ô để bấm tín hiệu (cờ) chọn xong rùi thực hiện CODE đi)

+ không biết bạn có biết các hằng của VB k nhỉ? thường nó được đặt là có giá trị số nguyên nhưng các số nguyên này cách quãng nhau --> NSD chỉ cần cho biết 1 số nguyên tổng --> tự VB biết là tổ hợp của các hằng nào được chọn:

ví dụ thô thiển (xin lỗi các women nhé) sau giúp bạn hiếu nhé:

"Chọn 1 cô gái có khả năng chọn tổ hợp 4 tiêu chuẩn đặt ra : Xinh đẹp, Năng động, Hiền thảo, Nội trợ

Người chọn theo điền form ký hiệu NSD (chỉ là VD thôi nhé) có thể đưa ra chọn các tổ hợp tiêu chuẩn khác nhau có thể 1,2,3 hay cả 4 tiêu chuẩn --> vậy làm sao để biết ng ta chọn tổ hợp nào qua chỉ 1 con số???"

Cách giải quyết thế này
đặt "Xinh đẹp" - tương ứng 1 ; "Năng động" -2 ; "Hiền thảo" -4; "Nội trợ" - 8
NSD có thể chọn trong khoản từ 1,2,..,15
KHI ĐÓ, ta có
- nếu NSD chọn 10 chẳng hạn -> 10=8+2 -> chọn 2 tiêu chuẩn:
Năng động và Nội trợ
- nếu NSD chọn 5 chẳng hạn -> 5=1+4 -> chọn 2 tiêu chuẩn: Năng động và Nội trợ
- nếu NSD chọn 15 chẳng hạn -> 15=1+2+4+8 -> chọn cả 4 tiêu chuẩn
- nếu NSD chọn 7 chẳng hạn -> 10=1+2+4 -> chọn 3 tiêu chuẩn: Xinh đẹp, Năng động và Nội trợ
...v.v

Chắc các bạn dễ hỉu vấn đề

--> bài của hoavotuyen1980 cũng nên đặt như thế cho tương ứng các ô --> dễ dàng phát ra tổ hợp
 
Upvote 0
Cảm ơn mọi người đã cố giúp em. Cảm ơn bác SA_DQ; anhtuan1066tigertiger.
Nhưng cái của em không phải là chọn đúng thì chạy như thế nào mà là chọn sai sẽ bị như thế nào còn lại thì không cần biết cứ cho chạy theo thứ tự chọn thôi. Ví dụ ta đi chợ: thì ta phải gởi xe trước rồi vào chợ mua đồ. Khi mua đồ thì bạn vẩn cứa mua chứ có cần biết mua cái gì trước đâu (Chỉ có khi phân biệt món nào dầu mở hay thịt cá thì để ở dưới còn đồ ăn sáng thì phải để ở trên cùng như vậy vẫn có tình huống phân định nhưng không rạch ròi lắm, vì có khi ta mua đồ ăn sáng rồi đến mua rau để về luôn thì sau....v.v..)
Ở đây tôi không muốn viết quá nhiều trường hợp nên mới hỏi có cách nào ghép lệnh mà chỉ tìm giá trị sai của nó để bỏ ra. Còn các trường hợp còn lại thì cho chạy theo thứ tự người ta click vào.
Nếu người ta click vào mà đúng vào trường hợp sai thì nhận thông báo lỗi. Các bác cứ cho nhiều lệnh vào thử xem có viết nổi hết các trường hợp không thì biết em cần gì à? Ở đây chỉ có 3 lệnh thôi đã có khối trường hợp rồi mà còn viết không hết nữa chứ chưa nói gì lên 4 - 5.
Còn hàm của bác SA_DQ thì chạy được nhưng khi chạy A1-A2-A3-A4 thì nó bị liệt luôn rồi không thể chạy được những thằng khác nữa.
----------------
Rất cảm ơn mọi người, mọi người cố gắng nhiều! Thanks.
 
Upvote 0
Web KT

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

Back
Top Bottom