Range("ChonNgay") không nhận giá trị?

Liên hệ QC

emgaingayngo

Thành viên hoạt động
Tham gia
9/2/07
Bài viết
141
Được thích
5
Mình chạy vòng for sau để lấy giá trị ngày cho C1
PHP:
Sub Test()
Dim solan As String, iTK As Long, m As Long
m = Application.WorksheetFunction.Count(Range("ListNgay")) - 100
solan = Range("ChonLan").Value
For iTK = 1 To m Step 100
    If i = 1 Then
    Range("ChonNgay").Value = S00.Range("A" & iTK).Value
    ElseIf i > 1 Then
    Range("ChonNgay").Value = S00.Range("A" & iTK - CLng(solan) + 1).Value
    End If
'MsgBox Range("ChonNgay").Value
Next iTK
End Sub

nhưng không được, nó báo lỗi với biểu thức :
iTK - CLng(solan) + 1
Tại sao vậy các bạn?
 

File đính kèm

Lần chỉnh sửa cuối:
Biến i chưa khai báo. Có lẽ iTK chăng?

Thứ 2: giá trị biến solan tức là Ô B1 tức là Range("chonlan"), nếu để trống, thì VBA không tính CLng được. (0 thì được)
Nhưng nếu đã là giá trị số, thì cần gì CLng()?
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là biến i không có nên nó không có kết quả . sửa thành iTK là được.
 
Upvote 0
Bạn thử chạy macro có thêm hộp thoại này, sẽ rõ là sai chỗ nào!

PHP:
Sub Test()
Dim solan As String, iTK As Long, m As Long
m = Application.WorksheetFunction.Count(Range("ListNgay")) - 100

solan = Range("ChonLan").Value
For iTK = 1 To m Step 100
    If i = 1 Then
6      Range("ChonNgay").Value = S00.Range("A" & iTK).Value
    Else
        MsgBox iTK - CLng(solan) + 1, , "GPE"
8     ' Range("ChonNgay").Value = S00.Range("A" & iTK - CLng(solan) + 1).Value
    End If
   MsgBox Range("ChonNgay").Value, , m
Next iTK
End Sub

Vấn đề nữa là chưa thấy có trang tính tên là "S00" đâu cả; Bạn nên xem thêm chổ đó nữa nha
 
Upvote 0
Mình chạy vòng for sau để lấy giá trị ngày cho C1
PHP:
Sub Test()
Dim solan As String, iTK As Long, m As Long
m = Application.WorksheetFunction.Count(Range("ListNgay")) - 100
solan = Range("ChonLan").Value
For iTK = 1 To m Step 100
    If i = 1 Then
    Range("ChonNgay").Value = S00.Range("A" & iTK).Value
    ElseIf i > 1 Then
    Range("ChonNgay").Value = S00.Range("A" & iTK - CLng(solan) + 1).Value
    End If
'MsgBox Range("ChonNgay").Value
Next iTK
End Sub
nhưng không được, nó báo lỗi với biểu thức :
iTK - CLng(solan) + 1
Tại sao vậy các bạn?
Bạn có thể phát biểu thuật toán (mà bạn đang nghĩ) thành lời nói được không?
Nhìn code thấy mơ hồ quá ---> Tôi áng chừng bài này không cần đến vòng lập, nhưng để biết chính xác thì cần phải nghe giải thích chi tiết từ bạn!
Hic...
If i= 1 Then (hoặc sửa lại If iTK = 1 Then) không hiểu để làm cái gì?
 
Upvote 0
Cảm ơn các bạn đúng là mình quá ẩu đối với biến iTK! +-+-+-+

Bạn có thể phát biểu thuật toán (mà bạn đang nghĩ) thành lời nói được không?
Nhìn code thấy mơ hồ quá ---> Tôi áng chừng bài này không cần đến vòng lập, nhưng để biết chính xác thì cần phải nghe giải thích chi tiết từ bạn!
Hic...
If i= 1 Then (hoặc sửa lại If iTK = 1 Then) không hiểu để làm cái gì?

Mô tả như sau:
- đầu tiên lấy DL (dữ liệu) từ A1:A100 (mỗi lần lấy là 100 dòng)
- từ dòng thứ 100 của DL lấy lần trước lùi về ChonLan - 1 dòng để lấy DL của lần tiếp theo
- Range("ChonNgay") nhận giá trị của dòng đầu tiên trong mỗi lần lấy 100 dòng.

P/S :
Đã cập nhật file để DL có hơn 500 dòng.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các bạn đúng là mình quá ẩu đối với biến iTK! +-+-+-+



Mô tả như sau:
- đầu tiên lấy DL (dữ liệu) từ A1:A100 (mỗi lần lấy là 100 dòng)
- từ dòng thứ 100 của DL lấy lần trước lùi về ChonLan - 1 dòng để lấy DL của lần tiếp theo
- Range("ChonLan") nhận giá trị của dòng đầu tiên trong mỗi lần lấy 100 dòng.

P/S :
Đã cập nhật file để DL có hơn 500 dòng.
Cũng chẳng hiểu gì lắm ý đồ của bạn, nhưng theo code mà bạn viết thì tôi chỉ cần vầy:
PHP:
Sub Test()
  Dim m As Long
  m = Int((Range("ListNgay").Rows.Count - 101) / 100) * 100 - Range("ChonLan") + 1
  Range("ChonNgay") = Range("ListNgay").Offset(IIf(m < 0, 0, m))(1, 1)
End Sub
Cớ gì phải For... Next? Vì đàng nào thì Range("ChonNgay") cũng sẽ lấy giá trị cuối cùng mà nó gặp
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các bạn đúng là mình quá ẩu đối với biến iTK! +-+-+-+

­Từ một việc hơi khó chịu 1 chút nhưng nó tạo cho ta 1 thói quen rất hay và đầy đủ là khai báo tường minh các biến sử dụng, bạn hãy làm như sau:
Trong cửa sổ VBA ---->Tools---->Option----->Đánh dấu ô Require Variable Declaration
Như vây, mỗi khi bạn sử dụng biến nó sẽ yêu cầu bạn khai báo tránh được lỗi khi chạy chương trình hay sao chép code.
 
Upvote 0
Mình sẽ cố gắng dịch tiếng Việt sang tiếng Việt, như sau:

Mô tả như sau:
- đầu tiên lấy DL (dữ liệu) từ A1:A100 (mỗi lần lấy là 100 dòng)
- từ dòng thứ 100 của DL lấy lần trước lùi về ChonLan - 1 dòng để lấy DL của lần tiếp theo
- Range("ChonLan") nhận giá trị của dòng đầu tiên trong mỗi lần lấy 100 dòng.
Đã cập nhật file để DL có hơn 500 dòng.

( Hiện tại tại [B1] (được gán tiên là ChonLan) đang chứa trị là 28)
Tạo vòng lặp duyệt mỗi làn 100 số liệu; (Hiện tại số liệu là 700, ta sẽ có 7 lần duyệt cả thẩy)
Lần duyệt thứ nhứt, ta sẽ lầy dữ liệu tại 100-(28-1) (có nghĩa là dòng thứ 73) đem ghi vô cộ c; (Nhưng tác giả lại tô đỏ ô 74 (?) , ngạc nhiên chưa, không rỏ vì sao!)

Tiếp theo thì vô fương hiểu; Không biết lấy giá trị nào ghi vô chonlan; Vì giá trị tại [A1] fải lấy là trị kiểu ngày tháng năm (1/27/2001) ; Nhưng trị trước của ô này là 28 - là kiểu số (?) Nếu fải lấy ngày 27 để ghi vô Chonlan thì tiếng Việt thông thường fải viết cách khác để truyền thông tin cho nhau giữa cộng đồng mạng. chứ chưa nói đến VBA

Cũng mong rằng sẽ fải lấy Day([A1].Value) để thay vô [B1]

Mong tác giả rõ thêm chổ này!
 
Upvote 0
Yeah! Cũng vì vô phương hiểu nên em cũng chả góp ý gì được, cả trong topic này và topic "Chạy hoài không dừng"
Trong topic này thì hỏi về báo lỗi dòng lệnh CLng, nhưng khi thử thì lại không chạy vòng lặp do biến i không tìm thấy. Thay biến i thành iTK, thì chạy mà chả báo lỗi gì!
Chả biết có phải ngây ngô thật hay không nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
( Hiện tại tại [B1] (được gán tiên là ChonLan) đang chứa trị là 28)
Tạo vòng lặp duyệt mỗi làn 100 số liệu; (Hiện tại số liệu là 700, ta sẽ có 7 lần duyệt cả thẩy)
Lần duyệt thứ nhứt, ta sẽ lầy dữ liệu tại 100-(28-1) (có nghĩa là dòng thứ 73) đem ghi vô cộ c; (Nhưng tác giả lại tô đỏ ô 74 (?) , ngạc nhiên chưa, không rỏ vì sao!)

Tiếp theo thì vô fương hiểu; Không biết lấy giá trị nào ghi vô chonlan; Vì giá trị tại [A1] fải lấy là trị kiểu ngày tháng năm (1/27/2001) ; Nhưng trị trước của ô này là 28 - là kiểu số (?) Nếu fải lấy ngày 27 để ghi vô Chonlan thì tiếng Việt thông thường fải viết cách khác để truyền thông tin cho nhau giữa cộng đồng mạng. chứ chưa nói đến VBA

Cũng mong rằng sẽ fải lấy Day([A1].Value) để thay vô [B1]

Mong tác giả rõ thêm chổ này!
- Lần duyệt thứ nhất lấy tại cell A1 luôn sư phụ à ---> Vì có đoạn If iTK = 1 Then
- Lần duyệt tiếp theo là 101 - 28 + 1 đương nhiên = 74
- Range("Chonlan") chỉ tham gia tính toán chứ ta không gán giá trị vào nó sư phụ à
- Range("Chonngay") mới là chổ gán giá trị
---------------------------
Em hiểu theo code chứ tác giả nói tiếng Tây, em chả hiểu gì ráo
Thông thường, cách viết bài nhờ trợ giúp, người ta sẽ nêu rõ yêu cầu + MỤC ĐÍCH CUỐI CÙNG mà người ta muốn ---> Ở đây không hiểu lắm về cái khoản MỤC ĐÍCH
 
Lần chỉnh sửa cuối:
Upvote 0
người ta sẽ nêu rõ yêu cầu + MỤC ĐÍCH CUỐI CÙNG mà người ta muốn ---> Ở đây không hiểu lắm về cái khoản MỤC ĐÍCH
Mục đính sẽ fải hiểu ngầm: Tìm giúp xem đoạn mã trên sai chổ nào mà ChonNgay không nhận trị số?

Tácgia chưa cần thuật toàn của chú đâu, NDU à!

Chúc vui!
 
Upvote 0
Đầu tiên cho mình xin lỗi vì đã post bài bị sai quá nhiều chỗ :
- biến iTK
-ChonNgay và ChonLan
-khi iTK>1 thì công thức tính đã sai.

Xin mô tả lại cụ thể bằng file sau: những ô màu đỏ là trị để ChonNgay nhận sau mỗi lần quét. Cầu Trời Phật cho con lần này đừng bị sai nữa.
 

File đính kèm

Upvote 0
Em đã giải quyết được bài toán của em như sau (sau một hồi đi lòng vòng):

PHP:
Dim solan As String, iTK As Long, m As Long
m = Application.WorksheetFunction.Count(Range("ListNgay"))
solan = Range("ChonLan").Value
For iTK = 1 To m Step 101 - solan
    Range("ChonNgay").Value = S00.Range("A" & iTK).Value
MsgBox Range("ChonNgay").Value
Next iTK

Cảm ơn các bạn.

Để em tìm hiểu thêm cách không dùng for của bác NDU.
 
Upvote 0
Em đã giải quyết được bài toán của em như sau (sau một hồi đi lòng vòng):

PHP:
Dim solan As String, iTK As Long, m As Long
m = Application.WorksheetFunction.Count(Range("ListNgay"))
solan = Range("ChonLan").Value
For iTK = 1 To m Step 101 - solan
    Range("ChonNgay").Value = S00.Range("A" & iTK).Value
MsgBox Range("ChonNgay").Value
Next iTK
Cảm ơn các bạn.

Để em tìm hiểu thêm cách không dùng for của bác NDU.
Đằng nào thì Range("ChonNgay") cũng lấy giá trị cuối cùng khi vòng lập kết thúc ---> Vậy thì bạn cứ lấy số kết thúc ấy mà gán vào thôi ---> Cần quái gì vòng lập, đúng không
Ví dụ tình huống thế này:
- Có 100 học sinh sắp xếp theo hàng dọc
- Yêu cầu gọi học sinh đứng cuối hàng ra
Vậy:
- Chẳng lẽ bạn For từ 1 đến 100 ---> Gọi từng tên học sinh ra hay sao?
- Sao không gọi thẳng tên em cuối ra?
Hic... Lý luận sơ đẳng... nếu bạn vẫn không hiểu thì tôi... thật sự chẳng còn gì để nói...
 
Upvote 0
Đằng nào thì Range("ChonNgay") cũng lấy giá trị cuối cùng khi vòng lập kết thúc ---> Vậy thì bạn cứ lấy số kết thúc ấy mà gán vào thôi ---> Cần quái gì vòng lập, đúng không
Ví dụ tình huống thế này:
- Có 100 học sinh sắp xếp theo hàng dọc
- Yêu cầu gọi học sinh đứng cuối hàng ra
Vậy:
- Chẳng lẽ bạn For từ 1 đến 100 ---> Gọi từng tên học sinh ra hay sao?
- Sao không gọi thẳng tên em cuối ra?
Hic... Lý luận sơ đẳng... nếu bạn vẫn không hiểu thì tôi... thật sự chẳng còn gì để nói...

Dạ, tại mỗi lần Range("ChonNgay") thay đổi giá trị là em chạy macro đó mà.

PHP:
Dim solan As String, iTK As Long, m As Long
m = Application.WorksheetFunction.Count(Range("ListNgay"))
solan = Range("ChonLan").Value
For iTK = 1 To m Step 101 - solan
    Range("ChonNgay").Value = S00.Range("A" & iTK).Value
    Thihanh
    DemBlank
    Xoa
Next iTK
 
Upvote 0
Mình thấy dùng công thức cũng được. Nhập số lần là có kết quả, khỏi cần chạy code lôi thôi ra (Mình theo đề xuất của Ndu)

=INDEX(ListNgay,INT((COUNT(ListNgay)-100)/100)*100-ChonLan+2)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom