Xác định khoảng trống theo yêu cầu dưa vào code VBA. (1 người xem)

Liên hệ QC

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

Quang86vn

Thành viên mới
Tham gia
21/5/17
Bài viết
18
Được thích
0
Giới tính
Nam
Xin chào các thành viên GPE. em có bài toán xác định khoảng trống theo yêu cầu nhờ code VBA
Bài toán như sau;
Bước 1: Lọc khoảng max theo yêu cầu từ A đến B (A,B có thể là số hoặc chữ tuỳ ý, và điều kiện trước A là khoảng trống)
Bước 2: Bài toán 2 lọc khoảng max theo yêu cầu cột BE sau đó tìm max theo giá trị max đó.(max sau khoảng trống đó phải là max lớn nhất như trường hợp hàng 6 EF đã so sánh)
em có gửi file đính kèm nhờ các thành viên giúp đỡ.
Xin chân thành cảm ơn!
 

File đính kèm

Lần chỉnh sửa cuối:
Xin chào các thành viên GPE. em có bài toán xác định khoảng trống theo yêu cầu nhờ code VBA
Bài toán như sau;
Bước 1: Lọc khoảng max theo yêu cầu từ A đến B (A,B có thể là số hoặc chữ tuỳ ý, và điều trước A là khoảng trống)
Bước 2: Bài toán 2 lọc khoảng max theo yêu cầu cột BE sau đó tìm max theo giá trị max đó.(max sau giá trị đó phải là max lớn nhất như trường hợp hàng 6 EF)
em có gửi file đính kèm nhờ các thành viên giúp đỡ.
Xin chân thành cảm ơn!
May ra có thể làm được nếu rõ yêu cầu...
Làm thế nào để có kết quả ở cột [BE] vậy chủ thớt? Tiếng Việt sao lủng củng quá trời...
 
Upvote 0
Làm thế nào để có kết quả ở cột [BE] vậy chủ thớt? (Đếm thế nào để tất cả kết quả =5 hả chời???)
Kết quả này mình đặt.
Ví dụ lấy khoảng trống từ A tới B là 5 sau đó tìm lấy sau khoảng trống max 5 đó là bao nhiêu? có khó hiểu đôi chút bác.
có khi không thích mình lấy max khoảng trống đó bằng 10 và tìm sau max đó là bao nhiêu?
 
Upvote 0
Kết quả này mình đặt.
Ví dụ lấy khoảng trống từ A tới B là 5 sau đó tìm lấy sau khoảng trống max 5 đó là bao nhiêu? có khó hiểu đôi chút bác.
có khi không thích mình lấy max khoảng trống đó bằng 10 và tìm sau max đó là bao nhiêu?
"Max" dịch từ tiếng Anh sang tiếng Việt nghĩa là "LỚN NHẤT". Đã lớn nhất rồi lại còn cái khác lớn hơn nó nữa đúng là quá khó hiểu.
Nếu nôm na, mình đơn giản gọi nó điều kiện đầu vào (điều kiện số 1) là số khoảng trống cần so sánh cho trước là x=5 (hoặc x=10), cho dễ hiểu nhỉ?
Thêm nữa, NÊU và GỬI luôn cái file đang làm lên cho đỡ ngoằn ngoèo, quanh co...
 
Upvote 0
"Max" dịch từ tiếng Anh sang tiếng Việt nghĩa là "LỚN NHẤT". Đã lớn nhất rồi lại còn cái khác lớn hơn nó nữa đúng là quá khó hiểu.
Nếu nôm na, mình đơn giản gọi nó điều kiện đầu vào (điều kiện số 1) là số khoảng trống cần so sánh cho trước là x=5 (hoặc x=10), cho dễ hiểu nhỉ?
Thêm nữa, NÊU và GỬI luôn cái file đang làm lên cho đỡ ngoằn ngoèo, quanh co...
Chuẩn bác. Khoảng trống giữa ô chứa giá trị A và B Lớn nhất là 5 và sau khoảng trống đó thì khoảng trống là bao nhiêu(khi mà cùng 1 hàng đó rất nhiều khoảng trống là 5 và sau khoảng trống đó có khoảng trống khác nhau.
em gửi file loạn đây bác coi giup
 

File đính kèm

Upvote 0
Chuẩn bác. Khoảng trống giữa ô chứa giá trị A và B Lớn nhất là 5 và sau khoảng trống đó thì khoảng trống là bao nhiêu(khi mà cùng 1 hàng đó rất nhiều khoảng trống là 5 và sau khoảng trống đó có khoảng trống khác nhau.
em gửi file loạn đây bác coi giup
Nêu đề bài:
- Nêu điều kiện ABC, XYZ gì đó và kết quả tương ứng theo file minh họa.
- Diễn giải theo các điều kiện đã nêu thì làm sao cho kết quả như vậy.

Đại khái thế. Không lẽ giờ đi thi, cứ phải vác đề thi lên kêu Giám thị: Đề bài không rõ...
 
Upvote 0
Xin chào các thành viên GPE. em có bài toán xác định khoảng trống theo yêu cầu nhờ code VBA
Bài toán như sau;
Bước 1: Lọc khoảng max theo yêu cầu từ A đến B (A,B có thể là số hoặc chữ tuỳ ý, và điều kiện trước A là khoảng trống)
Bước 2: Bài toán 2 lọc khoảng max theo yêu cầu cột BE sau đó tìm max theo giá trị max đó.(max sau khoảng trống đó phải là max lớn nhất như trường hợp hàng 6 EF đã so sánh)
em có gửi file đính kèm nhờ các thành viên giúp đỡ.
Xin chân thành cảm ơn!
chạy code
Mã:
Sub GPE()
Dim Rng As Range, Arr() As Variant
Dim i As Long, j As Long, iMax As Long, jk As Long, k As Long
Const ColBlank = 5
Set Rng = Range("B2:BD19")
ReDim Arr(1 To Rng.Rows.Count, 1 To 1)
For i = 1 To Rng.Rows.Count
  iMax = 0
  For j = 2 To Rng.Columns.Count - ColBlank - 2
    If Rng(i, j - 1) = "" And Rng(i, j) = "A" And Rng(i, j + ColBlank + 1) = "B" And Rng(i, j + ColBlank + 2) = "" Then
      If Application.CountBlank(Rng(i, j + 1).Resize(, ColBlank)) = ColBlank Then
        k = 0
        For jk = j + ColBlank + 2 To Rng.Columns.Count
          If Rng(i, jk) = "" Then
            k = k + 1
          Else
            If k > iMax Then iMax = k
            j = jk - 1
            Exit For
          End If
        Next jk
      End If
    End If
  Next j
  If iMax Then Arr(i, 1) = iMax
Next i
Range("BF2").Resize(Rng.Rows.Count) = Arr
End Sub
 
Upvote 0
chạy code
Mã:
Sub GPE()
Dim Rng As Range, Arr() As Variant
Dim i As Long, j As Long, iMax As Long, jk As Long, k As Long
Const ColBlank = 5
Set Rng = Range("B2:BD19")
ReDim Arr(1 To Rng.Rows.Count, 1 To 1)
For i = 1 To Rng.Rows.Count
  iMax = 0
  For j = 2 To Rng.Columns.Count - ColBlank - 2
    If Rng(i, j - 1) = "" And Rng(i, j) = "A" And Rng(i, j + ColBlank + 1) = "B" And Rng(i, j + ColBlank + 2) = "" Then
      If Application.CountBlank(Rng(i, j + 1).Resize(, ColBlank)) = ColBlank Then
        k = 0
        For jk = j + ColBlank + 2 To Rng.Columns.Count
          If Rng(i, jk) = "" Then
            k = k + 1
          Else
            If k > iMax Then iMax = k
            j = jk - 1
            Exit For
          End If
        Next jk
      End If
    End If
  Next j
  If iMax Then Arr(i, 1) = iMax
Next i
Range("BF2").Resize(Rng.Rows.Count) = Arr
End Sub
Chuẩn rồi bạn nhé. Cảm ơn bạn nhiều.
Vẫn là bài toán này chỉ thay đổi chút là giá trị đó là các ô liên tiếp đối xứng bạn xem qua có thể viết code ntn? và code chạy nhanh hơn đc không?
rất cảm ơn bạn.
 

File đính kèm

Upvote 0
Vâng bài toán này có cách nào không bác HieuCD? Các bác GPE xem giúp em.
 
Upvote 0
Vâng bài toán này có cách nào không bác HieuCD? Các bác GPE xem giúp em.
bài toán khá phức tạp
Mã:
Sub GPE()
Dim Darr(), Arr() As Variant
Dim i As Long, j As Long, Max1 As Long, Max2 As Long
Dim Schr As Long, Sblk As Long, Tmp As Long
Const sCol = 3
Darr = Range("B2:BD19").Value
ReDim Arr(1 To UBound(Darr), 1 To 2)
For i = 1 To UBound(Darr)
  Max1 = 0:  Schr = 0: Sblk = 0: Tmp = 0
  For j = 1 To UBound(Darr, 2) - sCol
    If Darr(i, j) = "" And Darr(i, j + 1) <> "" Then
Tiep:
      Schr = CountChar(Darr, i, j + 1, "A")
      If Schr = sCol Then
        Tmp = Sblk
        j = j + sCol
        Sblk = CountChar(Darr, i, j + 1, "")
        j = j + Sblk
        GoTo Tiep
      Else
        j = j + Schr
        If Tmp > Max1 Then Max1 = Tmp:  Max2 = Sblk
      End If
    End If
  Next j
  If Max1 > 0 Then Arr(i, 1) = Max1: Arr(i, 2) = Max2
Next i
Range("BE2").Resize(UBound(Darr), 2) = Arr
End Sub

Private Function CountChar(ByVal Darr As Variant, ByVal i As Long, ByVal Col As Long, ByVal dk) As Long
  Dim j As Integer
  For j = Col To UBound(Darr, 2)
    If Darr(i, j) = dk Then CountChar = CountChar + 1 Else Exit Function
  Next j
End Function
 
Upvote 0
bài toán khá phức tạp
Mã:
Sub GPE()
Dim Darr(), Arr() As Variant
Dim i As Long, j As Long, Max1 As Long, Max2 As Long
Dim Schr As Long, Sblk As Long, Tmp As Long
Const sCol = 3
Darr = Range("B2:BD19").Value
ReDim Arr(1 To UBound(Darr), 1 To 2)
For i = 1 To UBound(Darr)
  Max1 = 0:  Schr = 0: Sblk = 0: Tmp = 0
  For j = 1 To UBound(Darr, 2) - sCol
    If Darr(i, j) = "" And Darr(i, j + 1) <> "" Then
Tiep:
      Schr = CountChar(Darr, i, j + 1, "A")
      If Schr = sCol Then
        Tmp = Sblk
        j = j + sCol
        Sblk = CountChar(Darr, i, j + 1, "")
        j = j + Sblk
        GoTo Tiep
      Else
        j = j + Schr
        If Tmp > Max1 Then Max1 = Tmp:  Max2 = Sblk
      End If
    End If
  Next j
  If Max1 > 0 Then Arr(i, 1) = Max1: Arr(i, 2) = Max2
Next i
Range("BE2").Resize(UBound(Darr), 2) = Arr
End Sub

Private Function CountChar(ByVal Darr As Variant, ByVal i As Long, ByVal Col As Long, ByVal dk) As Long
  Dim j As Integer
  For j = Col To UBound(Darr, 2)
    If Darr(i, j) = dk Then CountChar = CountChar + 1 Else Exit Function
  Next j
End Function
Vẫn không chạy được bộ lọc bác ah. em gửi file cụ thể bác coi cho tốc độ xử lý. Và em góp ý bác có thể chỉnh sửa bộ lọc theo hàm thì mình thay đổi số cho bộ lọc dễ dàng hơn.
Cảm ơn bác HieuCD, và GPE.
 

File đính kèm

Upvote 0
Vẫn không chạy được bộ lọc bác ah. em gửi file cụ thể bác coi cho tốc độ xử lý. Và em góp ý bác có thể chỉnh sửa bộ lọc theo hàm thì mình thay đổi số cho bộ lọc dễ dàng hơn.
Cảm ơn bác HieuCD, và GPE.
bạn muốn thay đổi số nào?
dữ liệu khủng quá bộ nhớ chịu không nổi, điều chỉnh lại khai báo biến
Mã:
Dim Darr(), i As Long, j As Long
Sub GPE()
Dim Arr() As Variant
Dim Max1 As Long, Max2 As Long
Dim Schr As Long, Sblk As Long, Tmp As Long
Const sCol = 3
Darr = Range("B3:FPB34").Value
ReDim Arr(1 To UBound(Darr), 1 To 2)
For i = 1 To UBound(Darr)
  Max1 = 0:  Schr = 0: Sblk = 0: Tmp = 0
  For j = 1 To UBound(Darr, 2) - sCol
    If Darr(i, j) = "" And Darr(i, j + 1) <> "" Then
Tiep:
      Schr = CountChar("A")
      If Schr = sCol Then
        Tmp = Sblk
        j = j + sCol
        Sblk = CountChar("")
        j = j + Sblk
        GoTo Tiep
      Else
        j = j + Schr
        If Tmp > Max1 Then Max1 = Tmp:  Max2 = Sblk
      End If
    End If
  Next j
  If Max1 > 0 Then Arr(i, 1) = Max1: Arr(i, 2) = Max2
Next i
Range("FPC3").Resize(UBound(Darr), 2) = Arr
End Sub

Private Function CountChar(ByVal dk) As Long
  Dim Col As Long
  For Col = j + 1 To UBound(Darr, 2)
    If Darr(i, Col) = dk Then CountChar = CountChar + 1 Else Exit Function
  Next Col
End Function
 
Upvote 0
bạn muốn thay đổi số nào?
dữ liệu khủng quá bộ nhớ chịu không nổi, điều chỉnh lại khai báo biến
Mã:
Dim Darr(), i As Long, j As Long
Sub GPE()
Dim Arr() As Variant
Dim Max1 As Long, Max2 As Long
Dim Schr As Long, Sblk As Long, Tmp As Long
Const sCol = 3
Darr = Range("B3:FPB34").Value
ReDim Arr(1 To UBound(Darr), 1 To 2)
For i = 1 To UBound(Darr)
  Max1 = 0:  Schr = 0: Sblk = 0: Tmp = 0
  For j = 1 To UBound(Darr, 2) - sCol
    If Darr(i, j) = "" And Darr(i, j + 1) <> "" Then
Tiep:
      Schr = CountChar("A")
      If Schr = sCol Then
        Tmp = Sblk
        j = j + sCol
        Sblk = CountChar("")
        j = j + Sblk
        GoTo Tiep
      Else
        j = j + Schr
        If Tmp > Max1 Then Max1 = Tmp:  Max2 = Sblk
      End If
    End If
  Next j
  If Max1 > 0 Then Arr(i, 1) = Max1: Arr(i, 2) = Max2
Next i
Range("FPC3").Resize(UBound(Darr), 2) = Arr
End Sub

Private Function CountChar(ByVal dk) As Long
  Dim Col As Long
  For Col = j + 1 To UBound(Darr, 2)
    If Darr(i, Col) = dk Then CountChar = CountChar + 1 Else Exit Function
  Next Col
End Function
Vâng em muốn thay đổi số bộ lọc mà k đc. để e chạy lại ở máy tính coi sao bác à.
 
Upvote 0
bộ lọc bất cập ở chỗ. cứ ấn code chạy thì bộ lọc chạy lại. Giờ bác xem ntn có được không. tìm đc max và sau max rồi giữ nguyên. chỉ chạy riêng bộ lọc cần tìm thôi. k chạy cả 2 bài toán max và sau max nữa.
 
Upvote 0
bộ lọc bất cập ở chỗ. cứ ấn code chạy thì bộ lọc chạy lại. Giờ bác xem ntn có được không. tìm đc max và sau max rồi giữ nguyên. chỉ chạy riêng bộ lọc cần tìm thôi. k chạy cả 2 bài toán max và sau max nữa.
bạn giải thích các bước xử lý cụ thể
b1:....chạy bộ lọc
b2: nói rỏ làm gì kết quả là gì
b3:....
 
Upvote 0
bạn giải thích các bước xử lý cụ thể
b1:....chạy bộ lọc
b2: nói rỏ làm gì kết quả là gì
b3:....
Bài toán trên giải quyết 3 ô chứa A liên tiếp tới A bất kỳ chứ không đối xứng như tiêu đề bài đặt ra bác.
Bước 1: tìm max của 3 Ô chứa A liên tiếp đối xứng nhau( AAA với AAA hoặc 4A với 4A, 5.. A có thể là số) và lọc lấy max nhất của 3(hoặc 4,5) ô này với nhau sau đó tìm sau max đó(sau max tới A bất kỳ không phải 3,4,5 liên tiếp)
Bước 2: lọc lấy tất cả 3A đối xứng với nhau có giá trị max là 3(khoảng trống là 3) đưa ra giá trị sau max tại max bằng 3.
Tại bước 2 đó bác nên cho em code rời vì có thế lựa chọn khoảng trống đó là 4,5,6,7,8... tùy ý.
Xin lỗi bác HieuCD giờ e có máy mới viết đc. Em gửi lại file bác coi lại cái yêu cầu bài. Chưa rõ bác cho em biết.
Cảm ơn bác.
 

File đính kèm

Upvote 0
Bài toán trên giải quyết 3 ô chứa A liên tiếp tới A bất kỳ chứ không đối xứng như tiêu đề bài đặt ra bác.
Bước 1: tìm max của 3 Ô chứa A liên tiếp đối xứng nhau( AAA với AAA hoặc 4A với 4A, 5.. A có thể là số) và lọc lấy max nhất của 3(hoặc 4,5) ô này với nhau sau đó tìm sau max đó(sau max tới A bất kỳ không phải 3,4,5 liên tiếp)
Bước 2: lọc lấy tất cả 3A đối xứng với nhau có giá trị max là 3(khoảng trống là 3) đưa ra giá trị sau max tại max bằng 3.
Tại bước 2 đó bác nên cho em code rời vì có thế lựa chọn khoảng trống đó là 4,5,6,7,8... tùy ý.
Xin lỗi bác HieuCD giờ e có máy mới viết đc. Em gửi lại file bác coi lại cái yêu cầu bài. Chưa rõ bác cho em biết.
Cảm ơn bác.
chạy thử sub Main
Mã:
Dim Darr(), i As Long, j As Long
Sub Main()
  Dim Arr1 As Variant, Arr2 As Variant
  Dim dk, sCol As Byte, Loc As Byte
  dk = "A"  'ký tu xet dieu kien
  sCol = 3  ' so ky tu xet dieu kien
  Darr = Range("B2:BD19").Value
  Arr1 = MaxCount(dk, sCol)
  Range("BE2").Resize(UBound(Arr1), 2) = Arr1
  Loc = 3 'bo loc max: so o lien tiep trong
  Arr2 = MaxFilter(dk, sCol, Loc)
  Range("BG2").Resize(UBound(Arr2), 2) = Arr2
End Sub
Private Function MaxCount(ByVal dk, ByVal sCol As Byte) As Variant
Dim Arr() As Variant, k As Long, Max1 As Long, Max2 As Long
Dim Schr As Long, Sblk As Long, Tmp As Long
ReDim Arr(1 To UBound(Darr), 1 To 2)
For i = 1 To UBound(Darr)
  Max1 = 0: Max2 = 0: Schr = 0: Sblk = 0: Tmp = 0
  For j = 1 To UBound(Darr, 2) - sCol
    If Darr(i, j) = "" And Darr(i, j + 1) = dk Then
Tiep:
      Schr = CountChar(dk)
      If Schr = sCol Then
        k = k + 1
        If Tmp < Sblk And k > 1 Then Tmp = Sblk
        j = j + sCol
        Sblk = CountChar("")
        j = j + Sblk
        GoTo Tiep
      Else
        If Tmp > Max1 And k > 1 Then Max1 = Tmp: Max2 = Sblk
        j = j + Schr
        k = 0
      End If
    End If
  Next j
  If Max1 > 0 Then Arr(i, 1) = Max1: Arr(i, 2) = Max2
Next i
MaxCount = Arr
End Function

Private Function MaxFilter(ByVal dk, ByVal sCol As Byte, ByVal Loc As Byte) As Variant
Dim Arr() As Variant, k As Long, Max1 As Long
Dim Schr As Long, Sblk As Long
ReDim Arr(1 To UBound(Darr), 1 To 2)
For i = 1 To UBound(Darr)
  Max1 = 0:  Schr = 0: Sblk = 0
  For j = 1 To UBound(Darr, 2) - sCol
    If Darr(i, j) = "" And Darr(i, j + 1) = dk Then
Tiep:
      Schr = CountChar(dk)
      If Schr = sCol Then
        j = j + sCol
        Sblk = CountChar("")
        If k > 0 And Sblk > Max1 Then Max1 = Sblk
        If Sblk = Loc Then k = k + 1 Else k = 0
        j = j + Sblk
        GoTo Tiep
      Else
        j = j + Schr
        k = 0
      End If
    End If
  Next j
  Arr(i, 1) = Loc
  If Max1 > 0 Then Arr(i, 2) = Max1
Next i
MaxFilter = Arr
End Function

Private Function CountChar(ByVal dk) As Long
  Dim Col As Long
  For Col = j + 1 To UBound(Darr, 2)
    If Darr(i, Col) = dk Then CountChar = CountChar + 1 Else Exit Function
  Next Col
End Function
 
Upvote 0
Web KT

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

Back
Top Bottom