Xin hàm sumifs dạng Vlookup (1 người xem)

Liên hệ QC

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

hongphuong1997

Thành viên tiêu biểu
Tham gia
12/11/17
Bài viết
777
Được thích
326
Giới tính
Nữ
Thưa thầy cô và các bác, các anh chị!
Trong excel các công thức về dạng số thì quá nhiều, nhưng các công thức về ký tự và dạng chuỗi thì hầu như không có.
Vì vậy cháu muốn có 1 số hàm về dạng ký tự và chuỗi
Vậy mong các bác giúp đỡ.
 

File đính kèm

Thưa thầy cô và các bác, các anh chị!
Trong excel các công thức về dạng số thì quá nhiều, nhưng các công thức về ký tự và dạng chuỗi thì hầu như không có.
Vì vậy cháu muốn có 1 số hàm về dạng ký tự và chuỗi
Vậy mong các bác giúp đỡ.
Em học hay làm vậy mà toàn những dạng này.
 
Upvote 0
Em học hay làm vậy mà toàn những dạng này.
Anh ơi, em vừa học vừa làm anh à
Bởi vì công thức về dạng số thì chỉ áp dụng được cho dạng số
Nhưng mà công thức về dạng chuỗi thì nó sẽ bao quát hơn, nó sẽ làm được cho tất cả các trường hợp anh à
Vì vậy em muốn những dạng tổng quát này hơn
Anh @snow25 viết giúp em với anh nhé
Em cảm ơn anh.
 
Upvote 0
Anh ơi, em vừa học vừa làm anh à
Bởi vì công thức về dạng số thì chỉ áp dụng được cho dạng số
Nhưng mà công thức về dạng chuỗi thì nó sẽ bao quát hơn, nó sẽ làm được cho tất cả các trường hợp anh à
Vì vậy em muốn những dạng tổng quát này hơn
Anh @snow25 viết giúp em với anh nhé
Em cảm ơn anh.
Không hiểu gì luôn.Em đợi ai vào viết công thức nhé.Anh không biết công thức à.:D
 
Upvote 0
Function lol(a As Range, b As Range, i As Integer, j As Integer, k As String)
Dim b1 As Range
Dim t As String
For Each b1 In b.Cells
If a.Value = b1.Value Then
If t = "" Then
t = t & b1.Offset(i, j).Value
Else
t = t & k & b1.Offset(i, j).Value
End If
End If
Next
lol = t
End Function

1548302134090.png
 

File đính kèm

Upvote 0
Từ căn bản, SUMIFS/SUM thuộc về dạng tổng hợp, VLOOKUP/LOOKUP thuộc về dạng chọn lấy 1.
Hai cái hoàn toàn trái ngược mà bảo chỉnh thằng này ra theo dạng thằng kia thì là thế nào?
 
Upvote 0
Từ căn bản, SUMIFS/SUM thuộc về dạng tổng hợp, VLOOKUP/LOOKUP thuộc về dạng chọn lấy 1.
Hai cái hoàn toàn trái ngược mà bảo chỉnh thằng này ra theo dạng thằng kia thì là thế nào?
Bác ơi cháu muốn tham chiếu kiểu giống hàm sumifs nhưng khi lấy kết quả thì lại giống như hàm vlookup bác @Vetkeu ơi
 
Upvote 0

File đính kèm

Upvote 0
Anh ơi, em vừa học vừa làm anh à
Bởi vì công thức về dạng số thì chỉ áp dụng được cho dạng số
Nhưng mà công thức về dạng chuỗi thì nó sẽ bao quát hơn, nó sẽ làm được cho tất cả các trường hợp anh à
Vì vậy em muốn những dạng tổng quát này hơn
Anh @snow25 viết giúp em với anh nhé
Em cảm ơn anh.
Bạn nên nhớ máy tính về bản chất là xử lý số và chỉ số (ngay các ký tự đều phải mã hóa thành số hết)
Excel lại càng là phần mềm chuyên xử lý về tính toán số, nên thiên về số là đúng rồi
 
Upvote 0
Gần 20 bài rồi mà không thể hiểu tác giả bài đăng muốn cụ thể là gì luôn!
Nên viết cho người khác hiểu; Không nên viết những gì mình hiểu
Ví dụ tại ô [J5] có câu: Ví dụ ký tự a ở đây hoặc số thì nó có dang chuỗi là "12baaa"
Phải chăng là câu: " Ví dụ ký tự a ở đây thay vì số thì nó có dang chuỗi là "12baaa""
. . . . .
Đúng là theo fương châm: Con gái nói ghét là iêu & nói iêu là ghét đó!
Tạm biệt!
 
Upvote 0
Đổi lại công thức:
Mã:
=SUBSTITUTE(IF(A1=1," ",J22&IFERROR("; "&INDIRECT(TEXT(AGGREGATE(15,6,(COLUMN(D21:H23)+ROW(D21:H23)*1000)/SEARCH(C5,D5:H7)/SEARCH(C9,D9:H11)/SEARCH(C13,D13:H15)/SEARCH(C17,D17:H19),A1-1),"R0C000"),0),""))," ; ","")
 
Upvote 0
Anh ơi, quy luật tham chiếu giống hàm sumifs
-Nhưng nó là tìm kiếm trong chuỗi
-Và kết quả trả về không phải là tính tổng
Đây em xem nhé.Dùng như hàm sumifs.
Mã:
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
      Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String, min1 As Long, min2 As Long
      min1 = 10000: min2 = 10000
      Set dic = CreateObject("scripting.dictionary")
          For k = LBound(mang) To UBound(mang) Step 2
             arr = mang(k).Value
              If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
              If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
          Next k
           arr = tong.Value
              If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
              If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
           For i = 1 To min1
               For j = 1 To min2
                   dic.Add i & "#" & j, arr(i, j)
               Next j
           Next i
          For k = LBound(mang) To UBound(mang) Step 2
              arr = mang(k).Value
              dk = mang(k + 1).Value
              For i = 1 To min1
               For j = 1 To min2
                     If UCase(dk) <> UCase(arr(i, j)) Then
                       If dic.exists(i & "#" & j) Then
                           dic.Remove (i & "#" & j)
                       End If
                     End If
                 Next j
              Next i
          Next k
            arr = dic.keys
            For i = LBound(arr) To UBound(arr)
                If s = Empty Then
                   s = dic.Item(arr(i))
                Else
                   s = s & ";" & dic.Item(arr(i))
                End If
            Next i
            laygiatri = s
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đây em xem nhé.Dùng như hàm sumifs.
Mã:
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
      Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String, min1 As Long, min2 As Long
      min1 = 10000: min2 = 10000
      Set dic = CreateObject("scripting.dictionary")
          For k = LBound(mang) To UBound(mang) Step 2
             arr = mang(k).Value
              If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
              If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
          Next k
           arr = tong.Value
              If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
              If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
           For i = 1 To min1
               For j = 1 To min2
                   dic.Add i & "#" & j, arr(i, j)
               Next j
           Next i
          For k = LBound(mang) To UBound(mang) Step 2
              arr = mang(k).Value
              dk = mang(k + 1).Value
              For i = 1 To min1
               For j = 1 To min2
                     If UCase(dk) <> UCase(arr(i, j)) Then
                       If dic.exists(i & "#" & j) Then
                           dic.Remove (i & "#" & j)
                       End If
                     End If
                 Next j
              Next i
          Next k
            arr = dic.keys
            For i = LBound(arr) To UBound(arr)
                If s = Empty Then
                   s = dic.Item(arr(i))
                Else
                   s = s & ";" & dic.Item(arr(i))
                End If
            Next i
            laygiatri = s
End Function
Em cảm ơn anh rất nhiều
Nhưng cũng chưa chuẩn anh à
Bây giờ là tìm ký tự để so sánh cơ mà anh.
 

File đính kèm

Upvote 0
Em cảm ơn anh rất nhiều
Nhưng cũng chưa chuẩn anh à
Bây giờ là tìm ký tự để so sánh cơ mà anh.
Không hiểu lắm.Khi hàm sumif bằng không thì làm gì còn ký tự nào.Em xem lại xem.Không thì nói rõ chỗ nào không đúng nhé.À ý em là có kết quả tìm ngược lại à.
 
Upvote 0
Không hiểu lắm.Khi hàm sumif bằng không thì làm gì còn ký tự nào.Em xem lại xem.Không thì nói rõ chỗ nào không đúng nhé.À ý em là có kết quả tìm ngược lại à.
Anh ơi!
Anh hiểu ý của em một tý anh ơi
Chuỗi là gồm nhiều ký tự
Trong khi đó tìm ký tự trong chuỗi mà anh.
** Và tìm kiếm các ký tự trong các chuỗi đó để thành kết quả như của anh đó
(Kết quả của anh chỉ đúng với trường hợp đơn thuần thôi anh àh)
 
Upvote 0
Anh ơi!
Anh hiểu ý của em một tý anh ơi
Chuỗi là gồm nhiều ký tự
Trong khi đó tìm ký tự trong chuỗi mà anh.
** Và tìm kiếm các ký tự trong các chuỗi đó để thành kết quả như của anh đó
(Kết quả của anh chỉ đúng với trường hợp đơn thuần thôi anh àh)
Trường hợp đơn thuần là sao nhỉ.
 
Upvote 0
Đổi lại công thức:
Mã:
=SUBSTITUTE(IF(A1=1," ",J22&IFERROR("; "&INDIRECT(TEXT(AGGREGATE(15,6,(COLUMN(D21:H23)+ROW(D21:H23)*1000)/SEARCH(C5,D5:H7)/SEARCH(C9,D9:H11)/SEARCH(C13,D13:H15)/SEARCH(C17,D17:H19),A1-1),"R0C000"),0),""))," ; ","")
Anh
dazkangel
ơi, em quá kính phục anh, công thức như này mà anh cũng nghĩ ra được.
quá kinh khủng,
Nhưng thật sự để nói thì .....
Mặc dù rất đúng nhưng mà để đem vào làm thì khó quá anh.
Em rất cảm ơn anh!
anh
dazkangel
quá siêu đẳng
Anh
dazkangel
sao không nghĩ dùng hàm Vlookop nhiều điều kiện có thể rút gọn được công thức chăng???
 
Upvote 0
Đây em xem nhé.Dùng như hàm sumifs.
Mã:
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
      Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String, min1 As Long, min2 As Long
      min1 = 10000: min2 = 10000
      Set dic = CreateObject("scripting.dictionary")
          For k = LBound(mang) To UBound(mang) Step 2
             arr = mang(k).Value
              If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
              If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
          Next k
           arr = tong.Value
              If min1 > UBound(arr, 1) Then min1 = UBound(arr, 1)
              If min2 > UBound(arr, 2) Then min2 = UBound(arr, 2)
           For i = 1 To min1
               For j = 1 To min2
                   dic.Add i & "#" & j, arr(i, j)
               Next j
           Next i
          For k = LBound(mang) To UBound(mang) Step 2
              arr = mang(k).Value
              dk = mang(k + 1).Value
              For i = 1 To min1
               For j = 1 To min2
                     If UCase(dk) <> UCase(arr(i, j)) Then
                       If dic.exists(i & "#" & j) Then
                           dic.Remove (i & "#" & j)
                       End If
                     End If
                 Next j
              Next i
          Next k
            arr = dic.keys
            For i = LBound(arr) To UBound(arr)
                If s = Empty Then
                   s = dic.Item(arr(i))
                Else
                   s = s & ";" & dic.Item(arr(i))
                End If
            Next i
            laygiatri = s
End Function
Dùng ParamArray rất hay và hợp với bài này
Sao lại tín nhiệm dictionary , bài này đâu cần dictionary nhỉ???
 
Upvote 0
Anh ơi anh đang tìm là cả cụm "abc"
Nhưng ý của em là tìm ký tự "a" trong cụm "abc" anh à
Em cảm ơn anh!
Đây em xem.
Mã:
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
      Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String
      Set dic = CreateObject("scripting.dictionary")
           arr = tong.Value
           For i = 1 To UBound(arr, 1)
               For j = 1 To UBound(arr, 2)
                   dic.Add i & "#" & j, arr(i, j)
               Next j
           Next i
          For k = LBound(mang) To UBound(mang) Step 2
              arr = mang(k).Value
              dk = mang(k + 1).Value
              For i = 1 To UBound(arr, 1)
                 For j = 1 To UBound(arr, 2)
                     If InStr(arr(i, j), dk) = 0 Then
                       If dic.exists(i & "#" & j) Then
                           dic.Remove (i & "#" & j)
                       End If
                     End If
                 Next j
              Next i
          Next k
            arr = dic.keys
            For i = LBound(arr) To UBound(arr)
                If s = Empty Then
                   s = dic.Item(arr(i))
                Else
                   s = s & ";" & dic.Item(arr(i))
                End If
            Next i
            laygiatri = s
End Function
 

File đính kèm

Upvote 0
Anh ơi anh đang tìm là cả cụm "abc"
Nhưng ý của em là tìm ký tự "a" trong cụm "abc" anh à
Em cảm ơn anh!
Tìm từng "chuỗi con" trong "chuỗi khác", nếu có thì lấy kết quả tương ứng trong vùng kết quả , nếu có nhiều kết quả thì nối lại với nhau bằng dấu phẩy? Cho kết quả mẫu cũng kèm giải thích kết quả lấy từ đâu, điều kiện nào thì lấy.
Hoang mang quá!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đây em xem.
Mã:
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
      Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String
      Set dic = CreateObject("scripting.dictionary")
           arr = tong.Value
           For i = 1 To UBound(arr, 1)
               For j = 1 To UBound(arr, 2)
                   dic.Add i & "#" & j, arr(i, j)
               Next j
           Next i
          For k = LBound(mang) To UBound(mang) Step 2
              arr = mang(k).Value
              dk = mang(k + 1).Value
              For i = 1 To UBound(arr, 1)
                 For j = 1 To UBound(arr, 2)
                     If InStr(arr(i, j), dk) = 0 Then
                       If dic.exists(i & "#" & j) Then
                           dic.Remove (i & "#" & j)
                       End If
                     End If
                 Next j
              Next i
          Next k
            arr = dic.keys
            For i = LBound(arr) To UBound(arr)
                If s = Empty Then
                   s = dic.Item(arr(i))
                Else
                   s = s & ";" & dic.Item(arr(i))
                End If
            Next i
            laygiatri = s
End Function
Vẫn sai anh oi
 
Upvote 0
Tìm từng "chuỗi con" trong "chuỗi khác", nếu có thì lấy kết quả tương ứng trong vùng kết quả , nếu có nhiều kết quả thì nối lại với nhau bằng dấu phẩy? Cho kết quả mẫu cũng kèm giải thích kết quả lấy từ đâu, điều kiện nào thì lấy.
Hoang mang quá!
Em cảm ơn anh
Ba Tê
Đúng roài anh ơi
Nhưng của anh sao làm được có mỗi 1 mảng anh ơi
Anh làm thêm cho em nhiều mảng với anh
Ba Tê
Bài đã được tự động gộp:

Anh snow25 ơi. làm giống như bài của anh
Ba Tê đó, nhưng của anh
Ba Tê

mới chỉ tìm được có mỗi 1 mảng
 
Upvote 0
Upvote 0
Em cảm ơn anh
Ba Tê
Đúng roài anh ơi
Nhưng của anh sao làm được có mỗi 1 mảng anh ơi
Anh làm thêm cho em nhiều mảng với anh
Ba Tê
Bài đã được tự động gộp:


Anh snow25 ơi. làm giống như bài của anh
Ba Tê đó, nhưng của anh
Ba Tê

mới chỉ tìm được có mỗi 1 mảng
Xem lại file mới sửa lại.Anh gửi code em không xem à.File lúc nãy gửi là file cũ.
 
Upvote 0
Bạn nhập thủ công kết quả bạn muốn có đi, tôi sẽ cố hiểu và viết "nhiều mảng" cho bạn.
Anh ơi bài của anh như thế là đúng rồi anh à
Bây giờ anh thêm mảng và điều kiện nữa thôi anh à
(Tức là tham chiếu giống như kiểu hàm sumifs)
Tức là các mảng có kích thước bằng nhau và các điều kiện cùng nằm vị trí các ô của các mảng đó anh
Ba Tê
 
Upvote 0
Anh ơi bài của anh như thế là đúng rồi anh à
Bây giờ anh thêm mảng và điều kiện nữa thôi anh à
(Tức là tham chiếu giống như kiểu hàm sumifs)
Tức là các mảng có kích thước bằng nhau và các điều kiện cùng nằm vị trí các ô của các mảng đó anh
Ba Tê
Sao bạn cứ "SumIf" hoài vậy, cứ giải thích cách lấy kết quả, điều kiện lấy, nếu người khác hiểu là được, chẳng liên quan gì đến SUMIF cả.
Trường hợp này là nối chuỗi có điều kiện, bạn cứ hướng người khác vào SUMIFS, VLOOKUP... làm mọi người chẳng hiểu ra làm sao.
Tôi chỉ hiểu được như vầy (bạn làm biếng viết ra kết quả bằng thủ công sao?)
Quá hoảng thiệt!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đây em xem.
Mã:
Function laygiatri(ByVal tong As Range, ParamArray mang() As Variant) As String
      Dim arr, i As Long, j As Long, dic As Object, dk As String, k As Integer, arr1, s As String
      Set dic = CreateObject("scripting.dictionary")
           arr = tong.Value
           For i = 1 To UBound(arr, 1)
               For j = 1 To UBound(arr, 2)
                   dic.Add i & "#" & j, arr(i, j)
               Next j
           Next i
          For k = LBound(mang) To UBound(mang) Step 2
              arr = mang(k).Value
              dk = mang(k + 1).Value
              For i = 1 To UBound(arr, 1)
                 For j = 1 To UBound(arr, 2)
                     If InStr(arr(i, j), dk) = 0 Then
                       If dic.exists(i & "#" & j) Then
                           dic.Remove (i & "#" & j)
                       End If
                     End If
                 Next j
              Next i
          Next k
            arr = dic.keys
            For i = LBound(arr) To UBound(arr)
                If s = Empty Then
                   s = dic.Item(arr(i))
                Else
                   s = s & ";" & dic.Item(arr(i))
                End If
            Next i
            laygiatri = s
End Function
Hi hi...Anh ơi, anh snow25
Em không để ý,đúng roài anh ơi
Em cảm ơn anh nhiều nhé
Chứng tỏ VBA làm điều gì cũng được anh nhỉ
Em chúc anh vui vui anh nhé
 
Upvote 0
Chứng tỏ VBA làm điều gì cũng được anh nhỉ
Đúng là giải thích khó hiểu.
Các bảng dữ liệu sao không đều nhau 3 dòng như vùng lấy kết quả?
Ở đây có 4 bảng 3 dòng 6 cột, so trong 4 bảng từ cột 2, từng dòng, cùng vị trí mà đúng điều kiện thì lấy kết quả của vị trí đó trong vùng kết quả?
Nếu nhiều hơn 4 bảng bạn có thể xem file này.
 

File đính kèm

Upvote 0
Đúng là giải thích khó hiểu.
Các bảng dữ liệu sao không đều nhau 3 dòng như vùng lấy kết quả?
Ở đây có 4 bảng 3 dòng 6 cột, so trong 4 bảng từ cột 2, từng dòng, cùng vị trí mà đúng điều kiện thì lấy kết quả của vị trí đó trong vùng kết quả?
Nếu nhiều hơn 4 bảng bạn có thể xem file này.
Ôi. ôi em cảm ơn anh @Ba Tê!
Anh ơi hàm của anh ngắn gọn quá anh ơi
Và rất chuẩn anh àh
Em cảm ơn anh @Ba Tê rất nhìu
Em chúc anh ngày vui anh nhé
 
Upvote 0
Anh ơi anh đang tìm là cả cụm "abc"
Nhưng ý của em là tìm ký tự "a" trong cụm "abc" anh à
Em cảm ơn anh!
Function dùng cho các cụm điều kiện rời rạc
Mã:
Function StrIfS(ByVal resRng As Range, ParamArray sArr() As Variant) As String
  Dim Res(), cArr(), Dk As String, tmp As String
  Dim n As Byte, i As Long, j As Long, sRow As Long, sCol As Long
    
  Res = CreateArr(resRng)
  sRow = UBound(Res):   sCol = UBound(Res, 2)
  For n = 0 To UBound(sArr) Step 2
    cArr = CreateArr(sArr(n))
    If sRow <> UBound(cArr) Or sCol <> UBound(cArr, 2) Then
      StrIfS = "Vùng du lieu sai": Exit Function
    End If
    Dk = CStr(sArr(n + 1))
    For i = 1 To sRow
      For j = 1 To sCol
        If Res(i, j) <> Empty Then
          If InStr(1, cArr(i, j), Dk, 1) = 0 Then Res(i, j) = Empty
        End If
      Next j
    Next i
  Next n
  For i = 1 To sRow
    For j = 1 To sCol
      If Res(i, j) <> Empty Then tmp = tmp & ";" & Res(i, j)
    Next j
  Next i
  If Len(tmp) Then StrIfS = Replace(tmp, ";", "", 1, 1)
End Function

Private Function CreateArr(ByVal Rng As Range) As Variant
  Dim Res()
  If Rng.Count = 1 Then
    ReDim Res(1 To 1, 1 To 1):    Res(1, 1) = Rng
  Else
    Res = Rng.Value
  End If
  CreateArr = Res
End Function
 
Upvote 0
Function dùng cho các cụm điều kiện rời rạc
Mã:
Function StrIfS(ByVal resRng As Range, ParamArray sArr() As Variant) As String
  Dim Res(), cArr(), Dk As String, tmp As String
  Dim n As Byte, i As Long, j As Long, sRow As Long, sCol As Long
   
  Res = CreateArr(resRng)
  sRow = UBound(Res):   sCol = UBound(Res, 2)
  For n = 0 To UBound(sArr) Step 2
    cArr = CreateArr(sArr(n))
    If sRow <> UBound(cArr) Or sCol <> UBound(cArr, 2) Then
      StrIfS = "Vùng du lieu sai": Exit Function
    End If
    Dk = CStr(sArr(n + 1))
    For i = 1 To sRow
      For j = 1 To sCol
        If Res(i, j) <> Empty Then
          If InStr(1, cArr(i, j), Dk, 1) = 0 Then Res(i, j) = Empty
        End If
      Next j
    Next i
  Next n
  For i = 1 To sRow
    For j = 1 To sCol
      If Res(i, j) <> Empty Then tmp = tmp & ";" & Res(i, j)
    Next j
  Next i
  If Len(tmp) Then StrIfS = Replace(tmp, ";", "", 1, 1)
End Function

Private Function CreateArr(ByVal Rng As Range) As Variant
  Dim Res()
  If Rng.Count = 1 Then
    ReDim Res(1 To 1, 1 To 1):    Res(1, 1) = Rng
  Else
    Res = Rng.Value
  End If
  CreateArr = Res
End Function
Bác ơi bác HieuCD ơi
Cháu cảm ơn bác rất nhiều, đúng quá bác ơi
Cháu chúc bác vui vui bác nhé
Cháu chúc bác chơi tết vạn sự như ý bác nhé!
 
Upvote 0
Tôi vừa xóa 1 số bài tranh luận trong topic này. Đề nghị mọi người kiềm chế.
Ý kiến riêng của tôi:
Người cần hỏi thì phải hỏi. Hỏi để áp dụng trong công việc hay chỉ để biết, hay để học hỏi thêm cách mới, ... là chuyện của người hỏi. Về phía người trả lời thì tùy tâm, không muốn trả lời thì thôi, không cần thắc mắc.
Thí dụ tôi bắt đầu học VBA, tôi hỏi cách viết 1 hàm tính giai thừa của 1 số (trong khi Excel có sẵn) thì là hỏi sai sao?
 
Upvote 0
Function dùng cho các cụm điều kiện rời rạc
Mã:
Function StrIfS(ByVal resRng As Range, ParamArray sArr() As Variant) As String
  Dim Res(), cArr(), Dk As String, tmp As String
  Dim n As Byte, i As Long, j As Long, sRow As Long, sCol As Long
   
  Res = CreateArr(resRng)
  sRow = UBound(Res):   sCol = UBound(Res, 2)
  For n = 0 To UBound(sArr) Step 2
    cArr = CreateArr(sArr(n))
    If sRow <> UBound(cArr) Or sCol <> UBound(cArr, 2) Then
      StrIfS = "Vùng du lieu sai": Exit Function
    End If
    Dk = CStr(sArr(n + 1))
    For i = 1 To sRow
      For j = 1 To sCol
        If Res(i, j) <> Empty Then
          If InStr(1, cArr(i, j), Dk, 1) = 0 Then Res(i, j) = Empty
        End If
      Next j
    Next i
  Next n
  For i = 1 To sRow
    For j = 1 To sCol
      If Res(i, j) <> Empty Then tmp = tmp & ";" & Res(i, j)
    Next j
  Next i
  If Len(tmp) Then StrIfS = Replace(tmp, ";", "", 1, 1)
End Function

Private Function CreateArr(ByVal Rng As Range) As Variant
  Dim Res()
  If Rng.Count = 1 Then
    ReDim Res(1 To 1, 1 To 1):    Res(1, 1) = Rng
  Else
    Res = Rng.Value
  End If
  CreateArr = Res
End Function
Điều kiện khác Empty có kiểm tra được số bằng không.Không anh.
 
Upvote 0
Tôi vừa xóa 1 số bài tranh luận trong topic này. Đề nghị mọi người kiềm chế.
Ý kiến riêng của tôi:
Người cần hỏi thì phải hỏi. Hỏi để áp dụng trong công việc hay chỉ để biết, hay để học hỏi thêm cách mới, ... là chuyện của người hỏi. Về phía người trả lời thì tùy tâm, không muốn trả lời thì thôi, không cần thắc mắc.
Thí dụ tôi bắt đầu học VBA, tôi hỏi cách viết 1 hàm tính giai thừa của 1 số (trong khi Excel có sẵn) thì là hỏi sai sao?
Thì người khác hỏi lại là chuyện bình thường
Có hỏi mới ra vấn đề, mở rộng vấn đề, bạn nói như vậy là thiếu khách quan - Thí dụ của bạn cũng là 1 lý do, lý do để học nâng cao về giai thừa... nhưng nếu trả lời là áp dụng trường hợp cụ thể thì có thể chỉ cần viết giai thừa đơn giản là dùng vòng lặp thay vì dùng đệ quy như trong học thuật .

Nên có trao đổi có hỏi đáp thì mới học - đó cũng cái nguồn sống chính của 1 diễn đàn.
 
Upvote 0
Thí dụ của bạn cũng là 1 lý do, lý do để học nâng cao về giai thừa... nhưng nếu trả lời là áp dụng trường hợp cụ thể thì có thể chỉ cần viết giai thừa đơn giản là dùng vòng lặp thay vì dùng đệ quy như trong học thuật .
Bạn đang suy luận chủ quan. Tôi hỏi hàm tính giai thừa chỉ để biết phương pháp suy luận, không áp dụng vào đâu cả. Và trong trường hợp thí dụ đó (người mới học VBA), còn chả biết vòng lặp, đệ quy là gì.

Nên có trao đổi có hỏi đáp thì mới học - đó cũng cái nguồn sống chính của 1 diễn đàn.
Bạn nói đúng. Nhưng trong những bài gần đây mà tôi đọc (và xóa), thì tôi rút ra 3 ý từ những bài của bạn:
- Nếu không áp dụng vào đâu cả thì trả lời là phí sức
- Nếu bạn chưa hỏi được "áp dụng vào đâu" thì bạn không trả lời.
- Nếu người khác trả lời thì bạn phê phán (xem hình)
Do đó tôi mới viết:
Về phía người trả lời thì tùy tâm, không muốn trả lời thì thôi, không cần thắc mắc.
1548596197004.png
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn đang suy luận chủ quan. Tôi hỏi hàm tính giai thừa chỉ để biết phương pháp suy luận, không áp dụng vào đâu cả. Và trong trường hợp thí dụ đó (người mới học VBA), còn chả biết vòng lặp, đệ quy là gì.


Bạn nói đúng. Nhưng trong những bài gần đây mà tôi đọc (và xóa), thì tôi rút ra 3 ý từ những bài của bạn:
- Nếu không áp dụng vào đâu cả thì trả lời là phí sức
- Nếu bạn chưa hỏi được "áp dụng vào đâu" thì bạn không trả lời.
- Nếu người khác trả lời thì bạn phê phán (xem hình)
Do đó tôi mới viết:

View attachment 211708
Chẻ chữ quá, nhắc lại là: trao đổi thì mới có diễn đàn và ngược lại. Còn cứ dung dưỡng việc người hỏi kiểu đòi hỏi vô cớ sao được, khi biết ứng dụng vào đâu thì câu trả lời mới trọn vẹn hơn và đỡ phí thời gian hỏi đi hỏi lại (như nhiều chủ đề trên diễn đàn đã đang diễn ra - ngay topic này có người kêu đến 20 bài cũng không hiểu, đến cuối cũng không hiểu sao lại là sumif và vlookup là một minh chứng #20, đến #40, #42 )
 
Lần chỉnh sửa cuối:
Upvote 0
Gởi tam888,
Như tôi nói trong bài trên, 2 gạch đầu dòng 1 và 2 thì chỉ là kêu gọi những người "có thể trả lời" nên tùy tâm mà trả lời. Còn gạch đầu dòng thứ 3 thì là 1 thái độ không hay.
Trước đây bạn cũng từng bị gởi cảnh báo 1 lần (Hai Lúa Miền Tây gởi) do có bài sau:
1548596939993.png
Tôi không tranh luận. Tất cả những bài không giúp ích cho người hỏi hoặc không đúng chủ đề tôi sẽ xóa, nếu xóa nhiều lần tôi cảnh báo, cảnh báo 2 lần thì tôi ban nick.
 
Upvote 0

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

Back
Top Bottom