Xác định phạm vị một range (mảng) theo vị trí vùng được xác định trên excel.

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

qazxsw

Thành viên chính thức
Tham gia
31/7/09
Bài viết
57
Được thích
4
Em chào các anh chị em trên GPE.
Em đang gặp vấn đề đó là cần xác định vị trí của một range trên excel theo vị trí vùng mà khi ta kéo con trỏ chuột.
Vì dụ ta giữ chuột trái từ ô A5 tới ô A9 , thì code vba đưa ra giá trị dòng,cột ở điểm đầu tiên đặt chuột là : 5 , 1. Điểm thứ 2 là 9,1
Trường hợ từ ô A5 tới ô C9 thì codevba đưa ra: điểm đầu tiên là 5,1 . Điểm thứ 2 là 9,3
Giá trị đưa ra được gán vào biến .
Em mong nhận được hỗ trợ từ các anh chị em.
Em cảm ơn
 
Điểm 1:
Mã:
Cells(Selection(1, 1).Row, Selection(1, 1).Column) = "First cell"
Điểm 2:
Mã:
Rw = Selection(1, 1).Row + Selection.Rows.Count - 1
Col = Selection(1, 1).Column + Selection.Columns.Count - 1
Cells(Rw, Col) = "Last cell"
 
Em chào các anh chị em trên GPE.
Em đang gặp vấn đề đó là cần xác định vị trí của một range trên excel theo vị trí vùng mà khi ta kéo con trỏ chuột.
Vì dụ ta giữ chuột trái từ ô A5 tới ô A9 , thì code vba đưa ra giá trị dòng,cột ở điểm đầu tiên đặt chuột là : 5 , 1. Điểm thứ 2 là 9,1
Trường hợ từ ô A5 tới ô C9 thì codevba đưa ra: điểm đầu tiên là 5,1 . Điểm thứ 2 là 9,3
Giá trị đưa ra được gán vào biến .
Em mong nhận được hỗ trợ từ các anh chị em.
Em cảm ơn
Mục đích làm gì vậy bạn.
 
Điểm 1:
Mã:
Cells(Selection(1, 1).Row, Selection(1, 1).Column) = "First cell"
Điểm 2:
Mã:
Rw = Selection(1, 1).Row + Selection.Rows.Count - 1
Col = Selection(1, 1).Column + Selection.Columns.Count - 1
Cells(Rw, Col) = "Last cell"
Cảm ơn bạn đã hỗ trợ.
Bài đã được tự động gộp:

Cảm ơn bạn đã hỗ trợ.
 
bình thường mình đang sử dụng lệnh for each khi duyệt tại vùng chọn bởi chuột:
Worksheets("DenPyo").Activate
Dim Rng As Range
Set Rng = Range(Selection.Address)
For Each c In Worksheets("DenPyo").Range(Rng.Address).Cells

Nhưng mình muốn biết vị trí vùng chọn theo địa chỉ ô cells để xử lý thêm ở trong chương trình.
 
Thêm 1 ví dụ cho vui cửa nhà:
PHP:
Sub DiaChiOCuoi()
 Dim Rng As Range
 
 Set Rng = [B7].CurrentRegion.Resize(5)
 MsgBox "Dòng: " & Rng(1).Row & Chr(10) & _
    "Côt: " & Rng(1).Column, , "Ô Dâu Tiên Bên Trái:"
 MsgBox "Dòng: " & Rng(Rng.Cells.Count).Row & Chr(10) & _
    "Côt: " & Rng(Rng.Cells.Count).Column, , "Ô Cuôi Bên Phai:"
End Sub
 
Nhưng mình muốn biết vị trí vùng chọn theo địa chỉ ô cells để xử lý thêm ở trong chương trình.

Một cách khác dùng InputBox:

CSS:
Sub getRange()
    Dim rngSelect As Range, sTit As String
    sTit = "Quet chon vung du lieu"
    
    On Error Resume Next    'Vuot loi 424 khi bam Cancel
    Set rngSelect = Application.InputBox("", sTit, "A1:B3", Type:=8)
    Sheet1.Range("A1").Value = rngSelect.Address
End Sub
 
Nhưng mình muốn biết vị trí vùng chọn theo địa chỉ ô cells để xử lý thêm ở trong chương trình.

Tới bài #6 thì thớt đã lòi ra đó chỉ là cái ý tưởng trung gian mới lóe lên trong đầu của thớt thôi.

Thớt cần trình bày chi tiết, rõ ràng nội dung tổng thể yêu cầu bài toán đang làm là gì.
Chẳng dại gì mà chạy theo mấy cái ý tưởng tuyệt vời đó.
 
Tới bài #6 thì thớt đã lòi ra đó chỉ là cái ý tưởng trung gian mới lóe lên trong đầu của thớt thôi.

Thớt cần trình bày chi tiết, rõ ràng nội dung tổng thể yêu cầu bài toán đang làm là gì.
Chẳng dại gì mà chạy theo mấy cái ý tưởng tuyệt vời đó.
Thế thì em mới hỏi là mục đích để làm gì.Chứ có code đâu.
 
bạn cho mình hỏi thêm:
Bình thường khi xác định 1 mảng thì mình dùng lệnh:
nguon = Sheet15.[A6].Resize(5, 37).Value
cho mình hỏi khi đối với [A6] trong trường hợp số 6 là một biến thì được viết như nào?
( mình thấy trong lệnh có cấu trúc: cells("A"&i) với i là biến). Nhưng làm tương tự không được.

Mình cảm ơn bạn
 
Tới bài #6 thì thớt đã lòi ra đó chỉ là cái ý tưởng trung gian mới lóe lên trong đầu của thớt thôi.
...
Thế thì em mới hỏi là mục đích để làm gì.Chứ có code đâu.
Đâu cần tới bài nào. Ngay từ đầu thì ai cũng có thể thấy rằng tìm vị trí 2 góc của một range là một "sáng kiến" mà 95% trường hợp là thừa thải. mà sáng kiến thừa thải thì phải đi với code rườm rà nhất (code bài #4).

nguon = Sheet15.[A6].Resize(5, 37).Value
cho mình hỏi khi đối với [A6] trong trường hợp số 6 là một biến thì được viết như nào?
( mình thấy trong lệnh có cấu trúc: cells("A"&i) với i là biến). Nhưng làm tương tự không được.
Do bạn học cách viết [A1] ở các bài cách đây hàng chục năm. Lúc đó người ta chỉ biết viết code cho nhanh mà khong hiểu ý nghĩa của cặp ngoặc vuông.
Toán tử ngoặc vuông chỉ nhận trị hiển nhiên (literals), không thể nhận cho biểu thức tính toán.
 
Tới bài #6 thì thớt đã lòi ra đó chỉ là cái ý tưởng trung gian mới lóe lên trong đầu của thớt thôi.

Thớt cần trình bày chi tiết, rõ ràng nội dung tổng thể yêu cầu bài toán đang làm là gì.
Chẳng dại gì mà chạy theo mấy cái ý tưởng tuyệt vời đó.
mình chưa hiểu câu hỏi của bạn. Về bài toán của mình thì mình cố gắng tìm hiểu trước và giải quyết, gặp khó khăn mình hỏi trên nhóm.
Câu hỏi của mình làm bạn khó hiểu quá ?
 
mình chưa hiểu câu hỏi của bạn. Về bài toán của mình thì mình cố gắng tìm hiểu trước và giải quyết, gặp khó khăn mình hỏi trên nhóm.
Câu hỏi của mình làm bạn khó hiểu quá ?

Để đi qua một con sông có nhiều phương án:
- Tự đóng thuyền, bè rồi đi qua
- Tự xây một cây cầu bắc qua con sông rồi đi qua bằng cây cầu đó
- Đi qua bằng một cây cầu bắc qua con sông đó đã có (ở gần)
- Đi bằng thuyền, phà của người khác
- Tự bơi qua sông
- ...
 
Để đi qua một con sông có nhiều phương án:
- Tự đóng thuyền, bè rồi đi qua
- Tự xây một cây cầu bắc qua con sông rồi đi qua bằng cây cầu đó
- Đi qua bằng một cây cầu bắc qua con sông đó đã có (ở gần)
- Đi bằng thuyền, phà của người khác
- Tự bơi qua sông
- ...
Thiếu 2 trường hợp chả cần phương án gì cả:
- Bị đưa qua sông. Tội phạm thì công an chỉ xách theo thôi.
- Được đưa qua sông. Tài xế lo chuyện tính toán, kịp giờ mua vé phà hay phải đi đường vòng để qua cầu.

Ở đây đáng lẽ là trường hợp 2. Nhưng người ta muốn hạch hỏi thằng tài xế có phải nó cố tính lỡ phà để có dịp ở lại bến qua đêm thăm vợ bé.
 
Thiếu 2 trường hợp chả cần phương án gì cả:
- Bị đưa qua sông. Tội phạm thì công an chỉ xách theo thôi.
- Được đưa qua sông. Tài xế lo chuyện tính toán, kịp giờ mua vé phà hay phải đi đường vòng để qua cầu.

Ở đây đáng lẽ là trường hợp 2. Nhưng người ta muốn hạch hỏi thằng tài xế có phải nó cố tính lỡ phà để có dịp ở lại bến qua đêm thăm vợ bé.chào bạn
chào bạn!
bạn có nhiều câu nói hay thật. câu hỏi mình đưa ra rõ ràng nhưng chắc đơn giản nên bạn không để ý.
mình có câu hỏi cho bạn sau.
không biết bạn có ở Hà Nội không mình mời bạn uống nước, cafe.
Bài đã được tự động gộp:

Để đi qua một con sông có nhiều phương án:
- Tự đóng thuyền, bè rồi đi qua
- Tự xây một cây cầu bắc qua con sông rồi đi qua bằng cây cầu đó
- Đi qua bằng một cây cầu bắc qua con sông đó đã có (ở gần)
- Đi bằng thuyền, phà của người khác
- Tự bơi qua sông
- ...
chào bạn!
bạn có nhiều câu nói hay thật. câu hỏi mình đưa ra rõ ràng nhưng chắc đơn giản nên bạn không để ý.
mình có câu hỏi cho bạn sau.
không biết bạn có ở Hà Nội không mình mời bạn uống nước, cafe.
Để đi qua một con sông có nhiều phương án:
- Tự đóng thuyền, bè rồi đi qua
- Tự xây một cây cầu bắc qua con sông rồi đi qua bằng cây cầu đó
- Đi qua bằng một cây cầu bắc qua con sông đó đã có (ở gần)
- Đi bằng thuyền, phà của người khác
- Tự bơi qua sông
- ...
chào bạn!
bạn có nhiều câu nói hay thật. câu hỏi mình đưa ra rõ ràng nhưng chắc đơn giản nên bạn không để ý.
mình có câu hỏi cho bạn sau.
không biết bạn có ở Hà Nội không mình mời bạn uống nước, cafe.
 
bạn cho mình hỏi thêm:
Bình thường khi xác định 1 mảng thì mình dùng lệnh:
nguon = Sheet15.[A6].Resize(5, 37).Value
cho mình hỏi khi đối với [A6] trong trường hợp số 6 là một biến thì được viết như nào?
( mình thấy trong lệnh có cấu trúc: cells("A"&i) với i là biến). Nhưng làm tương tự không được.
Sheet15.[A6] chẳng qua là chỉ ô A6 trên sheet Sheet15. Bạn chỉ cần biết thế để hiểu, phòng trường hợp sau này bắt gặp cách viết như thế.

Còn riêng bạn đừng bắt chước nhé. Ô A6 trên sheet Sheet15 bạn hãy viết bây giờ và muôn đời ở dạng:

Sheet15.Range("A6")
Sheet15.Cells(6, "A")
Sheet15.Cells(6, 1)

Bây giờ thì dễ rồi. Tức nếu là dòng i thì có thể dùng 1 trong 3 cách viết

Sheet15.Range("A" & i)
Sheet15.Cells(i, "A")
Sheet15.Cells(i, 1)

Cuối cùng là:

nguon = Sheet15.Range("A" & i).Resize(5, 37).Value
nguon = Sheet15.Cells(i, "A").Resize(5, 37).Value
nguon = Sheet15.Cells(i, 1).Resize(5, 37).Value

Lưu ý:

cells("A"&i) là cách viết sai. Phải là cells(i, "A") hoặc Range("A"&i)
 
chào bạn!
bạn có nhiều câu nói hay thật. câu hỏi mình đưa ra rõ ràng nhưng chắc đơn giản nên bạn không để ý.
...,

Câu trả lời của tôi cũng rất đơn giản. Nhưng bạn lo tự ái hảo cho nên không để ý.

1660630372159.png

Do bạn học cách viết [A1] ở các bài cách đây hàng chục năm. Lúc đó người ta chỉ biết viết code cho nhanh mà khong hiểu ý nghĩa của cặp ngoặc vuông.
Toán tử ngoặc vuông chỉ nhận trị hiển nhiên (literals), không thể nhận cho biểu thức tính toán.

Toán tử ngoặc vuông chỉ nhận trị hiển nhiên (literals), không thể nhận cho biểu thức tính toán.
"A" & i là một biểu thức tính toán. Biến cũng được coi như là một biểu thức. Đó là những điều hết sức đơn giản.

...
Trường hợ từ ô A5 tới ô C9 thì codevba đưa ra: điểm đầu tiên là 5,1 . Điểm thứ 2 là 9,3
Giá trị đưa ra được gán vào biến .
....
Trong bài #4, hàm HaiGoc tính giá trị của tọa đọ hai góc. Sub t minh họa cách sử dụng:
Giá trị đưa ra được gán vảo biến x. Biến x có hai thành phần tượng trưng cho hai điểm, điểm 1 là góc trên trái, góc 2 là góc dưới phải - đúng luật xác định hình chữ nhật. Mỗi góc có hai thành phần phụ là dòng và cột. Đúng như bài #1 đòi hỏi.
Đã thử code chưa? Rõ ràng là kết quả đáp ứng đúng với yêu cầu của bạn. Nhăn nhó gì nữa.
 
Câu trả lời của tôi cũng rất đơn giản. Nhưng bạn lo tự ái hảo cho nên không để ý.



Toán tử ngoặc vuông chỉ nhận trị hiển nhiên (literals), không thể nhận cho biểu thức tính toán.
"A" & i là một biểu thức tính toán. Biến cũng được coi như là một biểu thức. Đó là những điều hết sức đơn giản.


Trong bài #4, hàm HaiGoc tính giá trị của tọa đọ hai góc. Sub t minh họa cách sử dụng:
Giá trị đưa ra được gán vảo biến x. Biến x có hai thành phần tượng trưng cho hai điểm, điểm 1 là góc trên trái, góc 2 là góc dưới phải - đúng luật xác định hình chữ nhật. Mỗi góc có hai thành phần phụ là dòng và cột. Đúng như bài #1 đòi hỏi.
Đã thử code chưa? Rõ ràng là kết quả đáp ứng đúng với yêu cầu của bạn. Nhăn nhó gì nữa.
cảm ơn hỗ trợ của bạn. Mình làm theo ý kiến các bạn. thấy rất vừa ý.
Bài đã được tự động gộp:

Sheet15.[A6] chẳng qua là chỉ ô A6 trên sheet Sheet15. Bạn chỉ cần biết thế để hiểu, phòng trường hợp sau này bắt gặp cách viết như thế.

Còn riêng bạn đừng bắt chước nhé. Ô A6 trên sheet Sheet15 bạn hãy viết bây giờ và muôn đời ở dạng:

Sheet15.Range("A6")
Sheet15.Cells(6, "A")
Sheet15.Cells(6, 1)

Bây giờ thì dễ rồi. Tức nếu là dòng i thì có thể dùng 1 trong 3 cách viết

Sheet15.Range("A" & i)
Sheet15.Cells(i, "A")
Sheet15.Cells(i, 1)

Cuối cùng là:

nguon = Sheet15.Range("A" & i).Resize(5, 37).Value
nguon = Sheet15.Cells(i, "A").Resize(5, 37).Value
nguon = Sheet15.Cells(i, 1).Resize(5, 37).Value

Lưu ý:

cells("A"&i) là cách viết sai. Phải là cells(i, "A") hoặc Range("A"&i)
cảm ơn hỗ trợ của bạn. mình đã hiểu.
 
Chi tiết cho các bạn thích tham khảo về ngữ pháp. Những điều tôi nói sau đây rất khó tìm qua mạng, vì nó là kinh nghiệm, sử dụng nhiều rồi biết.

Ở trên tôi có nhắc khéo "cả chục năm về trước" khi nói về "không hiểu ý nghĩa của cặp ngoặc vuông"
Ngày xưa tôi đã từng một vài lần giải thích.

[ ] là một kiểu gọi hàm Evaluate. Tuy nhiên, nếu các bạn đọc tài liệu thì sẽ thấy nói nó có nhiều giới hạn. Hàm Evaluate uyển chuyển hơn, tuy rằng cũng có một số giới hạn mà tài liệu ít khi nói tới - dùng nhiều thì biết.

Đi thẳng vào vấn đề, ở trên tôi nói "một kiểu gọi". Nghĩa là [ ] coi như lệnh gọi Evaluate. Chỗ khác nhau là:

(A) ngữ pháp sử dụng cặp ngoặc vuông in hệt như cách ta ghi công thức trên bảng tính. Cái gì không dùng ddowcj trong bảng tính thì cũng không dùng được với [ ].

1660637744981.png

Vì vậy cách sử dụng này hoàn toàn hợp lệ cho cách viết [A1] để tham chiếu đến Range("A1")
Nhưng cách này không thể nào dùng cho biến số
bien1 = 1
bien2 = [ bien1 ] ---> VBA syntax error
Dễ hiểu: trong bảng tính làm gì có biến số.

(B) ngữ pháp Evaluate tuân thủ theo luật ngôn VBA. Biểu thức nạp vào Evaluate phải đạt điều kiện VBA. Ta cũng có thể tính hệt như trên, nhưng tham số là hàm Match thì không đạt tiêu chuẩn VBA

1660637946522.png

Muốn được như trên thì ta phải đóng gói cái lệnh cần tính bên trong dấu nháy kép, tức là chuyển chúng thành chuỗi để làm tham số hợp lệ cho Evaluate.

1660638188655.png

Với các biểu thức thật đơn giản chỉ dùng hằng số, không biến số thì hai cái như nhau:

1660639843563.png
 

File đính kèm

  • 1660638325604.png
    1660638325604.png
    4.4 KB · Đọc: 0
  • 1660638734273.png
    1660638734273.png
    4.6 KB · Đọc: 9
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom