Trợ giúp kiểm tra Range đang 1 dòng hay 1 cells.

Liên hệ QC

huhumalu

Thành viên tiêu biểu
Tham gia
20/10/09
Bài viết
628
Được thích
523
Anh em cho mình hỏi:
Mình dùng phương thức sau để nạp dữ liệu vào Variant
PHP:
MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=64)
Tuy nhiên có 1 vấn đề là nếu như người sử dụng chỉ chọn 1 ô hoặc 1 dòng ví dụ "A1:B1" thì khi mình chạy code bên dưới thì
UBound(MyRange) = 2
còn nếu dùng UBound(MyRange,2) thì báo lỗi "Out of range"
ví dụ
Mã:
For i = 1 To UBound(MyRange)
...
Next i
Mọi người có cách nào kiểm tra kích thước hay biết là đang chọn 1 ô hay 1 dòng kg ?
Cảm ơn.
 
Anh em cho mình hỏi:
Mình dùng phương thức sau để nạp dữ liệu vào Variant
PHP:
MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=64)
Tuy nhiên có 1 vấn đề là nếu như người sử dụng chỉ chọn 1 ô hoặc 1 dòng ví dụ "A1:B1" thì khi mình chạy code bên dưới thì
UBound(MyRange) = 2
còn nếu dùng UBound(MyRange,2) thì báo lỗi "Out of range"
ví dụ
Mã:
For i = 1 To UBound(MyRange)
...
Next i
Mọi người có cách nào kiểm tra kích thước hay biết là đang chọn 1 ô hay 1 dòng kg ?
Cảm ơn.
Như này được không bạn:
PHP:
Sub Test()
Dim MyRange As Range
ChonLai:
Set MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=8)
If MyRange.Rows.Count = 1 Or MyRange.Columns.Count = 1 Then
MsgBox "Chon lai": GoTo ChonLai
End If
'*******************************************
    'Viet code vao day
'*******************************************
End Sub
 
Như này được không bạn:
PHP:
Sub Test()
Dim MyRange As Range
ChonLai:
Set MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=8)
If MyRange.Rows.Count = 1 Or MyRange.Columns.Count = 1 Then
MsgBox "Chon lai": GoTo ChonLai
End If
'*******************************************
    'Viet code vao day
'*******************************************
End Sub
Cảm ơn bạn, không biết sao khi mình debugs thì cái .rows và .columns nó kg chạy. Oki vầy là mình xử lý được rồi.
Bài đã được tự động gộp:

Selection.Rows.Count * Selection.Columns.Count=1
Cái này thì bài bên dưới xử lý theo hướng dùng or vì cái Selection.Columns.Count vẫn có thể trả về 2, 3, 4... còn cái Rows bằng 1.
Thanks bạn.
 
Cảm ơn bạn, không biết sao khi mình debugs thì cái .rows và .columns nó kg chạy. Oki vầy là mình xử lý được rồi.
Cái MyRange của bạn thực chất là array (type:=64), tức là bạn đang định nghĩa sai. Array thì không debug được .rows và .Col rồi. Nếu khai báo MyRange thì nên để nó là range (phải set), Sau đó nó xử lý array thì khai báo MyArray=MyRange.value
 
Cảm ơn bạn, không biết sao khi mình debugs thì cái .rows và .columns nó kg chạy. Oki vầy là mình xử lý được rồi.
Bài đã được tự động gộp:


Cái này thì bài bên dưới xử lý theo hướng dùng or vì cái Selection.Columns.Count vẫn có thể trả về 2, 3, 4... còn cái Rows bằng 1.
Thanks bạn.
Bạn qua Box các câu hỏi về mảng. Có một dãy nói về Range và Array bên đó
 
Cái MyRange của bạn thực chất là array (type:=64), tức là bạn đang định nghĩa sai. Array thì không debug được .rows và .Col rồi. Nếu khai báo MyRange thì nên để nó là range (phải set), Sau đó nó xử lý array thì khai báo MyArray=MyRange.value
Ồ chính xác vấn đề, cảm ơn bạn.
 
Cảm ơn bạn, không biết sao khi mình debugs thì cái .rows và .columns nó kg chạy. Oki vầy là mình xử lý được rồi.
Bài đã được tự động gộp:


Cái này thì bài bên dưới xử lý theo hướng dùng or vì cái Selection.Columns.Count vẫn có thể trả về 2, 3, 4... còn cái Rows bằng 1.
Thanks bạn.
2 cái nhân với nhau mà bằng 1 thì theo bạn là trường hợp nào?
 
Dạ 2*0.5 hoặc 4*0.25 còn 3 thì em chưa biết ạ
Đó là phép tính ngoại. Một đối số nằm trong tập hợp số nguyên nhưng đối số kia thì không. :p

Trong tập hợp số nguyên, 1 là phần tử đơn vị của toán tử nhân. Thoả điều kiện:
x*a = a*x = x

Với định nghĩa trên, thớt có thể suy ra đáp án cho câu hỏi ở bài #8
 
Anh em cho mình hỏi:
Mình dùng phương thức sau để nạp dữ liệu vào Variant
PHP:
MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=64)
Tuy nhiên có 1 vấn đề là nếu như người sử dụng chỉ chọn 1 ô hoặc 1 dòng ví dụ "A1:B1" thì khi mình chạy code bên dưới thì
UBound(MyRange) = 2
còn nếu dùng UBound(MyRange,2) thì báo lỗi "Out of range"
ví dụ
Mã:
For i = 1 To UBound(MyRange)
...
Next i
Mọi người có cách nào kiểm tra kích thước hay biết là đang chọn 1 ô hay 1 dòng kg ?
Cảm ơn.
Tôi thường làm theo cách này:
Mã:
Sub Test()
  Dim MyRange
  MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=64)
  If TypeName(MyRange) = "Variant()" Then
    ''Code here
  End If
End Sub
 
Tôi thường làm theo cách này:
Mã:
Sub Test()
  Dim MyRange
  MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=64)
  If TypeName(MyRange) = "Variant()" Then
    ''Code here
  End If
End Sub
Trong trường hợp này Variant() cũng có 2 loại đó anh, 1 chiều và 2 chiều.
 
Như này được không bạn:
PHP:
Sub Test()
Dim MyRange As Range
ChonLai:
Set MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=8)
If MyRange.Rows.Count = 1 Or MyRange.Columns.Count = 1 Then
MsgBox "Chon lai": GoTo ChonLai
End If
'*******************************************
    'Viet code vao day
'*******************************************
End Sub
Kiểu vòng lặp Goto như thế này xưa lắm rồi. Người ta đã bắt đầu bỏ tử khoảng cuối thập niên 1970's, khi xu hướng lập trình cấu trúc phát triển mạnh.
Lập trình cấu trúc chú trọng ở cấu trúc nhóm lệnh (block; điển hình, từ For đến Next là một block, từ IF đến End If là một block). Và lệnh Goto thường làm cho nhóm lệnh bị vỡ.

Thay vì dùng Goto để đi vòng lại thì hầu hết các ngôn ngữ bây giờ dùng cấu trúc vòng lặp vộ tận và lệnh thoát khi thoả điều kiện.

Do While True
Set MyRange = Application.InputBox("select range: |__Name__||__--X--__||__--Y--__| ", Type:=8)
If MyRange.Rows.Count > 1 And MyRange.Columns.Count > 1 Then Exit Do
MsgBox "Chon lai"
Loop

Lưu ý là người ta luôn luôn dùng Do While True .... Loop thay vì Do ... Loop While True
Lý do: người quen đọc code khi đọc đến Do While True thì biết đây là vòng lặp vô tận. Nếu dùng Do đơn lẻ thì người đọc phải đọc đến cuối vòng lặp mới biết nó là vòng lặp vô tận.
 
Web KT
Back
Top Bottom