giúp đỡ về việc tạo vòng lặp "for each" cho chuỗi giá trị

Liên hệ QC

quanghao262

Thành viên mới
Tham gia
27/4/10
Bài viết
31
Được thích
0
em đang thắc mắc một số vấn đề về vòng lặp mong anh chị giúp đỡ.
Ví dụ :
em có chuỗi tên từ A1 đến A10.
giờ em muốn dùng lệnh tô màu đỏ cho các giá trị từ A1 đến A10 đó( dùng vòng lặp for each).(

(thực chất đây chỉ là ví dụ cơ bản để hôm sau em tự lập hàm goal seak cho chuỗi n giá trị cần goal seak)
em đang còn rất kém về VBA nên mong anh chị giúp đỡ .
 
Cách làm đơn giản thế này:

Mã:
Dim cell As Range

For Each Cell in Range("A1:A10")
    With Cell
        [COLOR="darkgreen"]'Do something with cell's properties....[/COLOR]
    End With
Next
 
Upvote 0
em đã thử nhưng vẫn thấy hơi khó hiểu.Anh lập cho em chuỗi ví dụ này được không anh.
em có chuỗi ký tự từ A1 đến A10 là dãy tên 10 học sinh.
vì tên quá dài so với 1 ô nên em phải dùng "Merge & Center" cho từng ô một.
cám ơn anh.
 
Upvote 0
em đã thử nhưng vẫn thấy hơi khó hiểu.Anh lập cho em chuỗi ví dụ này được không anh.
em có chuỗi ký tự từ A1 đến A10 là dãy tên 10 học sinh.
vì tên quá dài so với 1 ô nên em phải dùng "Merge & Center" cho từng ô một.
cám ơn anh.
Hơi khó hiểu, có phải là:
Dữ liệu từ [A1] đến [A10] là tên của 10 học sinh
Dữ liệu trong 1 cell vượt quá giới hạn cho phép ( cái này hổng có đâu, nhưng kệ vì đây là ví dụ) nên phải Merge, nhưng merge bao nhiêu cell, thí dụ [a1] & [b1], hoặc [a1]&[b1]&[c1]...vv....
Tạm thời cứ lấy 2 cell, gởi bạn một cách viết:
Mã:
Public Sub MetMet()
Dim Cll As Range
    For Each Cll In [a1:a10]
        With Cll.Resize(, 2)
            .Merge
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
    Next
End Sub
Thân
 
Upvote 0
Hơi khó hiểu, có phải là:
Dữ liệu từ [A1] đến [A10] là tên của 10 học sinh
Dữ liệu trong 1 cell vượt quá giới hạn cho phép ( cái này hổng có đâu, nhưng kệ vì đây là ví dụ) nên phải Merge, nhưng merge bao nhiêu cell, thí dụ [a1] & [b1], hoặc [a1]&[b1]&[c1]...vv....
Tạm thời cứ lấy 2 cell, gởi bạn một cách viết:
Mã:
Public Sub MetMet()
Dim Cll As Range
    For Each Cll In [a1:a10]
        With Cll.Resize(, 2)
            .Merge
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
    Next
End Sub
Thân
vâng,đúng là thế rồi anh ah.
lúc tối tự mày mò,em làm ra hàm thế này :
Sub merge()
Dim i As Integer
Dim Rng As Range
Set Rng = Range("A1:A10")
For i = 1 To Rng.Cells.Count
Range("A1:B1").Offset(i, 0).merge
Next i
Range("A1:B1").merge
End Sub
và đã thành công.
nhưng em không hiểu tại sao ở phần
For i = 1 To Rng.Cells.Count
em cho i=0 to Rng.Cells.Count nó lại không được a?
 
Upvote 0
vâng,đúng là thế rồi anh ah.
lúc tối tự mày mò,em làm ra hàm thế này :

và đã thành công.
nhưng em không hiểu tại sao ở phần
For i = 1 To Rng.Cells.Count
em cho i=0 to Rng.Cells.Count nó lại không được a?
Híc. Bạn đang hỏi về FOR EACH mà, sao "bi" giờ chơi FOR....NEXT
Nhưng nếu ý mình là đúng thì code bạn chạy sẽ ra kết quả.....trật lấc
Gán biến "I = 0 to....." vẫn được chứ bạn, không được là không được thế nào? báo lỗi ra sao? Bạn nói rõ hơn đi AE mới biết được
Thân
 
Upvote 0
For i = 0 To Rng.Cells.Count đâu có đươc đâu Cò? Count là đếm chai để chia, có khi nào mà đếm từ 0 đến 10? mà đếm từ 0 đến 10 nó ra 11 chai à! tới lần chia thứ 11 không có chai nào để chia nó la làng đúng rồi.

For i = 0 To Rng.Cells.Count - 1 thì được

Nếu For i thì như sau:

For i = 1 To Rng.Cells.Count
Range("A1:B1").Offset(i - 1, 0).Merge
Next i

Khỏi cần A1:B1 mẹc
 
Lần chỉnh sửa cuối:
Upvote 0
nhưng em vẫn Merge được mà anh,à quên,thừa ô (A11:B11).
khi em cho i=0 to... thì nó chỉ merge mỗi ô (A1:B1) thôi anh ah
khi em cho i=1 to Rng.Cells.Count-1 thì vẫn ko được,vẫn chỉ merge mỗi ô (A1:B1).
Khi em chạy hàm em tự tạo thì nó vẫn Merge lần lượt các ô (nhưng thừa ô (A1:B1)
khi em cho như anh "pmt412" là
range("A1:B1").offset(i-1,0).merge thì vẫn không được,nó chỉ merge mỗi (A1:B1),em vân chưa hiểu tại sao.
có ai chỉ em cách khắc phục.
và cho em hỏi câu lệnh "with-End with" nó được dùng để làm gì trong bài của anh Concogia(nếu có thể thì giải thích rõ giùm em,em vẫn chưa hiểu lắm)
cám ơn anh chị.
 
Lần chỉnh sửa cuối:
Upvote 0
Cái anh Bill này ngộ ghê, ba hồi được, ba hồi không. Test thử:

Msgbox Range("A1:B1").Offset(2, 0).Address

Ba hồi nó ra $A$3, ba hồi ra $A$3:$B$3

Vậy khắc phục theo Cò
hoặc
PHP:
For i = 0 To Rng.Cells.Count - 1
Range("A1").Offset(i, 0).Resize(1, 2).merge
MsgBox Range("A1:B1").Offset(i, 0).Address
Next
 
Upvote 0
For i = 0 To Rng.Cells.Count đâu có đươc đâu Cò? Count là đếm chai để chia, có khi nào mà đếm từ 0 đến 10? mà đếm từ 0 đến 10 nó ra 11 chai à! tới lần chia thứ 11 không có chai nào để chia nó la làng đúng rồi.

For i = 0 To Rng.Cells.Count - 1 thì được
Hihi, chắc bị rầy oan "zồi"
Bạn í hỏi:
em cho i=0 to Rng.Cells.Count nó lại không được a?
Mình trả lời là gán được, máy nó không cằn nhằn gì mình đâu, chỉ có khi chạy vòng lặp nó mới cự nự nên mới có câu:
Gán biến "I = 0 to....." vẫn được chứ bạn, không được là không được thế nào? báo lỗi ra sao? Bạn nói rõ hơn đi AE mới biết được
Vậy lỗi này là do thuật toán chứ hổng phải lỗi cú pháp
Híc, oan wa oan wa
To : quanghao262
Bạn làm một file giả định, quánh luôn cái kết quả muốn có để...."lè cho lạm"
Thân


 
Upvote 0
chắc hơi oan 1 xíu, ai bỉu hông nói rõ "lỗi thuật toán"
Mà tác giả chỉ hỏi thêm cho biết, chứ code Cò già ok roài!
Mình vẫn thắc mắc vụ mà tác giả test thử (và mình test theo), tại sao nó chỉ mẹc dòng đầu? Tại sao Offset (i, 0) thì A đờ rét là 2 ô A:B đàng hoàng, mà Offset(i - 1) thì A đờ rét lại chỉ là 1 ô A?

Rốt cuộc mình phải Rìsai (1, 2) nó mới chịu?
 
Upvote 0
Mình vẫn thắc mắc vụ mà tác giả test thử (và mình test theo), tại sao nó chỉ mẹc dòng đầu? Tại sao Offset (i, 0) thì A đờ rét là 2 ô A:B đàng hoàng, mà Offset(i - 1) thì A đờ rét lại chỉ là 1 ô A?
Rốt cuộc mình phải Rìsai (1, 2) nó mới chịu?
Cái này chuyện bình thường mà sư phụ! Gần giống như xóa dòng rổng, để chính xác thì phải xóa từ dưới lên!
Để khỏi rì jai gì gì đó thì cũng for ngược thế này:
PHP:
Sub Test()
  Dim i As Long
  For i = 10 To 1 Step -1
    Range("A1:B1").Offset(i - 1).Merge
  Next i
End Sub
Xong!
 
Upvote 0
đây là nguyên văn khi em tạo hàm
Mã:
Sub thu()
[COLOR=blue]Dim[/COLOR] i [COLOR=blue]As Integer[/COLOR]
[COLOR=blue]Dim[/COLOR] Rng [COLOR=blue]As[/COLOR] Range
Set Rng = Range("A1:A10")
For i = 0 To Rng.Cells.Count - 1
Range("A1:B1").Offset(i, 0).Merge
Next i
End Sub
khi em tạo như thế thì nó chỉ Merge mỗi ô (A1:B1)
còn khi em thay Range("A1:B1").Offset(i, 0).Merge bằng Range("A1:B1").Offset(i, 0).Resize(1, 2).Merge thì lại được
tại sao lại thế anh nhỉ?
à em có vòng lặp nội suy (tham khảo and edit) của các anh khác trên 4room.
Mã:
Function noisuy(vungtra As Range, X As Double) As Double
Dim ktra As Boolean
Dim i As Integer
Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
For i = 1 To vungtra.Cells.Count
ktra = False
    If vungtra.Cells(i, 1) <= X And vungtra.Cells(i + 1, 1) >= X Then
          x1 = vungtra.Cells(i, 1): x2 = vungtra.Cells(i + 1, 1)
          y1 = vungtra.Cells(i, 2): y2 = vungtra.Cells(i + 1, 2)
    noisuy = y1 + (y2 - y1) * (X - x1) / (x2 - x1)
ktra = True
End If
Next i
         If ktra = True Then
          MsgBox "ngoai vung phu song", vbInformation
         End If
        Exit Function
End Function
hàm này có file excel thì được,có khi thì không(em lưu dưới dạng .bas rồi import vào file excel khác)
khi thì được khi thì không.
em không hiểu tại sao cả.
mong anh chị giải thích giùm.
cám ơn anh chị.
 
Lần chỉnh sửa cuối:
Upvote 0
đây là nguyên văn khi em tạo hàm
Mã:
Sub thu()
[COLOR=blue]Dim[/COLOR] i [COLOR=blue]As Integer[/COLOR]
[COLOR=blue]Dim[/COLOR] Rng [COLOR=blue]As[/COLOR] Range
Set Rng = Range("A1:A10")
For i = 0 To Rng.Cells.Count - 1
Range("A1:B1").Offset(i, 0).Merge
Next i
End Sub
khi em tạo như thế thì nó chỉ Merge mỗi ô (A1:B1)
còn khi em thay Range("A1:B1").Offset(i, 0).Merge bằng Range("A1:B1").Offset(i, 0).Resize(1, 2).Merge thì lại được
tại sao lại thế anh nhỉ?
Cái vụ Offset có liên quan đến Merge ta phải cẩn thận
Đã từng để cập tại mục đố vui:
http://www.giaiphapexcel.com/forum/showthread.php?7146-Đố-vui-về-VBA!&p=121579#post121579
Cách giải quyết: Xem bài số 12
 
Upvote 0
Cái này chuyện bình thường mà sư phụ! Gần giống như xóa dòng rổng, để chính xác thì phải xóa từ dưới lên!
Để khỏi rì jai gì gì đó thì cũng for ngược thế này:
PHP:
Sub Test()
  Dim i As Long
  For i = 10 To 1 Step -1
    Range("A1:B1").Offset(i - 1).Merge
  Next i
End Sub
Xong!

Hiểu rồi. Nghĩa là khi Offset chạy lang thang từ đâu đến đâu không biết, nếu xuất phát điểm là mẹc rồi thì bao nhiêu ô cũng tính 1 mà thôi.
(range(abc).Offset(...), thì abc là xuất phát điểm, phải mẹc nó sau cùng)
 
Lần chỉnh sửa cuối:
Upvote 0
đây là vấn đề căn bản mà e đang muốn hỏi trong chủ đề này(những phần Merge chỉ là cái tìm phương hướng giải bài toán thôi ạ)
em có 2 cột A và B
cột A chứa các giá trị là số (1,2,3....)
cột B là hàm của cột A như B1=A1+2 ; B2=A2+5 ; ...
giờ e muốn lập hàm goal seek cho 2 cột trên trong đó
set cell là các giá trị trong cột B
Value =0 (tất cả các giá trị B1,B2...,Bn=0)
changingcells là các giá trị Ai tương ứng với cột Bi.
em thử lập hàm như sau
Sub anhhao()
Dim Rng As Range
Dim i As Integer
Set Rng = Range("A1:B10")
For i = 1 To Rng.Cells.Count
Rng.Cells("i,1").goalseek Goal:=0, ChangingCell:=Rng.Cells("i,0")
Next i
End Sub
nhưng nó báo lỗi ở dòng Rng.Cells("i,1").goalseek Goal:=0, ChangingCell:=Rng.Cells("i,0")
mong anh chị giúp đỡ.
cám ơn anh chị!
 
Upvote 0
đây là vấn đề căn bản mà e đang muốn hỏi trong chủ đề này(những phần Merge chỉ là cái tìm phương hướng giải bài toán thôi ạ)
em có 2 cột A và B
cột A chứa các giá trị là số (1,2,3....)
cột B là hàm của cột A như B1=A1+2 ; B2=A2+5 ; ...
giờ e muốn lập hàm goal seek cho 2 cột trên trong đó
set cell là các giá trị trong cột B
Value =0 (tất cả các giá trị B1,B2...,Bn=0)
changingcells là các giá trị Ai tương ứng với cột Bi.
em thử lập hàm như sau

nhưng nó báo lỗi ở dòng Rng.Cells("i,1").goalseek Goal:=0, ChangingCell:=Rng.Cells("i,0")
mong anh chị giúp đỡ.
cám ơn anh chị!
Sai cả rổ luôn
1> For i = 1 To Rng.Cells.Count ---> Chẳng lẽ quét hết các cell, kể cả cột B? Lý ra phải là For i = 1 To Rng.Rows.Count (quét từ dòng 1 đến cuối)
2> Rng.Cells("i,1").goalseek Goal:=0, ChangingCell:=Rng.Cells("i,0")
---> Có dấu nháy là sai, phải vầy mới đúng Rng.Cells(i,2).goalseek Goal:=0, ChangingCell:=Rng.Cells(i,1) (Ngoài ra định vị cell sai vị trí, phải thay số 0 thành 1 và 1 thành 2)
Còn tôi thì sẽ viết vầy:
PHP:
Sub anhhao()
  Dim i As Long
  With Range("A1:B10")
    For i = 1 To .Rows.Count
      .Cells(i, 2).GoalSeek 0, .Cells(i, 1)
    Next
  End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub anhhao()
  Dim i As Long
  With Range("A1:B10")
    For i = 1 To .Rows.Count
      .Cells(i, 2).GoalSeek 0, .Cells(i, 1)
    Next
  End With
End Sub
như thế vẫn chưa được anh ah,em làm thì nó vẫn báo lỗi Debug-> .Cells(i, 2).GoalSeek 0, .Cells(i, 1)
anh xem lại giùm.
cám ơn anh
 
Upvote 0
PHP:
Sub anhhao()
  Dim i As Long
  With Range("A1:B10")
    For i = 1 To .Rows.Count
      .Cells(i, 2).GoalSeek 0, .Cells(i, 1)
    Next
  End With
End Sub
như thế vẫn chưa được anh ah,em làm thì nó vẫn báo lỗi Debug-> .Cells(i, 2).GoalSeek 0, .Cells(i, 1)
anh xem lại giùm.
cám ơn anh
Mở file này xem hổng được chổ nào nhé!
 

File đính kèm

Upvote 0
cám ơn anh nhiều lắm,trong buổi sáng này mà e đã học hỏi từ các anh được rất nhiều.
em thử tạo 1 hàm này và thấy nó chạy được (chẳng qua là edit của anh NDU thôi).anh xem có lỗi hay bẫy gì không,hì.
PHP:
Sub quanhgo()
Dim i As Long
Dim Rng As Range
Set Rng = Range("A1:B10")
     For i = 1 To Rng.Rows.Count
            Rng.Cells(i, 2).goalseek 0, Rng.Cells(i, 1)
     Next
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom