Lấy số trong các chuỗi theo điều kiện (2 người xem)

Liên hệ QC

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

Tôi biết là bạn lười, và bạn nghĩ là không được nên không thử làm như tôi hướng dẫn.

Thôi tôi đính kèm tập tin.

Tôi đã nói là bài của bạn chỉ có 2 trường hợp: >= 1 hoặc 0. Vậy thì cần gì đếm chính xác?

Tôi cho bạn bài toán: Nếu trong đám đông 10000 người có >= 1 người tóc vàng mắt xanh thì bạn vào nhà băng lĩnh 10 triệu.

Bạn sẽ làm thế nào? Tất nhiện là bạn sẽ kiểm tra người 1. Nếu không là tóc vàng mắt xanh thì kiểm tra người 2, và cứ thế tiếp tục. Giả sử người 50 có tóc vàng mắt xanh thì bạn vẫn cứ kiểm tra tiếp tới người 10000 hay là bạn thôi kiểm tra và đi nhà băng lĩnh tiền?

Xem tập tin đính kèm

Đây là ý mà bây giờ bạn mới thêm vào.

Khi tôi làm là tôi làm cho bài toán cụ thể mà bạn nêu rõ 2 trường hợp là >= 1 và < 1. Tính tôi không thích chơi trò "thông tin nhỏ giọt". Tôi không tham gia thêm nữa.
-------------
Tới bài này mới cần đếm chính xác.

Ý tưởng và làm vội, không suy nghĩ nhiều. Không nghĩ thêm nữa. Nhưng tôi nghĩ có thể rút gọn nữa.
Mã:
=jointext(",",TRUE,IF(TRANSPOSE(MMULT(--TRANSPOSE(ROW($5:$17)>0),LEN($C$5:$C$17)-LEN(SUBSTITUTE($C$5:$C$17,TRANSPOSE($F$3:$F$102),"*"))))>=2,$F$3:$F$102,""))
Tôi không tham gia nữa vì tôi đã nhìn thấy là bạn chơi trò "thông tin nhỏ giọt"


Tôi tôi xin rút lui.
Chào bạn @batman1 cái ý tưởng ">1 hoặc <1 hay là > hoặc < bất kỳ số nào đó" mình cũng đã đưa ngay vào file ban đầu, chắc bạn không dọc kỹ và để ý.
Đôi khi người hỏi thì thường thường kiến thức là nông cạn chắc chắn sẽ không và không bao giờ lường trước được những vấn đề có lỗi xảy ra sau này.
Vì vậy các bạn là những người am hiểu kiến thức sâu, xa thì cũng nên tư vấn cho người hỏi là:
- Nếu như nọ như kia..... thì làm như nào?
+ Ngoài ra trong đầu bài mình cũng đã tách ra từng mảng (Có nghĩa là hàm phải chọn được nhiều mảng)
+ Một ý nữa là mình muốn chỉ cần chọn vùng dữ liệu mà không cần chọn điều kiện các số từ 00 -99 bởi vì vùng điều kiện tốn không gian soạn thỏa và rất bất tiện.
Rất cảm ơn bạn @batman1 đã giúp đỡ và mong bạn tìm phương án ngắn gọn, hoặc bạn viết hàm VBA giúp mình
 
Cảm ơn bạn @phuocam chúc bạn buổi sớm và cuối tuần vui vẻ, mạnh khỏe
Bạn ơi công thức COUNTIF($C$5:$C$17,"*"&$F$3:$F$102&"*") là hàm đếm bị sai, vì vậy mong bạn viết giúp hàm khác giúp mình nhé
Cảm ơn bạn rất nhiều!
Cách dùng hàm trong file
Mã:
Function Join_Num(ByVal comStr, ByVal Deli As String, ParamArray sArr()) As String
  Dim Arr, iTem, nArr(0 To 99) As Long, cArr()
  Dim i As Long, j As Long, n As Long
  Dim iChar As String, tmp, Res As String
  cArr = Array(">=", "<=", ">", "<", "=")
  For Each Arr In sArr
    If Not IsArray(Arr) Then Arr = Array(Arr)
    For Each iTem In Arr
      If TypeName(iTem) = "Range" Then iTem = iTem.Value
      If TypeName(iTem) <> "Error" Then
        If Len(iTem) > 0 Then
          iTem = iTem & ","
          n = Len(iTem)
          For j = 1 To n
            iChar = Mid(iTem, j, 1)
            If IsNumeric(iChar) Then
              tmp = tmp & iChar
            ElseIf Len(tmp) > 0 Then
              tmp = CLng(tmp)
              If tmp < 100 Then nArr(tmp) = nArr(tmp) + 1
              tmp = ""
            End If
          Next j
        End If
      End If
    Next
  Next
  n = 4: tmp = comStr
  For i = 0 To 4
    If InStr(1, comStr, cArr(i)) > 0 Then
      tmp = CLng(Replace(comStr, cArr(i), ""))
      n = i
      Exit For
    End If
  Next i
  For i = 0 To 99
    Select Case n
      Case 0
        If nArr(i) >= tmp Then Res = Res & Deli & Format(i, "00")
      Case 1
        If nArr(i) <= tmp Then Res = Res & Deli & Format(i, "00")
      Case 2
        If nArr(i) > tmp Then Res = Res & Deli & Format(i, "00")
      Case 3
        If nArr(i) < tmp Then Res = Res & Deli & Format(i, "00")
      Case 4
        If nArr(i) = tmp Then Res = Res & Deli & Format(i, "00")
    End Select
  Next i
  If Len(Res) = 0 Then
    Join_Num = "K"
  Else
    Join_Num = Mid(Res, Len(Deli) + 1, Len(Res))
  End If
End Function
 

File đính kèm

Cách dùng hàm trong file
Mã:
Function Join_Num(ByVal comStr, ByVal Deli As String, ParamArray sArr()) As String
  Dim Arr, iTem, nArr(0 To 99) As Long, cArr()
  Dim i As Long, j As Long, n As Long
  Dim iChar As String, tmp, Res As String
  cArr = Array(">=", "<=", ">", "<", "=")
  For Each Arr In sArr
    If Not IsArray(Arr) Then Arr = Array(Arr)
    For Each iTem In Arr
      If TypeName(iTem) = "Range" Then iTem = iTem.Value
      If TypeName(iTem) <> "Error" Then
        If Len(iTem) > 0 Then
          iTem = iTem & ","
          n = Len(iTem)
          For j = 1 To n
            iChar = Mid(iTem, j, 1)
            If IsNumeric(iChar) Then
              tmp = tmp & iChar
            ElseIf Len(tmp) > 0 Then
              tmp = CLng(tmp)
              If tmp < 100 Then nArr(tmp) = nArr(tmp) + 1
              tmp = ""
            End If
          Next j
        End If
      End If
    Next
  Next
  n = 4: tmp = comStr
  For i = 0 To 4
    If InStr(1, comStr, cArr(i)) > 0 Then
      tmp = CLng(Replace(comStr, cArr(i), ""))
      n = i
      Exit For
    End If
  Next i
  For i = 0 To 99
    Select Case n
      Case 0
        If nArr(i) >= tmp Then Res = Res & Deli & Format(i, "00")
      Case 1
        If nArr(i) <= tmp Then Res = Res & Deli & Format(i, "00")
      Case 2
        If nArr(i) > tmp Then Res = Res & Deli & Format(i, "00")
      Case 3
        If nArr(i) < tmp Then Res = Res & Deli & Format(i, "00")
      Case 4
        If nArr(i) = tmp Then Res = Res & Deli & Format(i, "00")
    End Select
  Next i
  If Len(Res) = 0 Then
    Join_Num = "K"
  Else
    Join_Num = Mid(Res, Len(Deli) + 1, Len(Res))
  End If
End Function
Cảm ơn, xin cảm ơn bạn @HieuCD
Hàm của bạn quá tuyệt đỉnh và đúng ý của mình
Chúc bạn cuối tuần và nghỉ ngày lễ vui vẻ, hạnh phúc.
Bài đã được tự động gộp:

Cách dùng hàm trong file
Mã:
Function Join_Num(ByVal comStr, ByVal Deli As String, ParamArray sArr()) As String
  Dim Arr, iTem, nArr(0 To 99) As Long, cArr()
  Dim i As Long, j As Long, n As Long
  Dim iChar As String, tmp, Res As String
  cArr = Array(">=", "<=", ">", "<", "=")
  For Each Arr In sArr
    If Not IsArray(Arr) Then Arr = Array(Arr)
    For Each iTem In Arr
      If TypeName(iTem) = "Range" Then iTem = iTem.Value
      If TypeName(iTem) <> "Error" Then
        If Len(iTem) > 0 Then
          iTem = iTem & ","
          n = Len(iTem)
          For j = 1 To n
            iChar = Mid(iTem, j, 1)
            If IsNumeric(iChar) Then
              tmp = tmp & iChar
            ElseIf Len(tmp) > 0 Then
              tmp = CLng(tmp)
              If tmp < 100 Then nArr(tmp) = nArr(tmp) + 1
              tmp = ""
            End If
          Next j
        End If
      End If
    Next
  Next
  n = 4: tmp = comStr
  For i = 0 To 4
    If InStr(1, comStr, cArr(i)) > 0 Then
      tmp = CLng(Replace(comStr, cArr(i), ""))
      n = i
      Exit For
    End If
  Next i
  For i = 0 To 99
    Select Case n
      Case 0
        If nArr(i) >= tmp Then Res = Res & Deli & Format(i, "00")
      Case 1
        If nArr(i) <= tmp Then Res = Res & Deli & Format(i, "00")
      Case 2
        If nArr(i) > tmp Then Res = Res & Deli & Format(i, "00")
      Case 3
        If nArr(i) < tmp Then Res = Res & Deli & Format(i, "00")
      Case 4
        If nArr(i) = tmp Then Res = Res & Deli & Format(i, "00")
    End Select
  Next i
  If Len(Res) = 0 Then
    Join_Num = "K"
  Else
    Join_Num = Mid(Res, Len(Deli) + 1, Len(Res))
  End If
End Function
Bạn @HieuCD chỉnh giúp mình một lỗi nhỏ này nữa dược không?
Mặc định là các số từ "00-99" nhưng trong mảng dữ liệu có các số đơn từ "0-9" thì công thức không phân biệt
Cảm ơn sự giúp đỡ của bạn.
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn, xin cảm ơn bạn @HieuCD
Hàm của bạn quá tuyệt đỉnh và đúng ý của mình
Chúc bạn cuối tuần và nghỉ ngày lễ vui vẻ, hạnh phúc.
Bài đã được tự động gộp:


Bạn @HieuCD chỉnh giúp mình một lỗi nhỏ này nữa dược không?
Mặc định là các số từ "00-99" nhưng trong mảng dữ liệu có các số đơn từ "0-9" thì công thức không phân biệt
Cảm ơn sự giúp đỡ của bạn.
Chỉnh lại code
Mã:
Function Join_Num(ByVal comStr, ByVal Deli As String, ParamArray sArr()) As String
  Dim Arr, iTem, nArr(0 To 99) As Long, cArr()
  Dim i As Long, j As Long, n As Long
  Dim iChar As String, tmp, Res As String
  cArr = Array(">=", "<=", ">", "<", "=")
  For Each Arr In sArr
    If Not IsArray(Arr) Then Arr = Array(Arr)
    For Each iTem In Arr
      If TypeName(iTem) = "Range" Then iTem = iTem.Value
      If TypeName(iTem) <> "Error" Then
        If Len(iTem) > 0 Then
          iTem = iTem & ","
          n = Len(iTem)
          For j = 1 To n
            iChar = Mid(iTem, j, 1)
            If IsNumeric(iChar) Then
              tmp = tmp & iChar
            Else
              If Len(tmp) = 2 Then 'Chi xet so co 2 ky tu
                tmp = CLng(tmp)
                If tmp < 100 Then nArr(tmp) = nArr(tmp) + 1
              End If
              tmp = ""
            End If
          Next j
        End If
      End If
    Next
  Next
  n = 4: tmp = comStr
  For i = 0 To 4
    If InStr(1, comStr, cArr(i)) > 0 Then
      tmp = CLng(Replace(comStr, cArr(i), ""))
      n = i
      Exit For
    End If
  Next i
  For i = 0 To 99
    Select Case n
      Case 0
        If nArr(i) >= tmp Then Res = Res & Deli & Format(i, "00")
      Case 1
        If nArr(i) <= tmp Then Res = Res & Deli & Format(i, "00")
      Case 2
        If nArr(i) > tmp Then Res = Res & Deli & Format(i, "00")
      Case 3
        If nArr(i) < tmp Then Res = Res & Deli & Format(i, "00")
      Case 4
        If nArr(i) = tmp Then Res = Res & Deli & Format(i, "00")
    End Select
  Next i
  If Len(Res) = 0 Then
    Join_Num = "K"
  Else
    Join_Num = Mid(Res, Len(Deli) + 1, Len(Res))
  End If
End Function
 
@hiennv.tsc

Ngay từ bài #1, bạn đã ghi các yêu cầu rõ ràng trong file:

1- Đếm các số (Tôi đang dùng hàm trên nhưng thấy hàm đó đếm cũng không chuẩn)

2- Cột kết quả "I" là Tìm các số đếm được ở cột "G", nếu có số lớn hơn 1 số nào đó thì lấy kết quả ở cốt "F"

3-Cột kết quả "J" là Tìm các số đếm được ở cột "G", nếu có số nhỏ hơn 1 (Hoặc số nào đó thì lấy kết quả ở cốt "F")

Và bước cuối cùng là nối kết quả của chúng lại với nhau,


Thì tôi đã lưu ý về điều này nên trong hàm vẫn tôn trọng và lưu giữ điều kiện giống bạn đã ghi, tức >=1 hoặc <1. Số 1 này tôi hiểu là ý bạn muốn biến thiên tùy theo thực tế.

nhưng hàm dài quá bạn ơi, đôi khi sử dụng khó quá
Bạn cho mình hỏi là cái hàm Countif() mình sử dụng để đếm thấy sai bạn à
Bạn giải thích giúp mình sao nó lại sai?
Để xử lý vấn đề của bạn thì phải tính trên các mảng, nên công thức, dù gì dù, cũng dài và nặng. Muốn nhẹ nhàng hơn, thì buộc lòng:
1/ Sử dụng cột phụ (như bạn giải quyết), hoặc sheet phụ (như cách tôi trong file đính kèm)
2/ Hoặc phải sử dụng VBA như bạn đã được anh @HieuCD giúp cho bạn bài trên.

Tôi rất thông hiểu: nhiều khi trong lúc đụng phải vấn đề, thì bạn chỉ muốn tự mình xử lý ngay, vì ngại nhờ người khác thêm phiền toái. Chính vì vậy tôi đưa thêm cách xử lý bằng hàm Countif() để bạn tham khảo, cũng như về cách sử dụng Countif() sao cho đếm chính xác, để sau này gặp vấn đề tương tự cần đến nó, thì bạn có thể xử lý tức khắc.

Bạn xem file kèm.

Thân
 

File đính kèm

@hiennv.tsc

Ngay từ bài #1, bạn đã ghi các yêu cầu rõ ràng trong file:



Thì tôi đã lưu ý về điều này nên trong hàm vẫn tôn trọng và lưu giữ điều kiện giống bạn đã ghi, tức >=1 hoặc <1. Số 1 này tôi hiểu là ý bạn muốn biến thiên tùy theo thực tế.


Để xử lý vấn đề của bạn thì phải tính trên các mảng, nên công thức, dù gì dù, cũng dài và nặng. Muốn nhẹ nhàng hơn, thì buộc lòng:
1/ Sử dụng cột phụ (như bạn giải quyết), hoặc sheet phụ (như cách tôi trong file đính kèm)
2/ Hoặc phải sử dụng VBA như bạn đã được anh @HieuCD giúp cho bạn bài trên.

Tôi rất thông hiểu: nhiều khi trong lúc đụng phải vấn đề, thì bạn chỉ muốn tự mình xử lý ngay, vì ngại nhờ người khác thêm phiền toái. Chính vì vậy tôi đưa thêm cách xử lý bằng hàm Countif() để bạn tham khảo, cũng như về cách sử dụng Countif() sao cho đếm chính xác, để sau này gặp vấn đề tương tự cần đến nó, thì bạn có thể xử lý tức khắc.

Bạn xem file kèm.

Thân
Cảm ơn bạn @Phan Thế Hiệp rất nhiều, mặc dù mình mới vào diễn đàn hôm qua nhưng đã được đọc các hàm bạn viết và của bạn @HieuCD nữa.
Phải nói rằng 2 bạn rất nhiệt huyết với diễn đàn và những bài giải dễ hiểu, chính xác
Các bạn rất nhiệt tình giải thích cách sử dụng hàm và các tính năng của hàm......., giúp đỡ các thành viên nhiệt tình
Tôi thấy nhiều bài rất khó thế mà bạn vẫn dùng công thức trong Excel để làm được
Xin cảm ơn bạn @Phan Thế Hiệp rất nhiều
Chúc bạn luôn luôn gặp nhiều may mắn.
 
Cảm ơn bạn @Phan Thế Hiệp rất nhiều, mặc dù mình mới vào diễn đàn hôm qua nhưng đã được đọc các hàm bạn viết và của bạn @HieuCD nữa.
Phải nói rằng 2 bạn rất nhiệt huyết với diễn đàn và những bài giải dễ hiểu, chính xác
Các bạn rất nhiệt tình giải thích cách sử dụng hàm và các tính năng của hàm......., giúp đỡ các thành viên nhiệt tình
Tôi thấy nhiều bài rất khó thế mà bạn vẫn dùng công thức trong Excel để làm được
Xin cảm ơn bạn @Phan Thế Hiệp rất nhiều
Chúc bạn luôn luôn gặp nhiều may mắn.
Không có chi đâu bạn!
Kiến thức thì mênh mông, việc chia sẻ là điều cần nên làm, (giữ một mình mần chi, nặng bụng! :) bạn hén!)

Chúc bạn tìm thấy những kiến thức hay và nâng cao kỹ năng Excel của mình, cùng vui với GPE.
Thân
 
Chỉnh lại code
Mã:
Function Join_Num(ByVal comStr, ByVal Deli As String, ParamArray sArr()) As String
  Dim Arr, iTem, nArr(0 To 99) As Long, cArr()
  Dim i As Long, j As Long, n As Long
  Dim iChar As String, tmp, Res As String
  cArr = Array(">=", "<=", ">", "<", "=")
  For Each Arr In sArr
    If Not IsArray(Arr) Then Arr = Array(Arr)
    For Each iTem In Arr
      If TypeName(iTem) = "Range" Then iTem = iTem.Value
      If TypeName(iTem) <> "Error" Then
        If Len(iTem) > 0 Then
          iTem = iTem & ","
          n = Len(iTem)
          For j = 1 To n
            iChar = Mid(iTem, j, 1)
            If IsNumeric(iChar) Then
              tmp = tmp & iChar
            Else
              If Len(tmp) = 2 Then 'Chi xet so co 2 ky tu
                tmp = CLng(tmp)
                If tmp < 100 Then nArr(tmp) = nArr(tmp) + 1
              End If
              tmp = ""
            End If
          Next j
        End If
      End If
    Next
  Next
  n = 4: tmp = comStr
  For i = 0 To 4
    If InStr(1, comStr, cArr(i)) > 0 Then
      tmp = CLng(Replace(comStr, cArr(i), ""))
      n = i
      Exit For
    End If
  Next i
  For i = 0 To 99
    Select Case n
      Case 0
        If nArr(i) >= tmp Then Res = Res & Deli & Format(i, "00")
      Case 1
        If nArr(i) <= tmp Then Res = Res & Deli & Format(i, "00")
      Case 2
        If nArr(i) > tmp Then Res = Res & Deli & Format(i, "00")
      Case 3
        If nArr(i) < tmp Then Res = Res & Deli & Format(i, "00")
      Case 4
        If nArr(i) = tmp Then Res = Res & Deli & Format(i, "00")
    End Select
  Next i
  If Len(Res) = 0 Then
    Join_Num = "K"
  Else
    Join_Num = Mid(Res, Len(Deli) + 1, Len(Res))
  End If
End Function
Cảm ơn bạn @HieuCD rất nhiều
Cảm ơn sự nhiệt tình, nhân ái và kiến thức sâu, cao của bạn
Hàm rất chuẩn, chuẩn không thể chỉnh.
Chúc bạn luôn may mắn và tràn đầy hạnh phúc.
 
Web KT

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

Back
Top Bottom