Hỏi đáp VBA trong chủ đề "Chập chững đến VBA"

Liên hệ QC

luongchihien

Thành viên mới
Tham gia
26/8/11
Bài viết
7
Được thích
1
Em xem đề tài và học hỏi được một tí, với yêu cầu như vậy! Trong file excel có sheet "Form" và sheet "Thong Tin KH" bây giờ em muốn nhập vào form (từ ô D4: D32, như trong file) rồi enter thì dữ liệu được nhập vào sheet "Thong Tin KH". Mong mọi người giúp đỡ
Em mò mẫn mãi mà ko ra ( em làm được cái gì là đính kèm hết trong file đó. gồm file excel và word chứa code)
Cảm ơn trước, cho những ai giúp đỡ!
 

File đính kèm

  • aa.xlsx
    35.8 KB · Đọc: 57
  • Code nhập vào Module.doc
    31.5 KB · Đọc: 70
PHP:
Option Explicit
Sub CongThúc()
 Dim Cls As Range, Rng As Range
 
 Set Rng = [A1].End(xlDown).CurrentRegion
 For Each Cls In Rng(1).Offset(, 2).Resize(Rng.Rows.Count)
    With Cls
        If .Offset(, -1).Value > 0 And .Offset(, -2).Value > 0 Then _
            .FormulaR1C1 = "=RC[-2]+RC[-1]"
    End With
 Next Cls
End Sub
Cảm ơn bạn đã giúp đỡ
Vui lòng giải thích thêm
1/
PHP:
Set Rng = [A1].End(xlDown).CurrentRegion
đoạn trên có nghĩa: đặt biến Rng bắt đầu từ A1 và tính từ trên xuống, dữ liệu fải liên tục?
Và tôi sửa
PHP:
Set Rng = [A1].End(xlUp).CurrentRegion
thì kết qủa vẫn như nhau
Vậy trường hợp như thế nào thì mới sử dụng như của bạn, và sử dũng như của tôi?
2/ Bạn có thể giải thích cụ thể dùm chỗ này
PHP:
For Each Cls In Rng(1).Offset(, 2).Resize(Rng.Rows.Count)
Cảm ơn các bạn
 
Upvote 0
1./ Bạn làm trống 3 ô gần nhất bao quanh [A1] & thêm câu lệnh này

PHP:
 Set Rng = [A1].End(xlDown).CurrentRegion
 MsgBox [A1].CurrentRegion.Address, , Rng.Address
là thấm thía liền hà.

2./
Rng(1) - là ô đầu tiên của vùng Rng
(Có thể dùng MsgBox Rng(1).Address để tìm hiểu)

Rng(1).Offset(,2) là bên fải của Rng(1) ở cột [C]

Rng.Rows.Count là số dòng của Rng
Resize(Rng.Rows.Count) Là ô cột [C] mở rọng xuống dưới với số dòng = với số dòng của Rng

Tất cả các fương thức này (CurrentRegion, Resize(x,y), Offset(x,y),. . . ) bạn có thể tìm hiểu trên diễn đàn này

(húc bạn sớm thành công.
 
Upvote 0
1./ Bạn làm trống 3 ô gần nhất bao quanh [A1] & thêm câu lệnh này

PHP:
 Set Rng = [A1].End(xlDown).CurrentRegion
 MsgBox [A1].CurrentRegion.Address, , Rng.Address
là thấm thía liền hà.

2./
Rng(1) - là ô đầu tiên của vùng Rng
(Có thể dùng MsgBox Rng(1).Address để tìm hiểu)

Rng(1).Offset(,2) là bên fải của Rng(1) ở cột [C]

Rng.Rows.Count là số dòng của Rng
Resize(Rng.Rows.Count) Là ô cột [C] mở rọng xuống dưới với số dòng = với số dòng của Rng

Tất cả các fương thức này (CurrentRegion, Resize(x,y), Offset(x,y),. . . ) bạn có thể tìm hiểu trên diễn đàn này

(húc bạn sớm thành công.

Chắc từ từ mới thấm, các bạn giúp mình luôn dạng mảng. Xin cảm ơn!
 
Upvote 0
Các bạn vui lòng viết code dạng mảng ở bài 161 để minh thử so sánh?
Cảm ơn cả nhà.
 
Upvote 0
Upvote 0
Muốn gì thì cứ đưa file + ghi rõ yêu cầu lên đây rồi tính
Tìm đến bài 161 đã mất công, lại chưa hình dung được vấn đề (vì không có dữ liệu)
Yêu cầu của mình:

Nếu cell A1 và B1 lớn hơn không thì C1=A1+B1, tương tự cho các cell bên dưới

Vì em đang lọ mọ học hỏi, nên các anh chị giúp em viết theo hai cách:
1/ kiểu dạng RC (dạng công thức)
2/ Kiểu mảng
------------
Ki
ểu dạng RC đã được bạn ChanhTQ@ giúp rồi, và code của bạn ChanhTQ@ là (bài 162)
Mã:
[COLOR=#0000BB][FONT=monospace]Option Explicit
Sub CongThúc[/FONT][/COLOR][COLOR=#007700][FONT=monospace]()
 [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dim Cls [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rng [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range
 
 Set Rng [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]A1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlDown[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]CurrentRegion
 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Each Cls In Rng[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rng[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rows[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Count[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
    [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]With Cls
        [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, -[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]And .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, -[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 Then _
            [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]FormulaR1C1 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"=RC[-2]+RC[-1]"
    [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End With
 Next Cls
End Sub [/FONT][/COLOR]

Mình đã test thử trên File của mình với 10.000 dòng thì kết qủa cho 3,45 s
Mình muốn các bạn giúp viết code trên ở dạng mảng để mình có thể so sánh & học hỏi đó mà.
cảm ơn các bạn.
 

File đính kèm

  • Cthuc_Sum.rar
    72 KB · Đọc: 20
Upvote 0
Yêu cầu của mình:

Nếu cell A1 và B1 lớn hơn không thì C1=A1+B1, tương tự cho các cell bên dưới

Vì em đang lọ mọ học hỏi, nên các anh chị giúp em viết theo hai cách:
1/ kiểu dạng RC (dạng công thức)
2/ Kiểu mảng
------------
Ki
ểu dạng RC đã được bạn ChanhTQ@ giúp rồi, và code của bạn ChanhTQ@ là (bài 162)
Mã:
[COLOR=#0000BB][FONT=monospace]Option Explicit
Sub CongThúc[/FONT][/COLOR][COLOR=#007700][FONT=monospace]()
 [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dim Cls [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rng [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range
 
 Set Rng [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]A1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlDown[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]CurrentRegion
 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Each Cls In Rng[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rng[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rows[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Count[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
    [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]With Cls
        [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, -[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]And .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, -[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 Then _
            [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]FormulaR1C1 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"=RC[-2]+RC[-1]"
    [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End With
 Next Cls
End Sub [/FONT][/COLOR]

Mình đã test thử trên File của mình với 10.000 dòng thì kết qủa cho 3,45 s
Mình muốn các bạn giúp viết code trên ở dạng mảng để mình có thể so sánh & học hỏi đó mà.
cảm ơn các bạn.
Bạn xem sự khác biệt nhé
PHP:
Sub CongThuc2()
 Dim Cls As Range, kq(), i
 Dim StartTime As Double
StartTime = Timer
 kq = Range("A1:A" & [A65536].End(3)).Resize(, 3).Value
   For i = 1 To UBound(kq)
      If kq(i, 1) > 0 And kq(i, 2) > 0 Then
         kq(i, 3) = kq(i, 1) + kq(i, 2)
      End If
   Next
[A1].Resize(i - 1, 3) = kq
 MsgBox Format(Timer - StartTime, "00.00") & " giây."
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn xem sự khác biệt nhé
PHP:
Sub CongThuc2()
 Dim kq(), i
 Dim StartTime As Double
StartTime = Timer
 kq = Range("A1:A" & [A65536].End(3)).Resize(, 3).Value
   For i = 1 To UBound(kq)
      kq(i, 3) = kq(i, 1) + kq(i, 2)
   Next
[A1].Resize(i - 1, 3) = kq
 MsgBox Format(Timer - StartTime, "00.00") & " giây."
End Sub
Quá nhanh, nhưng điều kiện của người ta đâu ????
Híc
 
Upvote 0
Yêu cầu của mình:

Nếu cell A1 và B1 lớn hơn không thì C1=A1+B1, tương tự cho các cell bên dưới

Vì em đang lọ mọ học hỏi, nên các anh chị giúp em viết theo hai cách:
1/ kiểu dạng RC (dạng công thức)
2/ Kiểu mảng
------------
Ki
ểu dạng RC đã được bạn ChanhTQ@ giúp rồi, và code của bạn ChanhTQ@ là (bài 162)
Mã:
[COLOR=#0000BB][FONT=monospace]Option Explicit
Sub CongThúc[/FONT][/COLOR][COLOR=#007700][FONT=monospace]()
 [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dim Cls [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rng [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range
 
 Set Rng [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]A1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlDown[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]CurrentRegion
 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Each Cls In Rng[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rng[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rows[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Count[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
    [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]With Cls
        [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, -[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]And .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Offset[/FONT][/COLOR][COLOR=#007700][FONT=monospace](, -[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]0 Then _
            [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]FormulaR1C1 [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"=RC[-2]+RC[-1]"
    [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End With
 Next Cls
End Sub [/FONT][/COLOR]

Mình đã test thử trên File của mình với 10.000 dòng thì kết qủa cho 3,45 s
Mình muốn các bạn giúp viết code trên ở dạng mảng để mình có thể so sánh & học hỏi đó mà.
cảm ơn các bạn.
Thử code này xem nó ra kết quả trong mấy giây:
Mã:
Sub Test()
  Dim sArray, Arr()
  Dim i As Long, n As Long
  Dim tmp1 As Double, tmp2 As Double, t As Double
  On Error Resume Next
  t = Timer
  sArray = Range("A1").CurrentRegion.Value
  ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
  For i = 1 To UBound(sArray, 1)
    tmp1 = CLng(sArray(i, 1))
    tmp2 = CLng(sArray(i, 2))
    If tmp1 > 0 Then
      If tmp2 > 0 Then Arr(i, 1) = tmp1 + tmp2
    End If
  Next
  Range("D1").Resize(UBound(Arr, 1)).Value = Arr
  MsgBox Format(Timer - t, "0.000") & " giây."
End Sub
 
Upvote 0
Bạn xem sự khác biệt nhé
PHP:
Sub CongThuc2()
 Dim Cls As Range, kq(), i
 Dim StartTime As Double
StartTime = Timer
 kq = Range("A1:A" & [A65536].End(3)).Resize(, 3).Value
   For i = 1 To UBound(kq)
      If kq(i, 1) > 0 And kq(i, 2) > 0 Then
         kq(i, 3) = kq(i, 1) + kq(i, 2)
      End If
   Next
[A1].Resize(i - 1, 3) = kq
 MsgBox Format(Timer - StartTime, "00.00") & " giây."
End Sub
Đúng là tốc độ của mảng thật là tuyệt vời chỉ có 0,08s so với 3,45s
Xin cảm ơn bạn 1 lần nữa!
 
Upvote 0
Thử code này xem nó ra kết quả trong mấy giây:
Mã:
Sub Test()
  Dim sArray, Arr()
  Dim i As Long, n As Long
  Dim tmp1 As Double, tmp2 As Double, t As Double
  On Error Resume Next
  t = Timer
  sArray = Range("A1").CurrentRegion.Value
  ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
  For i = 1 To UBound(sArray, 1)
    tmp1 = [COLOR=#ff0000][B]CLng[/B][/COLOR](sArray(i, 1))
    tmp2 = [B][COLOR=#ff0000]CLng[/COLOR][/B](sArray(i, 2))
    If tmp1 > 0 Then
      If tmp2 > 0 Then Arr(i, 1) = tmp1 + tmp2
    End If
  Next
  Range("D1").Resize(UBound(Arr, 1)).Value = Arr
  MsgBox Format(Timer - t, "0.000") & " giây."
End Sub
Vui lòng cho hỏi CLng để làm gì? có fải làm tròn số không?
Cảm ơn bạn!
 
Upvote 0
Vui lòng cho hỏi CLng để làm gì? có fải làm tròn số không?
Cảm ơn bạn!

Là đổi 1 giá trị ra kiểu Long (đúng ra nên là CDbl mới chính xác ---> Đổi dữ liệu ra kiểu Double)
Ai mà biết trong dữ liệu có cái quỷ gì ---> Lỡ ai đó vô tình gõ text vào 1 vài cell thì sao?
Nói chung: Cẩn thận đến mức tối đa để bảo đảm dữ liệu gì cũng chạy được. Và nếu cần thận hơn nữa, nên thêm hàm IsNumeric để kiểm tra dữ liệu có phải là số hay không
 
Upvote 0
Là đổi 1 giá trị ra kiểu Long (đúng ra nên là CDbl mới chính xác ---> Đổi dữ liệu ra kiểu Double)
Ai mà biết trong dữ liệu có cái quỷ gì ---> Lỡ ai đó vô tình gõ text vào 1 vài cell thì sao?
Nói chung: Cẩn thận đến mức tối đa để bảo đảm dữ liệu gì cũng chạy được. Và nếu cần thận hơn nữa, nên thêm hàm IsNumeric để kiểm tra dữ liệu có phải là số hay không
Em lại nghĩ là dấu + nó sẽ giúp mình xử lý cái vụ text này chứ
Đúng là nếu 2 ô đêu là text thì dấu + lại thành toán tử &
 
Lần chỉnh sửa cuối:
Upvote 0
Em lại nghĩ là dấu + nó sẽ giúp mình xử lý cái vụ text này chứ
Đúng là nếu 2 ô đêu là text thì dấu + lại thành toán tử &
Cái đó cũng còn hên! Nếu 1 ô Text, 1 ô Number thì sao?
Vậy thì CẨN THẬN HƠN:
Mã:
Sub Test()
  Dim sArray, Arr()
  Dim i As Long, n As Long
  Dim tmp1 As Double, tmp2 As Double, t As Double
  On Error Resume Next
  t = Timer
  sArray = Range("A1").CurrentRegion.Value
  ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
  For i = 1 To UBound(sArray, 1)
    If IsNumeric(sArray(i, 1)) Then
      tmp1 = CDbl(sArray(i, 1))
      If IsNumeric(sArray(i, 2)) Then
        tmp2 = CDbl(sArray(i, 2))
        If tmp1 > 0 Then
          If tmp2 > 0 Then Arr(i, 1) = tmp1 + tmp2
        End If
      End If
    End If
  Next
  Range("D1").Resize(UBound(Arr, 1)).Value = Arr
  MsgBox Format(Timer - t, "0.000") & " giây."
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin cho hỏi , tại sao code dưới đây không cho kết qủa
Dữ liệu trong File: Cột A, B số liệu không liên tục
Mã:
Sub CongThuc5()    Dim sArray, Arr()
    Dim i As Long, n As Long
    Dim tmp1 As Double, tmp2 As Double, t As Double
    On Error Resume Next
    t = Timer
    sArray = Range("A1:A" & [A65536].End(3)).Value
    MsgBox Range("A1:A" & [A65536].End(3)).Address
    MsgBox UBound(sArray, 1)
    ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
    For i = 1 To UBound(sArray, 1)
        tmp1 = CDbl(sArray(i, 1))
        tmp2 = CDbl(sArray(i, 2))
        If tmp1 > 0 Then
            If tmp2 > 0 Then Arr(i, 1) = tmp1 + tmp2
        End If
    Next
    Range("D1").Resize(UBound(Arr, 1)).Value = Arr
    MsgBox Format(Timer - t, "0.000") & " giây."
End Sub
Các bạn giải thích giúp. Xin cảm ơn
 

File đính kèm

  • Cthuc_Sum_1.rar
    72.5 KB · Đọc: 25
Upvote 0
Xin cho hỏi , tại sao code dưới đây không cho kết qủa
Dữ liệu trong File: Cột A, B số liệu không liên tục
Mã:
Sub CongThuc5()    Dim sArray, Arr()
    Dim i As Long, n As Long
    Dim tmp1 As Double, tmp2 As Double, t As Double
    On Error Resume Next
    t = Timer
    [COLOR=#ff0000][B]sArray = Range("A1:A" & [A65536].End(3)).Value[/B][/COLOR]
    MsgBox Range("A1:A" & [A65536].End(3)).Address
    MsgBox UBound(sArray, 1)
    ReDim Arr(1 To UBound(sArray, 1), 1 To 1)
    For i = 1 To UBound(sArray, 1)
        tmp1 = CDbl(sArray(i, 1))
        tmp2 = CDbl(sArray(i, 2))
        If tmp1 > 0 Then
            If tmp2 > 0 Then Arr(i, 1) = tmp1 + tmp2
        End If
    Next
    Range("D1").Resize(UBound(Arr, 1)).Value = Arr
    MsgBox Format(Timer - t, "0.000") & " giây."
End Sub
Các bạn giải thích giúp. Xin cảm ơn

Sai chổ màu đỏ ấy
Sửa lại thành:
Mã:
sArray = Range("A1:[COLOR=#ff0000]B[/COLOR]" & [A65536].End(3)[COLOR=#ff0000].Rows[/COLOR]).Value
Còn tôi thì thích viết vầy hơn:
Mã:
sArray = Range([A1], [B65536].End(3)).Value
 
Upvote 0
Sai chổ màu đỏ ấy
Sửa lại thành:
Mã:
sArray = Range("A1:[COLOR=#ff0000]B[/COLOR]" & [A65536].End(3)[COLOR=#ff0000].Rows[/COLOR]).Value
Còn tôi thì thích viết vầy hơn:
Mã:
sArray = Range([A1], [B65536].End(3)).Value
Và mình có sửa như bên dưới, kg biết có chính xác không?
(cách 1)
Mã:
sArray = Range("A1:A" & [A65536].End(3)).Resize(, 2).Value
Hoặc (cách 2)
Mã:
sArray = Range("A1:A" & [A65536].End(3)).Resize(, 3).Value
(cách 2: dư 1 cột, thấy không cần thiết!)

Thấy code vẫn chạy đúng
Theo các bạn có nên sử dụng 2 cách trên không?
Xin cảm ơn!
 
Upvote 0
Và mình có sửa như bên dưới, kg biết có chính xác không?
(cách 1)
Mã:
sArray = Range("A1:A" & [A65536].End(3)).Resize(, 2).Value
Hoặc (cách 2)
Mã:
sArray = Range("A1:A" & [A65536].End(3)).Resize(, 3).Value
(cách 2: dư 1 cột, thấy không cần thiết!)

Thấy code vẫn chạy đúng
Theo các bạn có nên sử dụng 2 cách trên không?
Xin cảm ơn!
Sai hoàn toàn
Dữ liệu của bạn đang tới cell A10000 và nó đang có giá trị = 10000. Giờ bạn sửa giá trị của cell A10000 thành số 2 rồi chạy code xem nó ra cái gì nhé
 
Upvote 0
Sai hoàn toàn
Dữ liệu của bạn đang tới cell A10000 và nó đang có giá trị = 10000. Giờ bạn sửa giá trị của cell A10000 thành số 2 rồi chạy code xem nó ra cái gì nhé
Nó chỉ cho kết quảtại D1&D2 thôi! tại sao nhỉ, bạn giải thích giúp mình?
Cảm ơn các bạn!
 
Upvote 0
Web KT
Back
Top Bottom