Lấy giá trị ngày tháng bằng vba thay hàm index trong excel (1 người xem)

Liên hệ QC

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

thufpts

Thành viên hoạt động
Tham gia
6/8/12
Bài viết
157
Được thích
6
Giới tính
Nam
Nghề nghiệp
Bốc vác
Chào các bác. em có một vấn đề này xin đệ trình với các bác. em có một dòng là ngày tháng là dòng thứ 5 từ Q5 đến AF5
1)khi em nhập một số bất kỳ ví dụ nhập 2 48 10 nó sẽ tự động lấy các ngày tương ứng là 7-Now, 7-Now, 7 Now từ dòng thứ 5 để trả về cột N đối xứng với các số đã nhập.
2) chỉ tính đối với ô đâu tiên được nhập sẽ lấy được giá trị ngày tháng còn ô đứng sau nếu có giá trị sẽ bỏ qua.
ví dụ em nhập 22 vào R9 thì ngày 8-Now sẽ được trả về N9 còn giá trị 14 đứng sau 22 sẽ ko lấy dc ngày tháng.
Với khả năng của em thì em chỉ có thể dùng hàm mặc định trong excel là index(). nhưng bản thân em viết ra được nhưng đến khi có lỗi em ko sửa được vì dối mắt lắm.
kính mong các bác giúp em.

Capture.jpg
 

File đính kèm

Lần chỉnh sửa cuối:
Bác có thể tùy chỉnh được code để khi em thay đổi code đặt ngày tháng và đặt vị trí được không. chẳng hạn em không muốn đặt 2 cột vị trí và ngày tháng gần nhau mà đặt vị trí tại cột L và ngày tháng tại cột N thì làm thế nào. mong bác giúp em
bạn thay code mới
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then Call GPE
End Sub
Mã:
Sub GPE()
Dim Darr(), Ngay(1 To 1000, 1 To 1), ViTri(1 To 1000, 1 To 1), tmp As String, i As Long, j As Integer, n As Integer
Darr = Range("Q5:AF1000").Value
tmp = Range("K4").Value
For i = 2 To UBound(Darr) Step 1
    For j = 1 To UBound(Darr, 2) Step 1
        If Darr(i, j) > 0 Then
            ViTri(i - 1, 1) = tmp
            Ngay(i - 1, 1) = Darr(1, j)
            Exit For
        End If
    Next j
    If Ngay(i - 1, 1) = "" Then n = n + 1
    If n = 200 Then Exit For
Next i
Application.ScreenUpdating = False
Range("M6:M1000").ClearContents:    Range("N6:N1000").ClearContents
Range("M6").Resize(i - 1) = ViTri:  Range("N6").Resize(i - 1) = Ngay
Application.ScreenUpdating = True
End Sub
 
Upvote 0
bạn thay code mới
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then Call GPE
End Sub
Mã:
Sub GPE()
Dim Darr(), Ngay(1 To 1000, 1 To 1), ViTri(1 To 1000, 1 To 1), tmp As String, i As Long, j As Integer, n As Integer
Darr = Range("Q5:AF1000").Value
tmp = Range("K4").Value
For i = 2 To UBound(Darr) Step 1
    For j = 1 To UBound(Darr, 2) Step 1
        If Darr(i, j) > 0 Then
            ViTri(i - 1, 1) = tmp
            Ngay(i - 1, 1) = Darr(1, j)
            Exit For
        End If
    Next j
    If Ngay(i - 1, 1) = "" Then n = n + 1
    If n = 200 Then Exit For
Next i
Application.ScreenUpdating = False
Range("M6:M1000").ClearContents:    Range("N6:N1000").ClearContents
Range("M6").Resize(i - 1) = ViTri:  Range("N6").Resize(i - 1) = Ngay
Application.ScreenUpdating = True
End Sub
cam ơn bác. chạy ổn rồi bác ạ
 
Upvote 0
hay thật chỉ với vài đường cơ bản của bác mà nó chạy ngon. nhưng khi em xóa 1 vài ô màu đỏ nó lại báo lỗi bác ạ. bác xem giúp em với
bác ơi bác xem giúp em với đoạn code màu đỏ mỗi khi em copy nhiều dòng là nó lại giật bác ạ. mà nó giật 1 lúc nó mới thôi. có các nào khắc chế nó không bác.
 
Upvote 0
code màu đỏ là mới thêm vào, còn lại là code của bạn
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
        If Target.Count = 1 Then
            Call GPE
        End If
    End If
[COLOR=#ff0000]    If Not Intersect(Target, Range("$P$6:$P$1000")) Is Nothing Then[/COLOR]
[COLOR=#ff0000]        If Target.Value <> "" Then[/COLOR]
[COLOR=#ff0000]            Cells(Target.Row, "M") = Range("K4").Value[/COLOR]
[COLOR=#ff0000]        Else[/COLOR]
[COLOR=#ff0000]            Cells(Target.Row, "M") = ""[/COLOR]
[COLOR=#ff0000]        End If[/COLOR]
[COLOR=#ff0000]    End If[/COLOR]
End Sub
bác ơi bác xem giúp em với đoạn code màu đỏ mỗi khi em copy nhiều dòng là nó lại giật bác ạ. mà nó giật 1 lúc nó mới thôi. có các nào khắc chế nó không bác.
 
Upvote 0
muốn xử nhiều ô thì dùng code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
        If Target.Count = 1 Then
            Call GPE
        End If
    End If
[COLOR=#ff0000]    If Not Intersect(Target, Range("$P$6:$P$1000")) Is Nothing Then[/COLOR]
[COLOR=#ff0000]        For i = Target.Row To Target.Row + Target.Rows.Count - 1 Step 1[/COLOR]
[COLOR=#ff0000]            If Cells(i, "P").Value <> "" Then[/COLOR]
[COLOR=#ff0000]                Cells(i, "M") = Range("K4").Value[/COLOR]
[COLOR=#ff0000]            Else[/COLOR]
[COLOR=#ff0000]                Cells(i, "M") = ""[/COLOR]
[COLOR=#ff0000]            End If[/COLOR]
[COLOR=#ff0000]        Next i[/COLOR]
[COLOR=#ff0000]    End If[/COLOR]
End Sub
xin Lỗi bác em gửi lại câu hỏi. đoạn code màu đỏ của bác. có thể cho nó ra thành 1 sub khác. mỗi khi em copy nhiều dòng là nó giật. đoạn code trước bác viết nó chạy rất ổn. chỉ còn cái này em muốn áp dụng cho thêm 1 cột P khi có giá trị thì cột M sẽ nhận giá trị (Vị trí B)
 
Lần chỉnh sửa cuối:
Upvote 0
bác ơi bác xem giúp em với đoạn code màu đỏ mỗi khi em copy nhiều dòng là nó lại giật bác ạ. mà nó giật 1 lúc nó mới thôi. có các nào khắc chế nó không bác.
nó bị đụng với sub GPE() hoặc code khác
để khắc phục tạm thì bạn thêm lệnh

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
If Target.Count = 1 Then
Call GPE
End If
End If
If Not Intersect(Target, Range("$P$6:$P$1000")) Is Nothing Then
If Target.Value <> "" Then
Cells(Target.Row, "M") = Range("K4").Value
Else
Cells(Target.Row, "M") = ""
End If
End If
Application.ScreenUpdating = True
End Sub
tốt nhất là đưa toàn bộ code hoặc file mới chỉnh cho chạy nhanh được
 
Upvote 0
xin Lỗi bác em gửi lại câu hỏi. đoạn code màu đỏ của bác. có thể cho nó ra thành 1 sub khác. mỗi khi em copy nhiều dòng là nó giật. đoạn code trước bác viết nó chạy rất ổn. chỉ còn cái này em muốn áp dụng cho thêm 1 cột P khi có giá trị thì cột M sẽ nhận giá trị (Vị trí B)
bạn thêm 2 lệnh để chống giật
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
[COLOR=#ff0000]    Application.ScreenUpdating = False[/COLOR]
    If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
        If Target.Count = 1 Then
            Call GPE
        End If
    End If
    If Not Intersect(Target, Range("$P$6:$P$1000")) Is Nothing Then
        For i = Target.Row To Target.Row + Target.Rows.Count - 1 Step 1
            If Cells(i, "P").Value <> "" Then
                Cells(i, "M") = Range("K4").Value
            Else
                Cells(i, "M") = ""
            End If
        Next i
    End If
[COLOR=#ff0000]    Application.ScreenUpdating = True[/COLOR]
End Sub
 
Upvote 0
bạn thêm 2 lệnh để chống giật
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
[COLOR=#ff0000]    Application.ScreenUpdating = False[/COLOR]
    If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
        If Target.Count = 1 Then
            Call GPE
        End If
    End If
    If Not Intersect(Target, Range("$P$6:$P$1000")) Is Nothing Then
        For i = Target.Row To Target.Row + Target.Rows.Count - 1 Step 1
            If Cells(i, "P").Value <> "" Then
                Cells(i, "M") = Range("K4").Value
            Else
                Cells(i, "M") = ""
            End If
        Next i
    End If
[COLOR=#ff0000]    Application.ScreenUpdating = True[/COLOR]
End Sub
Chuẩn luôn. bác quá pro
 
Upvote 0
nó bị đụng với sub GPE() hoặc code khác
để khắc phục tạm thì bạn thêm lệnh

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
...
End If
Application.ScreenUpdating = True
End Sub
tốt nhất là đưa toàn bộ code hoặc file mới chỉnh cho chạy nhanh được

Bị đụng code thì bạn phải dùng cách trữ và phục hồi nguyên trạng

Private Sub Worksheet_Change(ByVal Target As Range)
dim screenStatus as Boolean
screenStatus =
Application.ScreenUpdating
Application.ScreenUpdating = False
If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
...
End If
Application.ScreenUpdating = screenStatus
End Sub
 
Upvote 0
Bị đụng code thì bạn phải dùng cách trữ và phục hồi nguyên trạng

Private Sub Worksheet_Change(ByVal Target As Range)
dim screenStatus as Boolean
screenStatus =
Application.ScreenUpdating
Application.ScreenUpdating = False
If Not Intersect(Range("$Q$6:$AF$1000"), Target) Is Nothing Then
...
End If
Application.ScreenUpdating = screenStatus
End Sub
Em có làm Như Bác VietMini Và bác HieuCD nhưng nó vẫn giật. khi xóa 1 vùng ở cột P thì không sao nhưng mà khi em xóa cả cột P thì nó quay
và nó giật không dừng được. Mong các bác xem giúp em với
 

File đính kèm

Upvote 0
Tôi giới thiệu cách tránh đụng code trong trường hợp như vầy:

Sub subMe
screenupdating đặt là false ở đây
code...
gọi subCon
code...
screenupdating đặt true ở đây
End Sub

Sub subCon
screenupdating đặt là false ở đây
code...
screenupdating đặt true ở đây
End Sub

Đọc kỹ thứ tự vận hành code, bạn sẽ thấy screenupdating được đặt true trước khi code của subMe chạy xong. Việc save và recover biến/thuộc tính toàn cục sẽ tránh được việc thuộc tính bị biến đổi ngàoi ý muốn.
(screenupdating là mộ thuộc ính của Application, tức là nó toàn cục 100%)

Việc bạn bị giật có thể do ở sub khác hoặc nguyên do khác.
 
Upvote 0
Tôi giới thiệu cách tránh đụng code trong trường hợp như vầy:

Sub subMe
screenupdating đặt là false ở đây
code...
gọi subCon
code...
screenupdating đặt true ở đây
End Sub

Sub subCon
screenupdating đặt là false ở đây
code...
screenupdating đặt true ở đây
End Sub

Đọc kỹ thứ tự vận hành code, bạn sẽ thấy screenupdating được đặt true trước khi code của subMe chạy xong. Việc save và recover biến/thuộc tính toàn cục sẽ tránh được việc thuộc tính bị biến đổi ngàoi ý muốn.
(screenupdating là mộ thuộc ính của Application, tức là nó toàn cục 100%)

Việc bạn bị giật có thể do ở sub khác hoặc nguyên do khác.
Nói thật là em chẳng biết gì về code cả. giỏi lắm thì em chỉ thay đổi vị trí đặt các cột và ô thôi. Nên rất mong các bác có cách nào khắc phục được.
 
Upvote 0
Em có làm Như Bác VietMini Và bác HieuCD nhưng nó vẫn giật. khi xóa 1 vùng ở cột P thì không sao nhưng mà khi em xóa cả cột P thì nó quay
và nó giật không dừng được. Mong các bác xem giúp em với
cứ nghĩ bạn chỉ xóa vài ô, ai dè bạn xóa nguyên cột.
bạn dùng code mới
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("$Q$6:$AF$1000")) Is Nothing Then Call GPE
        If Not Intersect(Target, Range("$P$6:$P$1000")) Is Nothing Then Call VT
End Sub
Mã:
Option Explicit
Sub GPE()
    Dim Darr(), Ngay(1 To 1000, 1 To 1), Vitri(1 To 1000, 1 To 1), tmp As String, i As Long, j As Integer, n As Integer
    Darr = Range("Q5:AF1000").Value
    tmp = Range("C3").Value
        For i = 2 To UBound(Darr) Step 1
            For j = 1 To UBound(Darr, 2) Step 1
                If Darr(i, j) > 0 Then
                    Vitri(i - 1, 1) = tmp
                    Ngay(i - 1, 1) = Darr(1, j)
                    Exit For
                End If
            Next j
            If Ngay(i - 1, 1) = "" Then n = n + 1
            If n = 200 Then Exit For
        Next i
        Application.ScreenUpdating = False
        Range("L6:L1000").ClearContents:    Range("N6:N1000").ClearContents
        Range("L6").Resize(i - 1) = Vitri:  Range("N6").Resize(i - 1) = Ngay
        Application.ScreenUpdating = True
End Sub
Sub VT()
    Dim i As Long, Darr(), Vitri(1 To 1000, 1 To 1), tmp As String
    Darr = Range("P6:P1000").Value
    tmp = Range("C3").Value
    For i = 1 To UBound(Darr) Step 1
        If Darr(i, 1) <> "" Then Vitri(i, 1) = tmp
    Next i
    Application.ScreenUpdating = False
    Range("M6:M1000").ClearContents
    Range("M6").Resize(i - 1) = Vitri
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
cứ nghĩ bạn chỉ xóa vài ô, ai dè bạn xóa nguyên cột.
bạn dùng code mới
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("$Q$6:$AF$1000")) Is Nothing Then Call GPE
        If Not Intersect(Target, Range("$P$6:$P$1000")) Is Nothing Then Call VT
End Sub
Mã:
Option Explicit
Sub GPE()
    Dim Darr(), Ngay(1 To 1000, 1 To 1), Vitri(1 To 1000, 1 To 1), tmp As String, i As Long, j As Integer, n As Integer
    Darr = Range("Q5:AF1000").Value
    tmp = Range("C3").Value
        For i = 2 To UBound(Darr) Step 1
            For j = 1 To UBound(Darr, 2) Step 1
                If Darr(i, j) > 0 Then
                    Vitri(i - 1, 1) = tmp
                    Ngay(i - 1, 1) = Darr(1, j)
                    Exit For
                End If
            Next j
            If Ngay(i - 1, 1) = "" Then n = n + 1
            If n = 200 Then Exit For
        Next i
        Application.ScreenUpdating = False
        Range("L6:L1000").ClearContents:    Range("N6:N1000").ClearContents
        Range("L6").Resize(i - 1) = Vitri:  Range("N6").Resize(i - 1) = Ngay
        Application.ScreenUpdating = True
End Sub
Sub VT()
    Dim i As Long, Darr(), Vitri(1 To 1000, 1 To 1), tmp As String
    Darr = Range("P6:P1000").Value
    tmp = Range("C3").Value
    For i = 1 To UBound(Darr) Step 1
        If Darr(i, 1) <> "" Then Vitri(i, 1) = tmp
    Next i
    Application.ScreenUpdating = False
    Range("M6:M1000").ClearContents
    Range("M6").Resize(i - 1) = Vitri
    Application.ScreenUpdating = True
End Sub

Tạ ơn bác. lần này thì không lệch đi đâu được. Đa tạ bác
 
Upvote 0
Web KT

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

Back
Top Bottom