Xác định số thứ tự của phần tử trong 1 mảng (1 người xem)

  • Thread starter Thread starter anjhan
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

anjhan

Thành viên mới
Tham gia
19/4/09
Bài viết
22
Được thích
1
Nghề nghiệp
Đang thất nghiệp
Giả sử mình có 1 mảng dọc giả dụ B3:B10. Làm sao để lấy giá trị số thự tự của phần tử đầu tiên đến phần tử cuối cùng của mảng đó. Chẳng hạn mảng B3:B10 có 8 phần tử sẽ lấy giá trị từ 8 đến 1 ( For ... = 8 to 1). Mình đình dùng Lbound, Ubound mà chưa hiểu hết cách dùng. Mong các bạn giúp đỡ.
 
Giả sử mình có 1 mảng dọc giả dụ B3:B10. Làm sao để lấy giá trị số thự tự của phần tử đầu tiên đến phần tử cuối cùng của mảng đó. Chẳng hạn mảng B3:B10 có 8 phần tử sẽ lấy giá trị từ 8 đến 1 ( For ... = 8 to 1). Mình đình dùng Lbound, Ubound mà chưa hiểu hết cách dùng. Mong các bạn giúp đỡ.


- Lấy giá trị xong thì để nó ở đâu? Để làm gì?
- Chắc không ai "huỡn" giả lập dữ liệu và làm theo kiểu "mơ hồ" như vậy đâu.
 
Mình lấy giá trị đó để nhân với giá trị khác chẳng hạn là giá trị của cell đó trong range, chẳng hạn ô B3 có giá trị 1327 sẽ lấy giá trị 1327 nhân với 8.
 
Mình chi đang tìm hiểu thêm về vba thôi. Mong các bạn thông cảm.
 
Mã:
Function tDem(Rng As Range)
Dim MyStr As String
Dim Cll As Range
Dim d As Integer
d = Application.WorksheetFunction.Count(Rng)
Dim c (1 To d) As Integer
    For Each Cll In Rng
    a = Cll.Value
        For i = UBound(c) To LBound(c)
    b = a * i
    tDem = tDem + b
    Next
        Next
End Function

Không biết là sai ở đâu, mong các bạn chỉ giúp.
 
Lần chỉnh sửa cuối:
Mã:
Function tDem(Rng As Range, Str As String)
Dim MyStr As String
Dim Cll As Range
Dim d As Integer
d = Application.WorksheetFunction.Count(Rng)
Dim c (1 To d) As Integer
    For Each Cll In Rng
    a = Cll.Value
        For i = UBound(c) To LBound(c)
    b = a * i
    tDem = tDem + b
    Next
        Next
End Function

Không biết là sai ở đâu, mong các bạn chỉ giúp.

Đã nói bên trên.
Ý bạn muốn làm gì nên nói rõ kèm theo file Excel có dữ liệu và mẫu kết quả muốn có để mọi người dễ hiểu.
Bạn tự nghĩ ra một cái gì đó rồi viết, hỏi người khác sai chỗ nào, ví dụ tôi viết 1 tràng tiếng "Ả Rập pha Campuchia" rồi nhờ người khác chỉ các chỗ sai, ai biết đâu mà chỉ.
Nếu muốn "tự học" VBA nên chuyển sang Topic chuyên đề về Macro, hay các câu hỏi về VBA ... có lẽ sẽ thích hợp hơn.

http://www.giaiphapexcel.com/forum/forumdisplay.php?89-Hỏi-đáp-về-VBA-Macro
 
Lần chỉnh sửa cuối:
Giả sử mình có 1 mảng dọc giả dụ B3:B10. Làm sao để lấy giá trị số thự tự của phần tử đầu tiên đến phần tử cuối cùng của mảng đó. Chẳng hạn mảng B3:B10 có 8 phần tử sẽ lấy giá trị từ 8 đến 1 ( For ... = 8 to 1). Mình đình dùng Lbound, Ubound mà chưa hiểu hết cách dùng. Mong các bạn giúp đỡ.

Mã:
Function tDem(Rng As Range, Str As String)
Dim MyStr As String
Dim Cll As Range
Dim d As Integer
d = Application.WorksheetFunction.Count(Rng)
Dim c (1 To d) As Integer
    For Each Cll In Rng
    a = Cll.Value
        For i = UBound(c) To LBound(c)
    b = a * i
    tDem = tDem + b
    Next
        Next
End Function

Không biết là sai ở đâu, mong các bạn chỉ giúp.

Từ 2 bài của bạn gửi lên, tôi chưa xác định rõ bạn đếm số phần tử hay lấy giá trị của mỗi phần tử trong mảng đó nữa! Bạn nói rõ lên xem sao!

Bạn gửi một cái file giả định lên, bạn đưa ra kết quả cần có là gì sẽ dễ hiểu hơn nhiều so với cách mà bạn diễn giải đó!
 
Thank Ba Tê. Mình cũng không dành lắm về cái này. Thôi mình xin up file để các bạn xem vậy.
 

File đính kèm

Thank Ba Tê. Mình cũng không dành lắm về cái này. Thôi mình xin up file để các bạn xem vậy.
Đếm số ô dữ liệu trong mảng D5:D11. Sau đó lấy giá trị các ô nhân với số ô giảm dần. Ở đây có 7 ô thì tdem= 1237*7 + 1843*6 + 1771*5 + 1833*4+… đến 1971*1
Vẫn chưa "dõ dàng".
Tính rồi để luôn trong "bộ nhớ", hay ghi số liệu vào các ô nào, hay ....
Híc!
 
Lần chỉnh sửa cuối:
Ô C5= tdem( D5:D11) Ghi dữ liệu vào ô.
 
Thank Ba Tê. Mình cũng không dành lắm về cái này. Thôi mình xin up file để các bạn xem vậy.
Gửi cái file lên phải lẹ hơn không!

Mã:
Function NhanPhanTu(ByVal MyRange As Range) As Double
    Dim r As Long
    Dim sArray, itm
    sArray = MyRange
    If Not IsArray(sArray) Then
        sArray = Array(sArray)
    End If
    For Each itm In sArray
        r = r + 1
        NhanPhanTu = NhanPhanTu + Val(itm) * r
    Next
End Function
 
Ô C5= tdem( D5:D11) Ghi dữ liệu vào ô.
Nếu là Function thì thử cái này:
PHP:
Public Function GPE(Rng As Range) As Double
Dim Cll As Range, R As Long
R = Rng.Rows.Count
For Each Cll In Rng
    GPE = GPE + Cll * R
    R = R - 1
Next Cll
End Function
Nếu muốn thử nghiệm với mảng, Ubound.. thì xem cái này:
PHP:
Public Function GPE(Rng As Range) As Double
Dim Arr(), I As Long, R As Long
Arr = Rng.Value
R = UBound(Arr, 1)
For I = 1 To R
    GPE = GPE + Arr(I, 1) * R
    R = R - 1
Next I
End Function
 
Lần chỉnh sửa cuối:
Uh trời có cái funtion mà chờ ngoài quán cả buổi sáng. Poor me. Thank các bạn nhiều
 
Ô C5= tdem( D5:D11) Ghi dữ liệu vào ô.

Uh trời có cái funtion mà chờ ngoài quán cả buổi sáng. Poor me. Thank các bạn nhiều

Bài viết vừa rồi tôi hơi nhầm là bạn "đếm ngược" chứ không phải đếm xuôi!

Thế nhưng cho hỏi, bạn chọn 1 vùng 10 ô, giả sử 9 ô là không có giá trị hoặc bằng 0, 1 ô thì có, vậy nó nhân với 10 hay nó chỉ nhân với 1 giá trị vậy???

Nếu chỉ nhân với 1 giá trị thì nhân với thứ tự nó đứng hay chỉ nhân với 1?
 
Lần chỉnh sửa cuối:
Uh trời có cái funtion mà chờ ngoài quán cả buổi sáng. Poor me. Thank các bạn nhiều
Cũng do bạn thôi, từ 9:46 sáng ở bài #2 tôi đã khuyên bạn gởi file và yêu cầu, kết quả muốn có..., mọi người dễ hiểu thì đâu tốn tiền "ngâm quán" lâu như vậy.
 
Nếu là Function thì thử cái này:
PHP:
Public Function GPE(Rng As Range) As Double
Dim Cll As Range, R As Long
R = Rng.Rows.Count
For Each Cll In Rng
    GPE = GPE + Cll * R
    R = R - 1
Next Cll
End Function
Nếu muốn thử nghiệm với mảng, Ubound.. thì xem cái này:
PHP:
Public Function GPE(Rng As Range) As Double
Dim Arr(), I As Long, R As Long
Arr = Rng.Value
R = UBound(Arr, 1)
For I = 1 To R
    GPE = GPE + Arr(I, 1) * R
    R = R - 1
Next I
End Function


Sao kiểm tra lại em thấy hàm của anh thế nào ấy nhỉ?
 

File đính kèm

Bài viết vừa rồi tôi hơi nhầm là bạn "đếm ngược" chứ không phải đếm xuôi!

Thế nhưng cho hỏi, bạn chọn 1 vùng 10 ô, giả sử 9 ô là không có giá trị hoặc bằng 0, 1 ô thì có, vậy nó nhân với 10 hay nó chỉ nhân với 1 giá trị vậy???

Nếu chỉ nhân với 1 giá trị thì nhân với thứ tự nó đứng hay chỉ nhân với 1?

Nhân với thứ tự nó giảm dần
 
Xin hỏi Ba Tê nếu mình không lấy giá trị của ô mà mình lấy số chuỗi của ô thì làm thế nào vậy. Giả sử ô D5 là 1237 có 4 kí tự
 
Xin hỏi Ba Tê nếu mình không lấy giá trị của ô mà mình lấy số chuỗi của ô thì làm thế nào vậy. Giả sử ô D5 là 1237 có 4 kí tự
Bạn phải đưa ra trường hợp giả lập, sau đó là kết quả mong đợi, chứ hỏi vậy "ông nội" tôi cũng không hình dung ra nữa!
 
Vậy để mình up file. Sorry bạn

Tức là lấy tổng số kí tự ô thứ nhất nhân 7, tổng số kí tự ô thứ 2 nhân 6,… Mình nghĩ là lại phải tạo một mảng mới gồm tổng số kí tự thay vì giá trị

Cũng đang vọc chút về mảng mẽo cho vui, cái mảng mẻo này đúng là phức tạp hơn.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Tức là lấy tổng số kí tự ô thứ nhất nhân 7, tổng số kí tự ô thứ 2 nhân 6,… Mình nghĩ là lại phải tạo một mảng mới gồm tổng số kí tự thay vì giá trị

Quất đại đi!

Mã:
Function RacRoiQua(ByVal OneCell_Or_OneString As Variant) As Double
    Dim NumInStr As String
    Dim r As Long, i As Long, LenStr As Long
    NumInStr = Val(Trim(OneCell_Or_OneString))
    If NumInStr = "" Then Exit Function
    LenStr = Len(NumInStr)
    For i = LenStr To 1 Step -1
        r = r + 1
        RacRoiQua = RacRoiQua + Val(Mid(NumInStr, i, 1)) * r
    Next
End Function

Cách sử dụng:

1) Với 1 cell: Giả sử cell A1 có giá trị: 12345678

Công thức: =RacRoiQua(A1)

2) Với một chuỗi là 12345678

Công thức: =RacRoiQua("12345678")


Không biết có đúng ý bạn không!
 
Không phải bạn, bạn hiểu lầm ý mình rồi. Chẳng hạn có 8 ô dữ liệu. Mình sẽ lấy số kí tự của các ô nhân với số thứ tự giảm dần. Ví dụ ô 1 có 5 kí tự, ô 2 có 6 kí tự thì công thức sẽ là CT = 5.8 + 6.7 + ....
 
Lần chỉnh sửa cuối:
Không phải bạn, bạn hiểu lầm ý mình rồi. Chẳng hạn có 8 ô dữ liệu. Mình sẽ lấy số kí tự của các ô nhân với số thứ tự giảm dần. Ví dụ ô 1 có 5 kí tự, ô 2 nhân với 6 kí tự thì CT = 5.8 + 6.7 + ....
Trong cái file của bạn tôi đọc mà cũng chả hiểu gì cả? Bạn diễn giải khó hiểu thiệt!

Trong cái comments bạn ghi 6*6 mà tôi chả thấy số nào là số 6 trong vùng dữ liệu, đã ví dụ thì cũng ví dụ cho đàng hoàng một chút chứ!
 
Lần chỉnh sửa cuối:
Có gì khó hiểu đâu bạn. Thay vì lấy giá trị thì h mình lấy số kí tự trong ô đó.
 
Có gì khó hiểu đâu bạn. Thay vì lấy giá trị thì h mình lấy số kí tự trong ô đó.

Trong bài này tôi có nói (màu đỏ)

Trong cái file của bạn tôi đọc mà cũng chả hiểu gì cả? Bạn diễn giải khó hiểu thiệt!

Trong cái comments bạn ghi 6*6 mà tôi chả thấy số nào là số 6 trong vùng dữ liệu, đã ví dụ thì cũng ví dụ cho đàng hoàng một chút chứ!
 
Mình up lại file cho bạn.
 

File đính kèm

Lần chỉnh sửa cuối:
Mình up lại file cho bạn.
Hơi bị oải với mấy cái thí dụ ...
PHP:
Public Function GPE(Rng As Range) As Long
Dim Cll As Range, R As Long, L As Long
R = Rng.Rows.Count
For Each Cll In Rng
    L = Len(Cll)
    GPE = GPE + L * R
    R = R - 1
Next Cll
End Function
PHP:
Public Function GPEx(Rng As Range) As Double
Dim Arr(), I As Long, R As Long, L As Long
Arr = Rng.Value
R = UBound(Arr, 1)
For I = 1 To R
    L = Len(Arr(I, 1))
    GPEx = GPEx + L * R
    R = R - 1
Next I
End Function
 
Lần chỉnh sửa cuối:
Phá tui hoài vậy ta?
Function người đặt tên là GPE, tự nhiên sửa của người ta thành GPE1 trùng tên với ô GPE1 (cột 5153) trong Excel 2010???
Híc!
Replace GPE thành PhaTuiHoai

Mã:
Public Function PhaTuiHoai2(Rng As Range) As Double
Dim Arr(), i As Long, r As Long
Arr = Rng.Value
r = UBound(Arr, 1)
For i = 1 To r
    PhaTuiHoai2 = PhaTuiHoai2 + Arr(i, 1) * r
    r = r - 1
Next i
End Function

Trong trường hợp 2 nếu Rng là 1 cell duy nhất thì phát sinh lỗi đấy nhé anh iu!
 
Suy nghĩ mãi cũng hổng biết bài này ứng dụng vào cái gì?
Nếu chỉ để nghiên cứu chơi về mảng thì mấy chú tác giả cũng... rảnh thật (rảnh mới nghĩ ra được cái ví dụ không giống ai)
 
Trong cái file của bạn tôi đọc mà cũng chả hiểu gì cả? Bạn diễn giải khó hiểu thiệt!

Trong cái comments bạn ghi 6*6 mà tôi chả thấy số nào là số 6 trong vùng dữ liệu, đã ví dụ thì cũng ví dụ cho đàng hoàng một chút chứ!

Bạn đọc không kỹ lại trách người ta.
Trong tập tin chủ chủ đề không giải thích rõ. Lỗi này cả bạn và tôi đều nhìn thấy, không ai phủ nhận điều này.

Nhưng trong bài #23 chủ chủ đề đã giải thích mà

Mình sẽ lấy số kí tự của các ô nhân với số thứ tự giảm dần. Ví dụ ô 1 có 5 kí tự, ô 2 có 6 kí tự thì công thức sẽ là CT = 5.8 + 6.7 + ....

Mà D6 = 184378. Rõ ràng LEN(D6) = 6
-------------
Về góp ý, trách cứ thì tôi cũng từng, thậm chí thường xuyên.
Nhưng chỗ nào người ta sai, chưa cụ thể thì mới góp ý chứ. Sau bài #23 mà trách cứ người ta thì là mình sai.
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom