Tính tổng bằng hàm Ubound....Anh/Chị giúp em!

Liên hệ QC

alias1313

Thành viên hoạt động
Tham gia
7/4/17
Bài viết
163
Được thích
13
Em có 2 mảng:

Workbook1.Sheet1!range( A1:G1)
Workbook2.Sheet1!range(A2:G2)

Giúp em dùng For và Ubound để tính tổng 2 mảng trên!
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Em có 2 mảng:

Workbook1.Sheet1!range( A1:G1)
Workbook2.Sheet1!range(A2:G2)

Giúp em dùng For vs Ubound để tính tổng 2 mảng trên!
Em cảm ơn!
không rõ yêu cầu nên trừ hao 2 sub
Mã:
Sub Sum2Array1()
  'tinh tong tung dong và tong cong
  Dim Arr1(), Arr2(), Tong As Double, Tong1 As Double, Tong2 As Double, j As Long
  Arr1 = Workbooks(1).Sheets("Sheet1").Range("A1:G1").Value
  Arr2 = Workbooks(1).Sheets("Sheet1").Range("A2:G2").Value
  For j = 1 To UBound(Arr1, 2)
    Tong1 = Tong1 + Arr1(1, j)
    Tong2 = Tong2 + Arr2(1, j)
    Tong = Tong + Arr1(1, j) + Arr2(1, j)
  Next j
  Workbooks(1).Sheets("Sheet1").Range("A4") = Tong1
  Workbooks(1).Sheets("Sheet1").Range("A5") = Tong2
  Workbooks(1).Sheets("Sheet1").Range("A6") = Tong
End Sub

Sub Sum2Array2()
'tinh tong cua ca 2 dong
Dim Arr1(), Arr2(), Tong As Double, i As Long, j As Long
Arr = Workbooks(1).Sheets("Sheet1").Range("A1:G2").Value
For i = 1 To UBound(Arr)
  For j = 1 To UBound(Arr, 2)
    Tong = Tong + Arr(i, j)
  Next j
Next i
Workbooks(1).Sheets("Sheet1").Range("A6") = Tong
End Sub
 
không rõ yêu cầu nên trừ hao 2 sub
Mã:
Sub Sum2Array1()
  'tinh tong tung dong và tong cong
  Dim Arr1(), Arr2(), Tong As Double, Tong1 As Double, Tong2 As Double, j As Long
  Arr1 = Workbooks(1).Sheets("Sheet1").Range("A1:G1").Value
  Arr2 = Workbooks(1).Sheets("Sheet1").Range("A2:G2").Value
  For j = 1 To UBound(Arr1, 2)
    Tong1 = Tong1 + Arr1(1, j)
    Tong2 = Tong2 + Arr2(1, j)
    Tong = Tong + Arr1(1, j) + Arr2(1, j)
  Next j
  Workbooks(1).Sheets("Sheet1").Range("A4") = Tong1
  Workbooks(1).Sheets("Sheet1").Range("A5") = Tong2
  Workbooks(1).Sheets("Sheet1").Range("A6") = Tong
End Sub

Sub Sum2Array2()
'tinh tong cua ca 2 dong
Dim Arr1(), Arr2(), Tong As Double, i As Long, j As Long
Arr = Workbooks(1).Sheets("Sheet1").Range("A1:G2").Value
For i = 1 To UBound(Arr)
  For j = 1 To UBound(Arr, 2)
    Tong = Tong + Arr(i, j)
  Next j
Next i
Workbooks(1).Sheets("Sheet1").Range("A6") = Tong
End Sub


@HieuCD Em cảm ơn anh nhiều!
ANh cho em hỏi thêm tí về hàm Ubound:

A(1,3,7,9,11)
B(1 to 3, 1to 9, 4 to 10, 2 to 15, 5 to 21)
C("GH", "EF", "TQ")

1. UBound (A,1) = 1, UBound (A,5)= 11

2. UBound (B,1) = 3, UBound (B,5) = 21

3.UBound(Arr1, 1), UBound(Arr1, 2) ( giá trị giống code A viết), 2 hàm UBound này giá trị trả về là bao nhiêu?

4. for i = LBound(C) to UBound(C), ở đây giá trị của i bằng bao nhiêu, chạy từ đâu tới đâu?

Em không biết khi nào UBound(array) trả về giá trị lớn nhất là số thứ tự, khi nào trả về giá trị lớn nhất là: giá trị lớn nhất trong mảng

Anh có thể giúp em trả lời các thắc mắc ở trên được không Anh
Thanhks Anh!
 
Lần chỉnh sửa cuối:
Chờ mấy bạn khác đi.
Tôi có vấn đề, không thể trả lời những câu hỏi có đía có thánh. Nếu muốn tôi trả lời thì xoá những từ ấy đi.
 
@HieuCD Em cảm ơn anh nhiều!
ANh cho em hỏi thêm tí về hàm Ubound:

A(1,3,7,9,11)
B(1 to 3, 1to 9, 4 to 10, 2 to 15, 5 to 21)
C("GH", "EF", "TQ")

1. UBound (A,1) = 1, UBound (A,5)= 11

2. UBound (B,1) = 3, UBound (B,5) = 21

3.UBound(Arr1, 1), UBound(Arr1, 2) ( giá trị giống code A viết), 2 hàm UBound này giá trị trả về là bao nhiêu?

4. for i = LBound(C) to UBound(C), ở đây giá trị của i bằng bao nhiêu, chạy từ đâu tới đâu?

Em không biết khi nào UBound(array) trả về giá trị lớn nhất là số thứ tự, khi nào trả về giá trị lớn nhất là: giá trị lớn nhất trong mảng

Anh có thể giúp em trả lời các thắc mắc ở trên được không Anh
Thanhks Anh!
mình không biết về lý thuyết, chỉ nhập lệnh thử, bấm phím chức năng F8 cho chạy từng dòng lệnh, rà chuột vào từng biến xem giá trị của biến và so sánh với mảng để đoán tác dụng của lệnh, bạn nên làm theo cách nầy và kiểm lại những gì bạn học sẽ hiểu thôi
 
Em đã xóa! Mong Anh giúp đỡ!
@HieuCD Em cảm ơn anh nhiều!
ANh cho em hỏi thêm tí về hàm Ubound:

A(1,3,7,9,11)
B(1 to 3, 1to 9, 4 to 10, 2 to 15, 5 to 21)
C("GH", "EF", "TQ")

1. UBound (A,1) = 1, UBound (A,5)= 11

2. UBound (B,1) = 3, UBound (B,5) = 21

3.UBound(Arr1, 1), UBound(Arr1, 2) ( giá trị giống code A viết), 2 hàm UBound này giá trị trả về là bao nhiêu?

4. for i = LBound(C) to UBound(C), ở đây giá trị của i bằng bao nhiêu, chạy từ đâu tới đâu?

Anh có thể giúp em trả lời các thắc mắc ở trên được không Anh
Thanhks Anh! ' bạn quên cái này, nó là cái mà tôi gọi là thánh

1. Giả sử từ DIM được hiểu ngầm thì A(1,3,7,9,11) : mảng A có 5 chiều
UBound(A,5) hỏi chỉ số lớn nhất của chiều thứ 5; nó là 11. Nếu hỏi chỉ số lớn nhất của chiều thứ 4 thì dùng UBound(A,4), và kết quả là 9

2. tương tự cho mảng B

3. Nếu Arr1 được copy từ A ở trên thì UBound(Arr1, 1) = 1, UBound(Arr1, 2) = 3

4. Chả biết C("GH", "EF", "TQ") có nghĩa là gì. Nếu là mảng thì ký hiệu trong VBA là dấu ngoặc cong { }, {"GH", "EF", "TQ" }
Nếu là kết quả của hàm execute [ ] thì LBound của nó tuỳ thuộc vào option base, mặc định là 1. Nếu là kết quả của hàm Array thì LBound luôn luôn là 0
Trong cả 2 trường hợp, UBound là (số phần tử + LBound - 1)

KẾT LUẬN: giáo viên nào ra bài tập dỏm, khong rõ ràng gì cả. Mọi thứ đếu phải đặt tiền đề NẾU.
 
mình không biết về lý thuyết, chỉ nhập lệnh thử, bấm phím chức năng F8 cho chạy từng dòng lệnh, rà chuột vào từng biến xem giá trị của biến và so sánh với mảng để đoán tác dụng của lệnh, bạn nên làm theo cách nầy và kiểm lại những gì bạn học sẽ hiểu thôi

Em đã thử và rất hiệu quả...Cảm ơn Anh!
 
1. Giả sử từ DIM được hiểu ngầm thì A(1,3,7,9,11) : mảng A có 5 chiều
UBound(A,5) hỏi chỉ số lớn nhất của chiều thứ 5; nó là 11. Nếu hỏi chỉ số lớn nhất của chiều thứ 4 thì dùng UBound(A,4), và kết quả là 9

2. tương tự cho mảng B

3. Nếu Arr1 được copy từ A ở trên thì UBound(Arr1, 1) = 1, UBound(Arr1, 2) = 3

4. Chả biết C("GH", "EF", "TQ") có nghĩa là gì. Nếu là mảng thì ký hiệu trong VBA là dấu ngoặc cong { }, {"GH", "EF", "TQ" }
Nếu là kết quả của hàm execute [ ] thì LBound của nó tuỳ thuộc vào option base, mặc định là 1. Nếu là kết quả của hàm Array thì LBound luôn luôn là 0
Trong cả 2 trường hợp, UBound là (số phần tử + LBound - 1)

KẾT LUẬN: giáo viên nào ra bài tập dỏm, khong rõ ràng gì cả. Mọi thứ đếu phải đặt tiền đề NẾU.


Cảm ơn Anh ....em đã hiểu thêm nhiều.
Em xin hỏi thêm xin Anh giúp:
Mã:
For i = LBound(arr) to UBound(arr)
Set RangeA = filename.Worksheets(name).Range(Range_String(i))
            Hsum = Application.Sum(RangeA) 
Next i
For i = LBound(Value_Range) To UBound(Value_Range)                  
        Worksheets("Sheet1").Range(Value_Range(i)) = Hsum + Worksheets("Sheet2").Range(NGAY_RANGE(i)).Value
Next i
Worksheets("Sheet1").Range("F2").Offset(i, 0) = Hsum    ' cái này chỉ add ra một kết quả duy nhất tại F(2+i) = Hsum

Đoạn code trên em tóm tắt từ một bài rất dài(nên về cấu trúc và logic có thể không đúng), em xin rút ngắn để hỏi phần cần hỏi:
Khi tính em tường Hsum sẽ chạy theo (i) nhưng không phải, Nó chỉ trả về 1 giá trị cuối cùng trong mảng
Em đã dùng F8 kiểm tra vòng lặp giống Anh @HieuCD chỉ và thấy giá trị vòng for..next là đúng.

Anh có thề chỉ em cách để lấy Hsum theo (i), ra ngoài vòng lăp for..next không, để em có thể dễ dàng add vào workbooks.sheets tùy ý?
hoặc lấy Hsum theo (i) add vào môt file excel khác

Em mò 2 ngày rồi chưa ra.
Mong anh giúp đỡ!!!
 
Lần chỉnh sửa cuối:
Mã:
For i = LBound(arr) to UBound(arr)
Set RangeA = filename.Worksheets(name).Range(Range_String(i))
            Hsum = Application.Sum(CT_Range) 
Next i

Đoạn code trên em tóm tắt từ một bài rất dài(nên về cấu trúc và logic có thể không đúng), em xin rút ngắn để hỏi phần cần hỏi:
Khi tính em tường Hsum sẽ chạy theo (i) nhưng không phải, Nó chỉ trả về 1 giá trị cuối cùng trong mảng

Có tới mấy chỗ kỳ quặc trong code này lận:
1. Ai mà biết tại sao bạn dùng chỉ số i để duyệt mảng Range_String, trong khi đó lại giới hạn vòng lặp theo kích cỡ của mảng arr. Tôi đâu có thấy code chỗ nào chỉ định hai mảng đó là mọt đâu.
2. Bạn chạy hết vòng lặp nhưng chỉ xài 1 cái CT_Range lấy ở đâu đó. Đương nhiên từ lượt đầu tiên cho đến lượt cuối, Hsum chỉ có 1 trị.
3. Nếu bạn nhầm lẫn, đáng lẽ RangeA thay vì CT_Range thì code này vẫn đâu có cộng tổng Hsum. Nó chỉ tính sum cho cái range cuối cùng trong nhóm thôi.
Muốn tổng tất cả thì phải là Hsum = Hsum + Application.Sum(RangeA)
 
Có tới mấy chỗ kỳ quặc trong code này lận:
1. Ai mà biết tại sao bạn dùng chỉ số i để duyệt mảng Range_String, trong khi đó lại giới hạn vòng lặp theo kích cỡ của mảng arr. Tôi đâu có thấy code chỗ nào chỉ định hai mảng đó là mọt đâu.
2. Bạn chạy hết vòng lặp nhưng chỉ xài 1 cái CT_Range lấy ở đâu đó. Đương nhiên từ lượt đầu tiên cho đến lượt cuối, Hsum chỉ có 1 trị.
3. Nếu bạn nhầm lẫn, đáng lẽ RangeA thay vì CT_Range thì code này vẫn đâu có cộng tổng Hsum. Nó chỉ tính sum cho cái range cuối cùng trong nhóm thôi.
Muốn tổng tất cả thì phải là Hsum = Hsum + Application.Sum(RangeA)


Em nhầm.....CT_Range = RangeA
Trong vòng lặp for..next đó em gán: Hsum = Application.Sum(RangeA)
Có cách nào mình gán: Hsum1,Hsum2....Hsum(i) cho lần lượt các giá trị: Application.Sum(RangeA) ( Với RangeA theo (i))
Như thế em có thể lấy các Hsum1-i đó add ra file excel khác.
 
Web KT
Back
Top Bottom