Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây (1 người xem)

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tôi có đôi chút thắc mắc về Code của thày Ndu, xin được mọi người chỉ bảo giúp tôi học hỏi thêm

1) Theo tôi thì thuộc tính mặc định của Range hoặc Cell trong các biểu thức ưu tiên sẽ là Value, như vậy việc bỏ Value đi có ảnh hưởng gì không?
Đúng ra thì không sao, nhưng khuyên bạn nên tập thói quen cái gì cũng nên viết cho rõ ràng (tường mình) ---> Chừng nào bạn "đi" được rồi hẳn "chạy" cũng chưa muộn

2) Tôi thắc mắc là tại sao lại cần dòng ReDim Arr(1 to 1) ở dưới nhằm mục đích gì, vì tôi bỏ đi vẫn thấy nó đúng mà.
Tại tôi cẩn thận thôi... Khi n = 0 rồi thì phần ở trên ReDim Preserve đã quá đủ (Mục đích Dim Arr(1 to 1) ở dưới là muốn xóa sạch mảng ấy mà)
--------
Tôi xin thắc mắc về cách viết cú pháp chút nữa:

Trong đoạn
PHP:
.Cells(i, 3).Value = "=SUM(R[1]C:R[" & k - i & "]C)"
thì dấu ) nằm trong "" (tức là "]C)").

Tại sao đoạn
PHP:
.Cells(i, 3) = "=" & Join(Arr, "+")
thì dấu ngoặc không "bị" nằm trong dấu "", mặc dù tôi thấy vai trò của nó như nhau.
2 thằng này khác nhau hoàn toàn mà bạn, đâu có gì tương ứng nhau mà bạn so sánh như vậy chứ (1 cái là chuổi, 1 cái là hàm Join, chẳng ăn nhậu gì nhau)
 
Upvote 0
Em cứ tưởng là Join nó giống như Concatenate trong Excel, nghĩa là em cứ nghĩ ô C3 (tức Cells(1,3)) nó nối tất cả các phần tử của cả 2 mảng Tmp1 và Tmp2 vào với nhau

Em nghĩ có thể dùng được
Join(mang1, mang2)

Em chỉ thử nghiệm để biết cách dùng của Join thôi, em đang đi tìm hiểu những cái mới mà em chưa biết thày ah.
--------
Em đang tìm hiểu về Mid trong VBA em viết như trong Excel nhưng chưa được:

PHP:
Sub Tach()
    Dim sArr, Tmp(), sArr2, Tmp2(), i As Long, j As Long
    sArr = Range("A1:A10").Value
    ReDim Tmp(UBound(sArr, 1) - 1)
    For i = 1 To UBound(sArr, 1)
        Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i,1))
        n = n + 1
    Next
    [B1].Resize(n).Value = Tmp
End Sub
Chổ này: Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i,1))
thiếu dấu ngoặc ở cuối
 
Upvote 0
Thưa thày đúng là tôi chưa hiểu sâu về hai hàm SumJoin lúc này khác nhau thế nào, tại sao trong các cách dùng không bình đẳng?

Rất kính mong thày giảng cho chỗ này để lần sau tôi viết không bị lúng túng, nhầm lẫn nữa.
 
Upvote 0
Em sửa Code thành
PHP:
 Sub Tach()
    Dim sArr, Tmp(), i As Long, j As Long
    sArr = Range("A1:A10").Value
    ReDim Tmp(UBound(sArr, 1) - 1)
    For i = 1 To UBound(sArr, 1)
        Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i, 1)))
        n = n + 1
    Next i
    [B1].Resize(n).Value = Tmp
End Sub

Em tiến hành chạy Code kết quả ra không như em mong muốn:
Cụ thể kết quả chạy Code ra toàn bộ các ô B1 đến B10 nó đều tách ra từ A1 (giá trị từ B1 đến B10 bằng nhau.

Trong khi mục đích của em là ô Bi tách ra từ Ai tương ứng (i = 1 to 10)
 

File đính kèm

Upvote 0
Thưa thày đúng là tôi chưa hiểu sâu về hai hàm SumJoin lúc này khác nhau thế nào, tại sao trong các cách dùng không bình đẳng?

Rất kính mong thày giảng cho chỗ này để lần sau tôi viết không bị lúng túng, nhầm lẫn nữa.
Cái thằng SUM ấy chẳng qua chỉ là 1 chuổi, gán xuống sheet nó hiểu thành hàm SUM thôi (trong VBA nó chẳng hiểu đấy là hàm đâu)
Còn thằng Join thì đúng là hàm thật sự trong VBA
 
Upvote 0
Em sửa Code thành
PHP:
 Sub Tach()
    Dim sArr, Tmp(), i As Long, j As Long
    sArr = Range("A1:A10").Value
    ReDim Tmp(UBound(sArr, 1) - 1)
    For i = 1 To UBound(sArr, 1)
        Tmp(i - 1) = Mid(sArr(i, 1), 2, Len(sArr(i, 1)))
        n = n + 1
    Next i
    [B1].Resize(n).Value = Tmp
End Sub

Em tiến hành chạy Code kết quả ra không như em mong muốn:
Cụ thể kết quả chạy Code ra toàn bộ các ô B1 đến B10 nó đều tách ra từ A1 (giá trị từ B1 đến B10 bằng nhau.

Trong khi mục đích của em là ô Bi tách ra từ Ai tương ứng (i = 1 to 10)
Vì tmp là mảng 1 chiều ---> Gán xuống sheet theo chiều dọc nó chỉ lấy được phần tử đâu tiên thôi
Sửa lại thế này:
Mã:
 Sub Tach()
  Dim sArr, Tmp(), i As Long, j As Long, n As Long
  sArr = Range("A1:A10").Value
  ReDim Tmp(UBound(sArr, 1) - 1[COLOR=#ff0000][B], 0[/B][/COLOR])
  For i = 1 To UBound(sArr, 1)
    Tmp(i - 1[COLOR=#ff0000][B], 0[/B][/COLOR]) = Mid(sArr(i, 1), 2, Len(sArr(i, 1)))
    n = n + 1
  Next i
  [B1].Resize(n).Value = Tmp
End Sub
 
Upvote 0
Thì ra là vậy, nhưng thày ơi căn cứ vào đâu (làm sao biết được):
1) những hàm trong Excel (đồng thời là hàm trong VBA),
2) Những hàm nào chỉ của riêng Excel (nhưng VBA không coi nó là hàm).
 
Upvote 0
Thì ra là vậy, nhưng thày ơi căn cứ vào đâu (làm sao biết được):
1) những hàm trong Excel (đồng thời là hàm trong VBA),
2) Những hàm nào chỉ của riêng Excel (nhưng VBA không coi nó là hàm).
Thật ra ý tôi nói là vầy:
- Đoạn "=SUM(..... )" gì gì đó trong VBA chỉ xem là chuối(do bao bọc bởi cặp dấu nháy kép)... khi gán xuống sheet, do có dấu bằng đằng trước chuổi, kết hợp với tật cả những thành phần bên trong SUM( đều hợp quy tắc của hàm SUM nên bảng tính tự động hiểu đấy là 1 công thức (chứ không phải vì lý do hàm ấy có hay không có trong VBA)
Nó gần giống như cách người ta làm tại đây:
http://www.giaiphapexcel.com/forum/...o-thả-dữ-liệu-nhảy-cách-!&p=383603#post383603
(thay dấu # thành dấu = và Excel tự động hiểu đó là công thức)
--------------------------
Còn vấn đề bạn muốn biết hàm nào có trong VBA thì cứ Alt + F11, xong bấm F2 sẽ thấy tất cả
 
Upvote 0
Tôi về luyện tập tự mình làm lại ví dụ lúc sáng mà thày Ndu đã giúp, khi so sánh 2 Code tôi có thắc mắc về thứ tự dòng lệnh, cụ thể như sau:

Nguyên văn Code của thày
PHP:
Sub TinhTong()
  Dim i As Long, Dongcuoi As Long, k As Long, n As Long, Arr()
  Dongcuoi = Sheet1.Range("C65000").End(xlUp).Row
  ReDim Arr(1 To 1)
  k = Dongcuoi
  With Sheet1
    For i = Dongcuoi To 1 Step -1
      If .Cells(i, 2).Value <> "" And .Cells(i, 1) = "" Then
        .Cells(i, 3).Value = "=SUM(R[1]C:R[" & k - i & "]C)"
        k = i - 1: n = n + 1
        ReDim Preserve Arr(1 To n)
        Arr(n) = .Cells(i, 3).Address(0, 0)
      ElseIf .Cells(i, 1) <> "" Then
        k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
        ReDim Arr(1 To 1)
      End If
    Next
  End With
End Sub

Bản thân tôi nghĩ đoạn này của thày
PHP:
k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
đúng ra phải đổi thứ tự lại thành
PHP:
 .Cells(i, 3).Value = "=" & Join(Arr, "+")
k = i - 1: n = 0
mới đúng bản chất vấn đề chứ?

Tuy vậy, khi Test tôi thấy kết quả 2 trường hợp trên là giống nhau.

Tôi vẫn băn khoăn là làm như của thày Ndu có nghĩa n = 0 trước --->Arr(n) làm gì còn (vì Arr(n)=Arr(0)=0? thế thì tại sao những cái "đã gom" được trước đây sao nó vẫn cộng vào?), mong được thày giúp cho.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi về luyện tập tự mình làm lại ví dụ lúc sáng mà thày Ndu đã giúp, khi so sánh 2 Code tôi có thắc mắc về thứ tự dòng lệnh, cụ thể như sau:

Nguyên văn Code của thày
PHP:
Sub TinhTong()
  Dim i As Long, Dongcuoi As Long, k As Long, n As Long, Arr()
  Dongcuoi = Sheet1.Range("C65000").End(xlUp).Row
  ReDim Arr(1 To 1)
  k = Dongcuoi
  With Sheet1
    For i = Dongcuoi To 1 Step -1
      If .Cells(i, 2).Value <> "" And .Cells(i, 1) = "" Then
        .Cells(i, 3).Value = "=SUM(R[1]C:R[" & k - i & "]C)"
        k = i - 1: n = n + 1
        ReDim Preserve Arr(1 To n)
        Arr(n) = .Cells(i, 3).Address(0, 0)
      ElseIf .Cells(i, 1) <> "" Then
        k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
        ReDim Arr(1 To 1)
      End If
    Next
  End With
End Sub

Bản thân tôi nghĩ đoạn này của thày
PHP:
k = i - 1: n = 0
        .Cells(i, 3).Value = "=" & Join(Arr, "+")
đúng ra phải đổi thứ tự lại thành
PHP:
 .Cells(i, 3).Value = "=" & Join(Arr, "+")
k = i - 1: n = 0
mới đúng bản chất vấn đề chứ?

Tuy vậy, khi Test tôi thấy kết quả 2 trường hợp trên là giống nhau.

Tôi vẫn băn khoăn là làm như của thày Ndu có nghĩa n = 0 trước --->Arr(n) làm gì còn (vì Arr(n)=Arr(0)=0? thế thì tại sao những cái "đã gom" được trước đây sao nó vẫn cộng vào?), mong được thày giúp cho.
Arr(n) là 1 phần tử trong Arr (phần tử thứ n), còn Join(Arr, "+") là làm việc với nguyên thằng Arr luôn, có liên quan gì đến n đâu chứ
2 đoạn ấy, cái nào trước cái nào sau cũng chẳng ảnh hưởng gì
 
Upvote 0
Về phần mảng tôi vẫn còn hơi NGỐ, rất mong thày chỉ bảo cho Arr được định nghĩa qua ReDim Preserve Arr(1 To n) tức nó không có phần tử 0 (Arr(0)), thế thì tại sao khi viết theo thứ tự cách 1
PHP:
k = i - 1: n = 0
    .Cells(i, 3).Value = "=" & Join(Arr, "+")
nó không bị lỗi nhỉ?
Bởi lúc này hàm Join có thêm phần tử Arr(0) mà.
 
Upvote 0
Về phần mảng tôi vẫn còn hơi NGỐ, rất mong thày chỉ bảo cho Arr được định nghĩa qua ReDim Preserve Arr(1 To n) tức nó không có phần tử 0 (Arr(0)), thế thì tại sao khi viết theo thứ tự cách 1
PHP:
k = i - 1: n = 0
    .Cells(i, 3).Value = "=" & Join(Arr, "+")
nó không bị lỗi nhỉ?
Bởi lúc này hàm Join có thêm phần tử Arr(0) mà.
n = 0 để chuẩn bị cho dòng lệnh phía trên:
Mã:
n = n + 1
ReDim Preserve Arr(1 To n)
Để khi n = n +1 thì n sẽ bắt đầu bằng 1 và ReDim Preserve Arr(1 To n) sẽ chỉnh kích thước mảng về còn 1 phần tử mà thôi
Còn phần Join(Arr, "+") thì Arr đã được tạo thành từ trước rồi, bây giờ cho dù n có bằng bao nhiêu cũng chẳng ảnh hưởng gì
Giống ví dụ này đây:
Mã:
n = 5
Arr = Range("A1").Resize(n).Value
n = 0
Bạn sẽ thấy Arr được tạo thành từ trước, nên sau đó n có thay đổi thì có ảnh hưởng gì đến Arr kia chứ (UBound(Arr) vẫn = 5 thôi)
Thêm 1 ví dụ khác:
Mã:
n= 5
tmp = n
n = 0
MsgBox tmp
Kết quả của MsgBox vẫn là 5 dù sau đó n có thay đổi thế nào
 
Lần chỉnh sửa cuối:
Upvote 0
Được thày Ndu tận tình chỉ bảo, trước trình độ của tôi ù ù cạc cạc vẫn còn lơ mơ lắm, sau một thời gian kiên trì đọc các bài thày giải trên diễn đàn (bất cứ bài nào thày tham gia trên diễn đàn tối về buổi tối tôi đều nghiên cứu lại), tôi cố gắng mỗi hôm học được 1 chút kiến thức mới; qua bài vừa rồi, học được ở thày các khái niệm về ReDim Preserve Arr(1 to n), hàm Join, Address... sau khi thực hành thay đổi cách dùng nhằm hiểu hơn về các khái niệm đó, chiều nay tôi đã có thể tự giải quyết được các bài toán đơn giản rồi.

Một lần nữa xin cảm ơn tấm lòng của các anh, chị, các thày trên diễn đàn, đặc biệt là thày Ndu96081631. Nếu không nhờ công lao to lớn của mọi người thì chắc chẳng bao giờ tôi biết những điều kỳ diệu của VBA.
 
Upvote 0
Xin viết giùm em code cho button In trong sheet.

Trong sheet của em có thiết kế 2 botton dùng để in trang 1 và trang 2 đã được đặt tên là page1 và page2( file kèm theo). Bây giờ em muốn nhấn vào " In trang 1" và " In trang 2" thì excel sẽ tự động in ra. Rất mong được chỉ dấn. thanks GPE
 
Lần chỉnh sửa cuối:
Upvote 0
Trong sheet của em có thiết kế 2 botton dùng để in trang 1 và trang 2 đã được đặt tên là page1 và page2( file kèm theo). Bây giờ em muốn nhấn vào " In trang 1" và " In trang 2" thì excel sẽ tự động in ra. Rất mong được chỉ dấn. thanks GPE
Sao bạn không record macro để được code? Nghiên cứu cái này xem
PHP:
 ActiveSheet.PrintOut From:=2, To:=2, Copies:=1, Collate:=True
 
Upvote 0
Tôi đang cố gắng hệ thống ôn tập lại, thử lại các cách viết các câu lệnh, nhưng khi viết thế này (vẫn nhằm mục đích để hiện công thức ấy mà) nhưng không được, cụ thể:

PHP:
Sub tinhtong()
Cells(1, 4).Formula = "=" & Cells(1, 3).Address(0, 0)* Cells(1, 2).Address(0, 0)
End Sub

Xin nhờ mọi người sửa giúp
 
Upvote 0
Tôi đang cố gắng hệ thống ôn tập lại, thử lại các cách viết các câu lệnh, nhưng khi viết thế này (vẫn nhằm mục đích để hiện công thức ấy mà) nhưng không được, cụ thể:

PHP:
Sub tinhtong()
Cells(1, 4).Formula = "=" & Cells(1, 3).Address(0, 0)* Cells(1, 2).Address(0, 0)
End Sub

Xin nhờ mọi người sửa giúp

Hoặc là viết thế này:
Cells(1, 4).Value = Cells(1, 3) * Cells(1, 2)
Hoặc là viết thế này
Cells(1, 4).Formula = "=" & Cells(1, 3).Address(0, 0) & "*" & Cells(1, 2).Address(0, 0)
Còn cách của bạn thì... giống như xăng pha nhớt
Ẹc... Ẹc...
 
Upvote 0
Phần này tôi vẫn còn lúng túng, chưa thạo lắm, xin thày giúp cho chút nữa công thức sau phải sửa thế nào cho đúng

PHP:
Cells(i, 8).Formula = "=sum(R[1]C:R[" & kk - i & "]C)*" & Cells(i, 6).Address(0, 0)
 
Lần chỉnh sửa cuối:
Upvote 0
Phần này tôi vẫn còn lúng túng, chưa thạo lắm, xin thày giúp cho chút nữa công thức sau phải sửa thế nào cho đúng

PHP:
Cells(i, 8).Formula = "=sum(R[1]C:R[" & kk - i & "]C)*" & Cells(i, 6).Address(0, 0)
Bạn sửa công thức thành:
PHP:
Cells(i, 8).FormulaR1C1 = "=SUM(R[1]C:R[" & kk - i & "]C)*RC6"
Mấy chỗ như thế này thì cứ Record Macro là biết liền thôi mà. Bạn hãy thử đi!
 
Upvote 0
Bạn sửa công thức thành:
PHP:
Cells(i, 8).FormulaR1C1 = "=SUM(R[1]C:R[" & kk - i & "]C)*RC6"
Mấy chỗ như thế này thì cứ Record Macro là biết liền thôi mà. Bạn hãy thử đi!
Cái này:
Cells(i, 8).Formula = "=sum(R[1]C:R[" & kk - i & "]C)*RC[-2]"
Mới tương đương với Address(0,0)
 
Upvote 0
Nhờ làm bài toán sau bằng VBA (theo phương pháp mảng điền thẳng Value) vào ô kết quả

Tìm các bài toán trên diễn đàn để thực hành, tôi làm lại bài toán sau (điền kết quả vào cột I)
Tinhtong.jpg


Code viết chạy kết quả chính xác, nhưng có cảm giác Code chưa được gọn lắm, xin nhờ tư vấn giúp tôi xem có thể rút gọn được không?

PHP:
Sub TinhTong()
    Dim i As Long, Dongcuoi As Long, Congviec As Long, n As Long
    Dim kk As Long, VLK As Long, Arr(), Tmp()
    Dongcuoi = Sheet1.Range("D65000").End(xlUp).Row
    ReDim Tmp(1 To 1)
    Congviec = Dongcuoi
    Range("I4:I1000").ClearContents
    For i = Dongcuoi To 4 Step -1
        If Cells(i, 4) = "TTPK" Then
            kk = i
            Congviec = i - 1
            m = m + 1
            ReDim Preserve Arr(1 To m)
            Arr(m) = Cells(i, 9).Address(0, 0)
        ElseIf Cells(i, 4) = "VL" Or Cells(i, 4) = "NC" Or Cells(i, 4) = "MTC" Then
            Cells(i, 9).Value = "=SUM(R[1]C:R[" & Congviec - i & "]C)*RC[-2]"
            Congviec = i - 1
            n = n + 1
            ReDim Preserve Tmp(1 To n)
            Tmp(n) = Cells(i, 9).Address(0, 0)
            m = m + 1
            ReDim Preserve Arr(1 To m)
            Arr(m) = Cells(i, 9).Address(0, 0)
        ElseIf Cells(i, 4) = "Vlkhac" Then
            VLK = i
        ElseIf Cells(i, 1) <> "" Then
            Cells(VLK, 9).Value = "=SUM(R[-1]C:R[" & i + 2 - VLK & "]C)*RC[-2]%"
            Cells(kk, 9).Value = "=" & "(" & Join(Tmp, "+") & ")" & "*1.5%"
            Cells(i, 9).Value = "=" & Join(Arr, "+")
            Congviec = i - 1
            n = 0
            m = 0
            VLK = 0
        Else
            Cells(i, 9).Formula = "=" & Cells(i, 7).Address(0, 0) & "*" & Cells(i, 8).Address(0, 0)
        End If
    Next
End Sub

Bài toán này tôi định làm thêm 1 phương pháp bằng VBA theo dạng mảng điền thẳng kết quả (value vào những ô cần điền) nhưng nghĩ mãi mà làm không ra, nhờ mọi ngưòi giúp cho tôi thêm cách này để tôi có điều kiện học hỏi.

Xin trân trọng cảm ơn.
 

File đính kèm

Upvote 0
Cho em hỏi về Code lọc dữ liệu với ah:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim CrRng As Range
  If Not Intersect(Range("C1:C2"), Target) Is Nothing Then
    Range("A4:G1000").Clear
    Set CrRng = Range("C1:C2")
    With Sheets("Data")
      With .Range(.[A1], .[A65536].End(xlUp)).Resize(, 7)
        .AdvancedFilter 2, CrRng, Range("A4")
      End With
    End With
    Range([A4], [A65536].End(xlUp)).Resize(, 2).Offset(, 3).Delete 1
  End If
End Sub

xin kính mong được giúp đỡ
------------
Dấu <> ở ô C2 sheets(Detail) có phải là dạng toán tử không (tại sao không là ký tự khác?) hay nó thể hiện là chỉ lọc những ô không phải là ô rỗng tại cột TK Nợ, TK Có (tức cột D, E) ?
Trong Delete 1 thì 1 là gì ah?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bác cứ ghi Macro chức năng của Advanced Filter là có đầy đủ mà (quan trọng là mình phải thực hành "cày" thật nhiều + Google thì mới nhanh ra được).
Về Delete 1 thì em tìm hiểu mãi chưa chưa biết nó là gì, nhưng em thử thấy bỏ đi nó vẫn vậy.
 
Upvote 0
Cho em hỏi về Code lọc dữ liệu với ah:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim CrRng As Range
  If Not Intersect(Range("C1:C2"), Target) Is Nothing Then
    Range("A4:G1000").Clear
    Set CrRng = Range("C1:C2")
    With Sheets("Data")
      With .Range(.[A1], .[A65536].End(xlUp)).Resize(, 7)
        .AdvancedFilter 2, CrRng, Range("A4")
      End With
    End With
    Range([A4], [A65536].End(xlUp)).Resize(, 2).Offset(, 3).Delete 1
  End If
End Sub

xin kính mong được giúp đỡ
------------
Dấu <> ở ô C2 sheets(Detail) có phải là dạng toán tử không (tại sao không là ký tự khác?) hay nó thể hiện là chỉ lọc những ô không phải là ô rỗng tại cột TK Nợ, TK Có (tức cột D, E) ?
Dấu <> này là 1 trong những điều kiện lọc của Advanced Filter, ý muốn nói khác rổng
Thật ra các hàm SUMIF, COUNTIF cũng dùng kiểu điều kiện này. Ví dụ =SUMIF(Data!D2:D9,"<>",Data!G2:G9) cho kết quả =15 ---> Tính tổng vùng Data!G2:G9 với điều kiện vùng Data!D2:D9 <> rổng
Ngoài điều kiện "<>" còn có điều kiện "=" (ý nghĩa ngược lại)
----------------------------------
Trong Delete 1 thì 1 là gì ah?
Do lọc sheet Data nhưng lại muốn bỏ bớt 2 cột TK Nợ và TK Có nên phải xóa bớt ấy mà
Thật ra do ngày xưa NGU nên mới viết vậy! Nếu bây giờ thì tôi sẽ viết vầy
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim CrRng As Range
  If Not Intersect(Range("C1:C2"), Target) Is Nothing Then
    Range("[COLOR=#ff0000][B]A5:G1000[/B][/COLOR]").Clear
    Set CrRng = Range("C1:C2")
    With Sheets("Data")
      With .Range(.[A1], .[A65536].End(xlUp)).Resize(, 7)
        .AdvancedFilter 2, CrRng, Range("[COLOR=#ff0000][B]A4:E4[/B][/COLOR]")
      End With
    End With
  End If
End Sub
Khỏi Delete 1 gì cả vẫn cho kết quả đúng ý
 
Lần chỉnh sửa cuối:
Upvote 0
(1) Về Delete 1 thì em tìm hiểu mãi chưa chưa biết nó là gì, (2) nhưng em thử thấy bỏ đi nó vẫn vậy.

(1) Mà nếu bạn biết rồi cũng đừng nên xài như vậy, mình khuyên bạn đó!

Nó giống như vay tiền đi buôn vậy đó bạn! Nhiều bất trắc dễ gặp khi tay nghề ta chưa cao.

(2) Không đâu, có khi lúc này, có khi lúc khác à nha! Vì bạn chưa gặp mà thôi, chứ thấy quan tài là đỗ lệ liền à.
 
Upvote 0
(1) Mà nếu bạn biết rồi cũng đừng nên xài như vậy, mình khuyên bạn đó!

.
Em nghĩ ngược lại đấy sư phụ à!
Nhũng hằng số xlUp, xlDown... vân vân.. chỉ có thể hoạt động được trong môi trường Excel
Hay nói chung, hằng số của 1 Reference nào tạo ra thì code chỉ có thể hiểu được khi gọi chính Reference ấy thôi
Lấy ví dụ: Anh gọi Scripting Runtime (bằng cách check mục "Microsoft Scripting Runtime" trong Tools\References) rồi chạy code dưới đây
Mã:
With New Scripting.FileSystemObject
  .OpenTextFile "Duong dan file", [COLOR=#ff0000][B]ForReading[/B][/COLOR]
End With
Cái thằng màu đỏ ForReading ấy là hằng số và code chỉ có thể hiểu được khi gọi Scripting Runtime
Đặt trường hợp mang code sang máy khác, người ta không muốn gọi Scripting Runtime bằng cách check References thì sẽ viết thế này:
Mã:
With CreateObject("Scripting.FileSystemObject")
  .OpenTextFile "Duong dan file", [COLOR=#ff0000][B]ForReading[/B][/COLOR]
End With
Code lỗi này lập tức thì nó chẳng hiểu ForReading là cái giống gì cả
Trong trường hợp này, tốt nhất phải thuộc lòng giá trị hằng số ấy là bao nhiêu rồi ghi trực tiếp vào code:
Mã:
With CreateObject("Scripting.FileSystemObject")
   .OpenTextFile "Duong dan fil", [COLOR=#ff0000][B]1[/B][/COLOR]
 End With
Hoặc cách khác
Mã:
[B][COLOR=#ff0000]Public Const ForReading = 1[/COLOR][/B]
Sub Test()
With CreateObject("Scripting.FileSystemObject")
  .OpenTextFile "Duong dan fil", [B][COLOR=#ff0000]ForReading[/COLOR][/B]
End With
End Sub
Lập trình VB hoặc VBA khi dùng các hàm API hổ trợ người ta vẫn dùng cách này đấy sư phụ à
-----------------------
Sư phụ có nghĩ đến tình huống người ta viết code từ VB6, gọi Excel bằng cách CreateObject("Excel.Application") gì gì đó thì làm cách nào code nó hiểu xlUp, xlDown là cái gì đây?
Kết luận cuối cùng: Phải luôn thuộc lòng các giá trị của hằng số để có thể làm việc trên bất cứ môi trường nào (không riêng gì Excel)
 
Lần chỉnh sửa cuối:
Upvote 0
Thưa thày Code viết theo cách mới
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim CrRng As Range
  If Not Intersect(Range("C1:C2"), Target) Is Nothing Then
    Range("A5:G1000").Clear
    Set CrRng = Range("C1:C2")
    With Sheets("Data")
      With .Range(.[A1], .[A65536].End(xlUp)).Resize(, 7)
        .AdvancedFilter 2, CrRng, Range("A4:E4")
      End With
    End With
  End If
End Sub
Như thế thì tại sao máy nó hiểu là xóa 2 cột D và E đi mà không phải là xóa các cột khác?
 
Upvote 0
Thưa thày Code viết theo cách mới
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim CrRng As Range
  If Not Intersect(Range("C1:C2"), Target) Is Nothing Then
    Range("A5:G1000").Clear
    Set CrRng = Range("C1:C2")
    With Sheets("Data")
      With .Range(.[A1], .[A65536].End(xlUp)).Resize(, 7)
        .AdvancedFilter 2, CrRng, Range("A4:E4")
      End With
    End With
  End If
End Sub
Như thế thì tại sao máy nó hiểu là xóa 2 cột D và E đi mà không phải là xóa các cột khác?
Đó là tính năng của Advanced Filter mà tôi mới biết thời gian gần đây (nhở xem bài của nghiaphuc)
Có nghĩa là:
- Nếu bạn có dữ liệu 6 cột (với tiêu đề cho trước)
- Khi lọc ra nơi khác và không nói gì thì Advanced Filter sẽ lọc hết 6 cột ấy
- Tại nơi đặt kết quả, nếu bạn ghi sẵn 4 tiêu đề của 4 cột thì khi lọc ra, Advanced Filter sẽ ngầm hiểu rằng bạn chỉ muốn lấy 4 cột (2 cột còn lại không lấy)
-----------
Tóm lại, để lọc theo cách có chọn lựa kiểu này thì điều tiên quyết là bạn phải ghi trước ra nơi đặt kết quả những tên tiêu đề cột nào mà bạn muốn lấy
 
Upvote 0
Cho em hỏi về Code lọc dữ liệu với ah:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim CrRng As Range
  If Not Intersect(Range("C1:C2"), Target) Is Nothing Then
    Range("A4:G1000").Clear
    Set CrRng = Range("C1:C2")
    With Sheets("Data")
      With .Range(.[A1], .[A65536].End(xlUp)).Resize(, 7)
        .AdvancedFilter 2, CrRng, Range("A4")
      End With
    End With
    Range([A4], [A65536].End(xlUp)).Resize(, 2).Offset(, 3).Delete 1
  End If
End Sub

xin kính mong được giúp đỡ
------------
Dấu <> ở ô C2 sheets(Detail) có phải là dạng toán tử không (tại sao không là ký tự khác?) hay nó thể hiện là chỉ lọc những ô không phải là ô rỗng tại cột TK Nợ, TK Có (tức cột D, E) ?
Trong Delete 1 thì 1 là gì ah?
tôi thì hay chế code của NDU
theo tôi thì như chế đoạn như vầy
Range([A4], [A65536].End(xlUp)).Resize(, 2).Offset(, 3).Delete 1
thành

Range([A4], [A65536].End(xlUp)).Resize(, 4).Offset(, 3).Value = Range([A4], [A65536].End(xlUp)).Resize(, 4).Offset(, 5).Value
 
Upvote 0
Thày còn Link bài này không ah, nếu có thày cho em xin

(Em thấy kiểu này thày làm tương đối mới so với các bài em đã đọc về Advanced Filter, các bài trước vùng điều kiện 1 ô đầu tiên thường để trống)
 
Upvote 0
Thày còn Link bài này không ah, nếu có thày cho em xin
Chắc là bài này:
http://www.giaiphapexcel.com/forum/...-dữ-liệu-sang-sheet-khac-sau-khi-autofilter
(Seach cái ra ngay mà)
(Em thấy kiểu này thày làm tương đối mới so với các bài em đã đọc về Advanced Filter, các bài trước vùng điều kiện 1 ô đầu tiên thường để trống)
- Với vùng điều kiện của Advanced Filter, nếu cell thứ 2 là công thức thì cell thứ nhất buộc phải để trống (hoặc ghi cái gì đó miễn khác với tiêu đề dữ liệu)
- Với vùng điều kiện của Advanced Filter, nếu cell thứ 2 là 1 điều kiện cụ thể (dạng chuổi) thì cell thứ nhất bắt buộc phải có tên là 1 tiêu đề nào đó của dữ liệu
Thật ra trong Excel, ta có thể bấm F1, gõ từ khóa Advanced Filter vào để xem chi tiết
 
Upvote 0
Thưa thày tại sao em thay
PHP:
.AdvancedFilter 2, CrRng, Range("A4:E4")

bằng cái này
PHP:
.AdvancedFilter 2, CrRng, Range("A4:F4")

Nó báo lỗi, em không biết vì sao vì em chưa hiểu bản chất vấn đề lắm
 
Upvote 0
Thưa thày tại sao em thay
PHP:
.AdvancedFilter 2, CrRng, Range("A4:E4")

bằng cái này
PHP:
.AdvancedFilter 2, CrRng, Range("A4:F4")

Nó báo lỗi, em không biết vì sao vì em chưa hiểu bản chất vấn đề lắm

Câu lệnh AdvancedFilter 2, CrRng, Range("A4:F4") có nghĩa là:
- Dùng Advanced Filter lọc sang nơi khác
- Điều kiện lọc là CrRng
- Nơi đặt kết quả là Range("A4:F4")
Bạn có 2 lựa chọn về cách viết nơi đặt kết quả:
- Hoặc là xóa sạch vùng đặt kết quả (bao gồm tiêu đề) rồi thay Range("A4:F4") thành Range("A4") ---> Tức chỉ được phép ghi là 1 CELL
- Hoặc là phải ghi đầy đủ tiêu đề vào vùng A4:F4 (cell F4 không được để trống) thì mới dùng được code trên
 
Upvote 0
Em đã hiểu rồi, thì ra cách đặt trước vùng thì phải cho nó nhìn được Tên tiêu đề (của những cột cần lọc).

Em xin hỏi chút xíu nữa trong cách dùng của AdvancedFilter:
Nếu vùng điều kiện trong trường hợp ô đầu tiên (C1) là tên của tiêu đề cột, tức ô sau không dùng dưới dạng công thức mà dùng dưới dạng biểu thức (ký tự) thì: ô sau (C2) ngoài ký tự <>(khác rỗng), còn có ký tự nào khác hay dùng nữa không?

(em thử nghiệm cho một số ký tự khác như >...---> kết quả nó ra đều tương đương với None)
 
Upvote 0
Em đã hiểu rồi, thì ra cách đặt trước vùng thì phải cho nó nhìn được Tên tiêu đề (của những cột cần lọc).

Em xin hỏi chút xíu nữa trong cách dùng của AdvancedFilter:
Nếu vùng điều kiện trong trường hợp ô đầu tiên (C1) là tên của tiêu đề cột, tức ô sau không dùng dưới dạng công thức mà dùng dưới dạng biểu thức (ký tự) thì: ô sau (C2) ngoài ký tự <>(khác rỗng), còn có ký tự nào khác hay dùng nữa không?

(em thử nghiệm cho một số ký tự khác như >...---> kết quả nó ra đều tương đương với None)
Có thể dùng bất cứ chuổi gì, miễn sao "nó" hiểu
Ví dụ
- Cell C2 bạn ghi 156 ---> Nghĩa là lọc thằng nào ở cột trùng với tiêu đề C1 và điều kiện là =156
- Cell C2 bạn ghi >100 ---> Nghĩa là lọc thằng nào ở cột trùng với tiêu đề C1 và điều kiện là >100
--------------
Còn chữ None, chẳng qua ghi thế cho gợi nhớ, bạn có thể thay nó bằng bất cứ chữ gì (chữ xóa hết chẳng hạn) miễn sao chữ ấy không có trong dữ liệu ---> Mục địch của ta là xóa hết mà
 
Upvote 0
Cho em hỏi trong Code sau

PHP:
Sub Xoadong()
 Dim Rng As Range
 Set Rng = [A1].CurrentRegion
 Rng.Value = Rng.Value
 Rng.AutoFilter Field:=3, Criteria1:="0"
 Rng.SpecialCells(12).EntireRow.Delete
End Sub

tại sao lại có dòng Rng.Value = Rng.Value nghĩa là gì ah?
 
Upvote 0
Cho em hỏi trong Code sau

PHP:
Sub Xoadong()
 Dim Rng As Range
 Set Rng = [A1].CurrentRegion
 Rng.Value = Rng.Value
 Rng.AutoFilter Field:=3, Criteria1:="0"
 Rng.SpecialCells(12).EntireRow.Delete
End Sub

tại sao lại có dòng Rng.Value = Rng.Value nghĩa là gì ah?
Chắc là sợ trong Rng có công thức, sau khi xóa dòng xong nó "chạy loạn" chăng, nên trước khi xóa, dùng câu lệnh Rng.Value = Rng.Value để chuyển công thức thành giá trị ấy mà
 
Upvote 0
Cho em hỏi -1E+308 là gì

Trong Code
PHP:
Function MaxIf(ByVal CritArr, ByVal Criteria, ByVal ResArr) As Double
  Dim TmpMax As Double, TmpCrit, TmpRes, i As Long, j As Long
  TmpMax = -1E+308
  TmpCrit = CritArr: TmpRes = ResArr
  For i = LBound(TmpCrit, 1) To UBound(TmpCrit, 1)
    For j = LBound(TmpCrit, 2) To UBound(TmpCrit, 2)
      If TmpCrit(i, j) = Criteria Then
        If TmpRes(i, j) > TmpMax Then TmpMax = TmpRes(i, j)
      End If
    Next
  Next
  MaxIf = TmpMax
End Function

Cho em hỏi -1E+308 là gì, liệu có phải là số nhỏ nhất không, nhỡ may cột A có số nào nhỏ hơn nó thì sao

(Tại sao không phải là -1E+309... gì đó?)
 
Upvote 0
Trong Code
PHP:
Function MaxIf(ByVal CritArr, ByVal Criteria, ByVal ResArr) As Double
  Dim TmpMax As Double, TmpCrit, TmpRes, i As Long, j As Long
  TmpMax = -1E+308
  TmpCrit = CritArr: TmpRes = ResArr
  For i = LBound(TmpCrit, 1) To UBound(TmpCrit, 1)
    For j = LBound(TmpCrit, 2) To UBound(TmpCrit, 2)
      If TmpCrit(i, j) = Criteria Then
        If TmpRes(i, j) > TmpMax Then TmpMax = TmpRes(i, j)
      End If
    Next
  Next
  MaxIf = TmpMax
End Function

Cho em hỏi -1E+308 là gì, liệu có phải là số nhỏ nhất không, nhỡ may cột A có số nào nhỏ hơn nó thì sao

(Tại sao không phải là -1E+309... gì đó?)

Đúng ra số -9.99999999999999E+307 mới là nhỏ nhất
Thử gõ số -9.99999999999999E+307 vào A1
Tại B1, gõ công thức = A1-1
Tại C1, gõ công thức =A1=B1 xem ra kết quả bao nhiêu?
Dù bạn có trừ bớt bao nhiêu thì B1 cũng không sao nhỏ hơn A1 được
Ẹc... Ẹc...
 
Upvote 0
ReDim rArr(1 To UBound(sArr1, 1), 1 To 1)

Làm ơn chỉ dùm em ý nghĩa của đoạn code trên với.
Em cám ơn ACE nhiều
 
Upvote 0
ReDim rArr(1 To UBound(sArr1, 1), 1 To 1)

Làm ơn chỉ dùm em ý nghĩa của đoạn code trên với.
Em cám ơn ACE nhiều
Dòng code này có nghĩa là khai báo lại mảng rArr với chiếu ngang là từ 1 đến số phần tử cuối cùng và là chiều ngang của mảng sArr1, chiếu dọc là 1.
 
Upvote 0
Bạn không trừ được là do bạn định dạng ở các Textbox.
PHP:
Function LoaiDau(ByVal numb As String) As Double
    On Error GoTo ExitFunction
    LoaiDau = Replace(numb, ",", "")
ExitFunction:
End Function

Sau khi ngồi ngẫm nghĩ thật lâu, tôi cảm thấy hàm trên vẫn chưa ổn định và chưa tổng quát. Ý của tôi là nếu ta gặp trường hợp định dạng trong Control Panel, có máy định dạng dấu thập phân là dấu phẩy (,), có máy định dạng là dấu chấm (.) thì hàm này bị "toi" như chơi.

Vậy thì dùng hàm tổng quát hơn:

PHP:
Function ResNum(ByVal MyNum As String) As Double
    On Error Resume Next
    ResNum = CDbl(MyNum)
End Function

Hoặc để khỏi rườm rà, hàm hiếc gì, thay vì ResNum("Number"), ta chỉ việc CDbl("Number") là xong xui!
 
Upvote 0
Nhờ các Pro kiểm tra hộ cái này, code 1 là cộng dồn tự động xóa, code 2 là link dữ liệu từ Sheet1 sang các Sheets khác (kiểm tra xem code 2 có đúng không?)
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim Tem As Variant
If Not Intersect(Target, [AF4:AO13]) Is Nothing Then
Application.EnableEvents = False
Tem = Target
Target.Offset(29) = Target.Offset(29) + Tem
Target.ClearContents
Application.EnableEvents = True
ElseIf Not Intersect(Target, [AF20:AO29]) Is Nothing Then
Application.EnableEvents = False
Tem = Target
Target.Offset(13, -12) = Target.Offset(13, -12) + Tem
Target.ClearContents
Application.EnableEvents = True
ElseIf Not Intersect(Range("AR20:AR29,AU20:AU29,AX20:AX29,BA19:BA30,BD19:BD30,BG16:BG30,BJ19:BJ22"), Target) Is Nothing Then
Application.EnableEvents = False
Tem = Target
Target.Offset(, 1) = Target.Offset(, 1) + Tem
Target.ClearContents
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S2").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S3").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S4").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing
Then Sheets("S5").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S6").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S7").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S8").Range("H4:Q13").Value = Range("H4:Q13").Value
End If
If Not Intersect(Range("H4:Q13"), Target) Is Nothing Then
Sheets("S9").Range("H4:Q13").Value = Range("H4:Q13").Value
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Code này có lỗi gì???

Các bác xem lỗi ở code sau là gì nhé:
VD1:
Mã:
Public Sub VD1()
Dim a As Long
a = 20000 * 2
End Sub
Bị lỗi tràn nhưng mình không hiểu đoạn code sau thì lại không lỗi:
VD2:
Mã:
Public Sub VD2()
Dim a As Long
a = 12345678 * 2
End Sub
Mình có xem phần help của nó thì nó bảo là Bạn cố gắng sử dụng một số trong tính toán và con số đó được cưỡng chế vào một số nguyên nhưng kết quả là lớn hơn so với một số nguyên. Họ đưa ra ví dụ sau:
Mã:
Dim x As Long
x = 2000 * 365   ' Error: Overflow

Để khắc phục thì làm như sau:
Mã:
Dim x As Long
x = CLng(2000) * 365

Vậy thì ví dụ 2 ở trên sao lại không lỗi (số 12345678 vượt quá giới hạn số nguyên mà) trong khi đó VD1 thì lại lỗi (do số 20000 vượt quá giới hạn số nguyên????
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác xem lỗi ở code sau là gì nhé:
VD1:
Mã:
Public Sub VD1()
Dim a As Long
a = 20000 * 2
End Sub
Bị lỗi tràn nhưng mình không hiểu đoạn code sau thì lại không lỗi:
VD2:
Mã:
Public Sub VD2()
Dim a As Long
a = 12345678 * 2
End Sub
Mình có xem phần help của nó thì nó bảo là Bạn cố gắng sử dụng một số trong tính toán và con số đó được cưỡng chế vào một số nguyên nhưng kết quả là lớn hơn so với một số nguyên. Họ đưa ra ví dụ sau:
Mã:
Dim x As Long
x = 2000 * 365   ' Error: Overflow

Để khắc phục thì làm như sau:
Mã:
Dim x As Long
x = CLng(2000) * 365

Vậy thì ví dụ 2 ở trên sao lại không lỗi (số 12345678 vượt quá giới hạn số nguyên mà) trong khi đó VD1 thì lại lỗi (do số 20000 vượt quá giới hạn số nguyên????
Tôi thấy chẳng liên quan gì đến biến Long đâu
Lỗi này rất kỳ lạ!
Code chỉ vầy thôi: MsgBox 20000 + 12768 cũng lỗi
Code này lỗi ngay cả khi chạy trên VB6 chứ không riêng gì VBA
Nhưng nếu viết vầy:
PHP:
Public Sub VD1()
  Dim a As Long
  a = 20000
  a = a * 2
End Sub
Thì lại chẳng có vấn đề gì
Chả biết có cái gì trong trái ổi này nữa
 
Upvote 0
Các bác xem lỗi ở code sau là gì nhé:
VD1:
Mã:
Public Sub VD1()
Dim a As Long
a = 20000 * 2
End Sub
Bị lỗi tràn nhưng mình không hiểu đoạn code sau thì lại không lỗi:
VD2:
Mã:
Public Sub VD2()
Dim a As Long
a = 12345678 * 2
End Sub
Mình có xem phần help của nó thì nó bảo là Bạn cố gắng sử dụng một số trong tính toán và con số đó được cưỡng chế vào một số nguyên nhưng kết quả là lớn hơn so với một số nguyên. Họ đưa ra ví dụ sau:
Mã:
Dim x As Long
x = 2000 * 365   ' Error: Overflow

Để khắc phục thì làm như sau:
Mã:
Dim x As Long
x = CLng(2000) * 365

Vậy thì ví dụ 2 ở trên sao lại không lỗi (số 12345678 vượt quá giới hạn số nguyên mà) trong khi đó VD1 thì lại lỗi (do số 20000 vượt quá giới hạn số nguyên????


bạn chỉ cần thêm như thế này, thì sẽ hết lỗi
Mã:
Public Sub VD1()
     Dim a As Long
     a = 20000 * 2#
End Sub

Tại sao ah, cái này là kiến thức cơ bản đây, bạn xem lại phạm vi của biến INTEGER sẽ hiểu ngay mà, vậy nhé
ở đây là lỗi VBA đã ép kiểu với số đó bạn ah, (vì thế nên a = 12345678 * 2 thì không lỗi)
.
 
Lần chỉnh sửa cuối:
Upvote 0
Phiền các bác sửa cho Code sau thành đúng giúp
PHP:
Sub Month()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
            Arr(j, 1) = Month(Vung)
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub

Xin cảm ơn rất nhiều
 

File đính kèm

Upvote 0
Phiền các bác sửa cho Code sau thành đúng giúp
PHP:
Sub Month()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
            Arr(j, 1) = Month(Vung)
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub

Xin cảm ơn rất nhiều
Bạn sửa thành thế này xem đúng ý chưa nhé,đặc biệt để ý tên SUB mình đổi lại, bạn đặt tên SUB trùng với hàm bạn dùng trong SUB, khi bạn dùng Month trong sub nó tưởng bạn gọi lại SUB, khai báo tham số cho SUB đó (SUB bạn đặt trên không có tham số) VBA báo lỗi sai tham số.
PHP:
Sub MonthT()
    Dim Vung(), Arr(), i As Long
    Dim mydate
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            mydate = Cells(i + 4, 1).Value
            Arr(i, 1) = Month(mydate)
        Next
    End With
    Sheet2.[A1].Resize(i).Value = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
bạn chỉ cần thêm như thế này, thì sẽ hết lỗi
Mã:
Public Sub VD1()
     Dim a As Long
     a = 20000 * 2#
End Sub

Tại sao ah, cái này là kiến thức cơ bản đây, bạn xem lại phạm vi của biến INTEGER sẽ hiểu ngay mà, vậy nhé
ở đây là lỗi VBA đã ép kiểu với số đó bạn ah, (vì thế nên a = 12345678 * 2 thì không lỗi)
.
Không phải đâu đại ca ơi
Cái này chẳng liên quan gì đến Long hay Integer cả
Một câu lệnh như vầy cũng đã lỗi rồi MsgBox 20000 * 2 (lệnh này chỉ tính toán, chẳng có biến nào cả)
Lỗi này xuất hiện cả khi chạy trên VB6! Trên các mạng nước ngoài cũng rất nhiều người hỏi (hầu hết đều liên quan đến con số 20000) nhưng chẳng ai hiểu và giải thích được tại sao lại như vậy
 
Upvote 0
Không phải đâu đại ca ơi
Cái này chẳng liên quan gì đến Long hay Integer cả
Một câu lệnh như vầy cũng đã lỗi rồi MsgBox 20000 * 2 (lệnh này chỉ tính toán, chẳng có biến nào cả)
Lỗi này xuất hiện cả khi chạy trên VB6! Trên các mạng nước ngoài cũng rất nhiều người hỏi (hầu hết đều liên quan đến con số 20000) nhưng chẳng ai hiểu và giải thích được tại sao lại như vậy

Chính xác đó, VBA về bản chất cũng xuất phát từ VB mà a ndu... tiểu ca (hehe , vui chút, gọi đại ca nghe sợ quá),

xem ví dụ sau

SUB sau sẽ bị báo lỗi
PHP:
Sub t()
    MsgBox 16384 * 2
End Sub

Trong khi đó SUB sau lại bình thường
PHP:
Sub t2()
    MsgBox 16383 * 2
End Sub

vì sao thế
Phạm vi của biến INTEGER là -32768 đến 32767 nên xuất hiện lỗi đó, nên khi đó kết quả nhân 2 vượt quá phạm vi nên báo lỗi, đều này là do bộ biên dịch VB đã dùng ô nhớ chỉ dành cho INTEGER để tính toán nên dẫn đến việc tràn bộ nhớ là đương nhiên thôi

Do đó, dù không có biến như a nói, nhưng máy tính vẫn cần dành ô nhớ cho quá trình tính toán: 20000 * 2 ---> vì thấy 20000 nằm trong phạm vi số INTEGER nên VB bộ biên dịch đã dành ô nhớ INTEGER đó.. đến khi tính toán thì lại bị tràn, thế thôi)
 
Lần chỉnh sửa cuối:
Upvote 0
vì sao thế
Phạm vi của biến INTEGER là -32768 đến 32767 nên xuất hiện lỗi đó, nên khi đó kết quả nhân 2 vượt quá phạm vi nên báo lỗi, đều này là do bộ biên dịch VB đã dùng ô nhớ chỉ dành cho INTEGER để tính toán nên dẫn đến việc tràn bộ nhớ là đương nhiên thôi

Do đó, dù không có biến như a nói, nhưng máy tính vẫn cần dành ô nhớ cho quá trình tính toán: 20000 * 2 ---> vì thấy 20000 nằm trong phạm vi số INTEGER nên VB bộ biên dịch đã dành ô nhớ INTEGER đó.. đến khi tính toán thì lại bị tràn, thế thôi)
Nghe cũng có vẻ có lý!
Nhưng nói thật, vụ này mới nghe lần đầu tiên đấy!
Hic...
 
Upvote 0
Cảm ơn bạn hoamattroicoi, vấn đề với tôi cần ngoài việc Code chạy được tôi rất muốn biết tại sao Code tôi viết lại sai, ai biết xin chỉ dùm cho tôi với
PHP:
Sub tt()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
            Arr(j, 1) = Month(Vung(i))
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub
 
Upvote 0
Cảm ơn bạn hoamattroicoi, vấn đề với tôi cần ngoài việc Code chạy được tôi rất muốn biết tại sao Code tôi viết lại sai, ai biết xin chỉ dùm cho tôi với
PHP:
Sub tt()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A5:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
        For i = 1 To UBound(Vung, 1)
            j = j + 1
****        Arr(j, 1) = Month(Vung(i))
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub
Bạn sửa lại dòng **** bên trên thành
PHP:
****   Arr(j, 1) = Month(Vung(i, 1))
Trong Code của bạn mảng <Vung> địa chỉ chưa rõ, nếu đang ở sheet <> sheet1 mà chạy code thì ... "trớt quớt".
 
Lần chỉnh sửa cuối:
Upvote 0
Như thế này mới khỏi lỗi
PHP:
Sub tt()
    Dim Vung(), Arr(), i As Long, j As Long
    Vung = [A1:A13].Value
    ReDim Arr(1 To UBound(Vung, 1), 1 To 1)
    With Sheet1
    Vung = .[A1:A13].Value
        For i = 1 To UBound(Vung, 1)
            If Vung(i, 1) <> "" Then
            j = j + 1
            Arr(j, 1) = Month(Vung(i, 1))
            End If
        Next
    End With
    Sheet2.[A1].Resize(j).Value = Arr
End Sub

With trong Code của bạn đang "thất nghiệp", chẳng có tác dụng gì
 
Upvote 0
Nhờ sửa lỗi Code dùm

Không hiểu sao cứ rời bài tập mẫu do các thày trên mạng ra, những bài tôi tự viết nhiều bài gặp lỗi

PHP:
Sub tt()
    Dim Rng As Range, Arr As Range, i As Long, j As Long
    Set Rng = Range("A1:A6")
    Set Arr = Range("B1:B6")
    For i = 1 To Rng.Count
        j = j + 1
        Arr(j).Formula = "=Rng(" & i & ").Address(0,0)*1000"
    Next
End Sub

Xin nhờ mọi người sửa giúp, xin chỉ giúp tôi sai kiến thức ở điểm nào.
Trân trọng cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không hiểu sao cứ rời bài tập mẫu do các thày trên mạng ra, những bài tôi tự viết nhiều bài gặp lỗi
VBA cũng là 1 ngôn ngữ như những ngôn ngữ khác;
Vậy bạn hãy dịch sang tiếng Việt các câu lệnh của bạn xem sao? (Hay bạn hãy nói xem, bạn muốn macro của bạn làm cho bạn điều gì?
 
Upvote 0
Ý tôi là muốn cột B = cột A *1000 thày ah, tôi sửa
PHP:
Arr(j).Formula = "=Rng(" & i & ").Address(0,0)*1000"

thành

PHP:
Arr(j).Formula = "=RC[-1]*1000"
thì nó chạy ổn

Nhưng tôi thắc mắc là tại sao viết như cách trên nó lại không được.
 
Upvote 0
Ý tôi là muốn cột B = cột A *1000 thày ah, tôi sửa
PHP:
Arr(j).Formula = "=Rng(" & i & ").Address(0,0)*1000"

thành

PHP:
Arr(j).Formula = "=RC[-1]*1000"
thì nó chạy ổn

Nhưng tôi thắc mắc là tại sao viết như cách trên nó lại không được.
Phần tử mãng không có thuộc tính nên bạn chỉ sử dụng
PHP:
Arr(j) = "=RC[-1]*1000"
 
Upvote 0
(/ậy bạn thử nghiệm với macro sinh đôi với nó như vầy xem sao:
PHP:
Sub GPE()
    Dim Rng As Range, Arr As Range, i As Long, j As Long
    
    Set Rng = Range("A1:A6"):       Set Arr = Range("B1:B6")
    For i = 1 To Rng.Count
        j = j + 1
        MsgBox Rng(i).Address(0, 0)
'        Arr(j).Formula = "=Rng(" & i & ").Address(0,0)*1000"'
    Next
End Sub
 
Upvote 0
To Viehoai: Code tôi viết là Range đấy chứ có phải mảng đâu, bác xem lại dùm.

To ChanhTQ@: Code của thày viết nó hiện ra địa chỉ Msgbox, thế tại sao Code của tôi không chạy? Phiền thày chỉ ra chỗ sai dùm.
 
Upvote 0
Không hiểu sao cứ rời bài tập mẫu do các thày trên mạng ra, những bài tôi tự viết nhiều bài gặp lỗi

PHP:
Sub tt()
    Dim Rng As Range, Arr As Range, i As Long, j As Long
    Set Rng = Range("A1:A6")
    Set Arr = Range("B1:B6")
    For i = 1 To Rng.Count
        j = j + 1
        Arr(j).Formula = "=Rng(" & i & ").Address(0,0)*1000"
    Next
End Sub

Xin nhờ mọi người sửa giúp, xin chỉ giúp tôi sai kiến thức ở điểm nào.
Trân trọng cảm ơn
Vầy mới đúng đồng chí ơi:
Arr(j).Formula = "=" & Rng(i).Address(0, 0) & "*1000"
 
Upvote 0
Thành phần Rng(i).Address(0, 0) nó là chuỗi cơ mà
Trong đó chỉ có Rng và i là biến thôi, tại sao cả cụm đó không chịu sự quản lý của " " ?

Đáng lý ra phải là thế này chứ nhỉ:

PHP:
 Arr(j).Formula = "="& Rng & "(" & i").Address(0, 0) *1000"

Chỗ này tôi hay hiểu sai nhất, xin thày chỉ giúp
 
Upvote 0
Thành phần Rng(i).Address(0, 0) nó là chuỗi cơ mà
Trong đó chỉ có Rng và i là biến thôi, tại sao cả cụm đó không chịu sự quản lý của " " ?

Đáng lý ra phải là thế này chứ nhỉ:

PHP:
 Arr(j).Formula = "="& Rng & "(" & i").Address(0, 0) *1000"

Chỗ này tôi hay hiểu sai nhất, xin thày chỉ giúp
Ráp từ từ vào nhé:
- Khi i = 1 thì Rng(i).Address(0,0) = "A1"
- Thay vào đoạn "=" & Rng(i).Address(0, 0) & "*1000" có phải sẽ thành "=" & "A1" & "*1000" hay không?
- Kết quả cuối cùng có phải là "=A1*1000" hay không?
- Chuổi này nếu cho vào cell B1, tự nhiên nó trở thành công thức thôi
Quá đơn giản như... đang giởn
Ẹc... Ẹc...
 
Upvote 0
Option Explicit
Dim endR&, fD&, eD&, i&, s&, k&
Dim sTK$, sMaKH$
Dim SoDu As Double
Dim Arr(), ArrKQ()
Const cNg = 2: Const cTkNo = 6: Const cTkCo = 7: Const cST = 8: Const cMaKH = 9
Sub TaoSoCT()
With Sheets("NKC")
.AutoFilterMode = False
endR = .Cells(65000, 1).End(3).Row
Arr = .Range("A9:I" & endR).Value
End With

With Sheets("SoCT")
.Rows("11:200").EntireRow.Hidden = False
.Range("A11:G200").ClearContents
.[F8] = 0: .[G8] = 0
'CLng la cau lenh chuyen doi du lieu sang kieu nguyen
fD = CLng(.[I4]): eD = CLng(.[I5])
sTK = CStr(.[D4]): sMaKH = CStr(.[D5])
End With

s = 0: SoDu = 0
ReDim ArrKQ(1 To 200, 1 To 7)
For i = 1 To UBound(Arr)
If Arr(i, cMaKH) = sMaKH Then
If CStr(Arr(i, cTkNo)) = sTK Or CStr(Arr(i, cTkCo)) = sTK Then
If CLng(Arr(i, cNg)) <= eD Then
Select Case fD
Case Is > CLng(Arr(i, cNg)) 'Sodu
Select Case sTK
Case Is = CStr(Arr(i, cTkNo))
SoDu = SoDu + Arr(i, cST)
Case Is = CStr(Arr(i, cTkCo))
SoDu = SoDu - Arr(i, cST)
End Select
Case Is <= CLng(Arr(i, cNg)) 'PS
s = s + 1
For k = 1 To 4
ArrKQ(s, k) = Arr(i, k + 1)
Next k
Select Case sTK
Case Is = CStr(Arr(i, cTkNo)) 'PSNo
ArrKQ(s, 5) = Arr(i, cTkCo)
ArrKQ(s, 6) = Arr(i, cST) 'ST PS No
Case Is = CStr(Arr(i, cTkCo)) 'PSCo
ArrKQ(s, 5) = Arr(i, cTkNo)
ArrKQ(s, 7) = Arr(i, cST) 'STPS Co
End Select
End Select
End If
End If
End If
Next i
If s = 0 Then
MsgBox "Kg co"
GoTo Exit_Sub
End If
With Sheets("SoCT")
.Rows(s + 12 & ":200").EntireRow.Hidden = True
If SoDu > 0 Then
.[F8] = SoDu: .[G8] = 0
Else
.[G8] = -SoDu: .[F8] = 0
End If
'.Range("A11:G200").ClearContents
.[A11].Resize(s, 7) = ArrKQ
End With
Exit_Sub:
Erase Arr(), ArrKQ()
End Sub
1. Const cNg = 2: Const cTkNo = 6: Const cTkCo = 7: Const cST = 8: Const cMaKH = 9 - tại sao cái này có có nhiều giá trị 2,6,7 mình xem tài liệu nhưng chưa hiểu lắm
2. If Arr(i, cMaKH) = sMaKH Then câu lệnh này mình chưa hiểu các bạn giải đáp giúp
3. Mình chưa hiểu cái này Arr(i, cTkNo) ; (Arr(i, cNg))
If CStr(Arr(i, cTkNo)) = sTK Or CStr(Arr(i, cTkCo)) = sTK Then
If CLng(Arr(i, cNg)) <= eD Then
Select Case fD
Case Is > CLng(Arr(i, cNg)) 'Sodu
Select Case sTK
Case Is = CStr(Arr(i, cTkNo))
SoDu = SoDu + Arr(i, cST)
Case Is = CStr(Arr(i, cTkCo))
SoDu = SoDu - Arr(i, cST)
End Select
Minh moi tap xem cac cau lenh vba nen nhieu cho khong hieu co gi cac ban giup minh
 
Upvote 0
Nhờ thích code trong file excell?

mình không thể chạy được code macro mà mình đã lập trình! mình đã suy nghi mãi mà không thể hiểu ra. Có một người bạn cho mình code này, mình sử dụng code này cho file excel của mình thì lại không chạy được? rất mong mọi người giúp đỡ. Mục tiêu của mình là: mình muốn lọc tự động dữ liệu, với mỗi phần tử frame có 5 mặt cắt; mình muón lọc ra 3 vị trí: đầu + giữa + cuối. và tự động xóa dữ liệu. HÃY GIẢI THÍCH CODE ĐÓ GIÚP MÌNH VÀ SỬ DỤNG NÓ NTN???
 

File đính kèm

Upvote 0
Nhờ giải thích code trong file excell?

mình không thể chạy được code macro mà mình đã lập trình! mình đã suy nghi mãi mà không thể hiểu ra. Có một người bạn cho mình code này, mình sử dụng code này cho file excel của mình thì lại không chạy được? rất mong mọi người giúp đỡ. Mục tiêu của mình là: mình muốn lọc tự động dữ liệu, với mỗi phần tử frame có 5 mặt cắt; mình muón lọc ra 3 vị trí: đầu + giữa + cuối. và tự động xóa dữ liệu. HÃY GIẢI THÍCH CODE ĐÓ GIÚP MÌNH VÀ SỬ DỤNG NÓ NTN???
 

File đính kèm

Upvote 0
mình không thể chạy được code macro mà mình đã lập trình! mình đã suy nghi mãi mà không thể hiểu ra. Có một người bạn cho mình code này, mình sử dụng code này cho file excel của mình thì lại không chạy được? rất mong mọi người giúp đỡ. Mục tiêu của mình là: mình muốn lọc tự động dữ liệu, với mỗi phần tử frame có 5 mặt cắt; mình muón lọc ra 3 vị trí: đầu + giữa + cuối. và tự động xóa dữ liệu. HÃY GIẢI THÍCH CODE ĐÓ GIÚP MÌNH VÀ SỬ DỤNG NÓ NTN???
Chưa mở file cũng biết chắc file của bạn chẳng có tí code nào cả, lấy gì mà test
Bạn muốn dùng code trên Excel 2007 thì phải lưu nó dưới định dạng xlsm ---> Nếu lưu bằng xlsx thì code sẽ tự động bị xóa sạch
 
Upvote 0
Nhờ giải thích code lọc dữ liệu???

Giúp e giải thích cái code này cái mọi người??? Dùng nó như thế nào mọi người? E mới nghiên cứu về lập trình nên không rành lắm.
Em muốn dùng code này để lọc dữ liệu và xóa dữ liệu như e đã nói rõ hồi nảy!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ mọi người giúp dùm mình vấn đề này được không. Số là công việc của mình cần copy thông tin từ Excel sang phần phần mềm quản lý công việc. Có nhiều cell lưu nhiều thông tin khác nhau. Và mình cứ phải copy và paste qua lại giữa Excel và phần mềm. Mình muốn làm nhanh. Mà mỗi lần muốn copy từ Excel thì phải db click, tô đen, Ctrl+c (hoặc F2, tô đen, Ctrl+c) mất nhiều bước.Công việc của mình cần làm nhanh. mình muốn trong file Excel của mình, khi mình clik vô cell nào thì tự động những nội dung trong cell sẽ được tô đen. Hoặc tốt hơn nữa là tự động copy nội dung trong cell đó luôn. Được không ạ? Mong mọi người giúp dùm mình nhé
 
Upvote 0
Giúp e giải thích cái code này cái mọi người??? Dùng nó như thế nào mọi người? E mới nghiên cứu về lập trình nên không rành lắm.
Em muốn dùng code này để lọc dữ liệu và xóa dữ liệu như e đã nói rõ hồi nảy!
Bạn lấy code ở đâu thì phải hiểu code nó làm cái gì chứ, sao lại hỏi người khác
Hay là hỏi ngược lại: Bạn muốn làm gì trên file này? Mô tả vấn đề rồi mọi người giúp bạn
(code của bạn tôi chẳng chạy được gì, bấm 1 phát treo máy luôn)
 
Upvote 0
Mình cũng đã nói rõ. Một người bạn cho mình để tìm hiểu.
Mục đích mình muốn là tự động lấy ra 3 giá trị: đầu + giữa + cuối ứng với mỗi loại ouputcase.
tức là mình muốn tạo một nút macro để lọc dữ liệu và một nút macro tự động xóa dữ liệu.
giống như file mình up lên. Nhưng khi mình dùng thi không dùng được. bị treo!
 
Upvote 0
Mình cũng đã nói rõ. Một người bạn cho mình để tìm hiểu.
Mục đích mình muốn là tự động lấy ra 3 giá trị: đầu + giữa + cuối ứng với mỗi loại ouputcase.
tức là mình muốn tạo một nút macro để lọc dữ liệu và một nút macro tự động xóa dữ liệu.
giống như file mình up lên. Nhưng khi mình dùng thi không dùng được. bị treo!
Tạm thời, bạn nên.....quên cái code trong bài của bạn đi
Bi giờ, vói dữ liệu trong bài, bạn muốn làm gì với nó, công dụng của 2 cái nút là gì ?
tự động lấy ra 3 giá trị: đầu + giữa + cuối ứng với mỗi loại ouputcase.
3 giá trị lấy ở cột nào, kết quả ra sao, kết quả đặt ở đâu ( bạn tạo nháp bảng kết quả, giải thích kỹ kỹ tý tẹo)
Nếu hiểu được đề bài thì sẽ nhanh có câu trả lời thôi
Thân
 
Upvote 0
Á ngộ! Tưởng một mình mình bị treo....
Híc!
 
Upvote 0
Nhờ mọi người giúp dùm mình vấn đề này được không. Số là công việc của mình cần copy thông tin từ Excel sang phần phần mềm quản lý công việc. Có nhiều cell lưu nhiều thông tin khác nhau. Và mình cứ phải copy và paste qua lại giữa Excel và phần mềm. Mình muốn làm nhanh. Mà mỗi lần muốn copy từ Excel thì phải db click, tô đen, Ctrl+c (hoặc F2, tô đen, Ctrl+c) mất nhiều bước.Công việc của mình cần làm nhanh. mình muốn trong file Excel của mình, khi mình clik vô cell nào thì tự động những nội dung trong cell sẽ được tô đen. Hoặc tốt hơn nữa là tự động copy nội dung trong cell đó luôn. Được không ạ? Mong mọi người giúp dùm mình nhé

Có bạn nào giúp mình vụ này với
 
Upvote 0
Nhờ mọi người giúp dùm mình vấn đề này được không. Số là công việc của mình cần copy thông tin từ Excel sang phần phần mềm quản lý công việc. Có nhiều cell lưu nhiều thông tin khác nhau. Và mình cứ phải copy và paste qua lại giữa Excel và phần mềm. Mình muốn làm nhanh. Mà mỗi lần muốn copy từ Excel thì phải db click, tô đen, Ctrl+c (hoặc F2, tô đen, Ctrl+c) mất nhiều bước.Công việc của mình cần làm nhanh. mình muốn trong file Excel của mình, khi mình clik vô cell nào thì tự động những nội dung trong cell sẽ được tô đen. Hoặc tốt hơn nữa là tự động copy nội dung trong cell đó luôn. Được không ạ? Mong mọi người giúp dùm mình nhé
Bạn dùng code này thử xem:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Dim MyData As DataObject
Set MyData = New DataObject
MyData.SetText ActiveCell.Value
MyData.PutInClipboard
End Sub
 
Upvote 0
PHP:
Public Function DK() As Boolean
  If (TxtA <= 0 Or TxtB > 100) Or (TxtB <= 0 Or TxtB > 100) Or (TxtC <= 0 Or TxtC > 100) Then 
    MsgBox "Mot trong cac gia tri chi nam trong khoang 0-100", vbApplicationModal
    TxtA = 0: TxtB = 0: TxtC = 0
    Dieukien = False
Else
    Dieukien = True
End If
End Function


PHP:
Private Sub CmbTH_Click()
If DK() = False Then
    Exit Sub
End if
.........


Trong đây
TxtA,TxtB,TxtC là tên textbox.


Nhờ anh, chị kiểm tra giúp xem trong đoạn code trên bị lỗi gì, mà khi em nhập dữ liệu vào txtA, dù không nằm trong khoảng rằng buộc từ 0--->100 Cũng xuất hiện Msgbox báo lỗi.
 
Upvote 0
PHP:
Public Function DK() As Boolean
  If (TxtA <= 0 Or TxtB > 100) Or (TxtB <= 0 Or TxtB > 100) Or (TxtC <= 0 Or TxtC > 100) Then 
    MsgBox "Mot trong cac gia tri chi nam trong khoang 0-100", vbApplicationModal
    TxtA = 0: TxtB = 0: TxtC = 0
    Dieukien = False
Else
    Dieukien = True
End If
End Function


PHP:
Private Sub CmbTH_Click()
If DK() = False Then
    Exit Sub
End if
.........


Trong đây
TxtA,TxtB,TxtC là tên textbox.


Nhờ anh, chị kiểm tra giúp xem trong đoạn code trên bị lỗi gì, mà khi em nhập dữ liệu vào txtA, dù không nằm trong khoảng rằng buộc từ 0--->100 Cũng xuất hiện Msgbox báo lỗi.

Vậy chính xác là bạn muốn gì? "Nằm trong khoảng thì báo lỗi" hay "KHÔNG nằm trong khoảng thì báo lỗi"?
Vì code ở trên là "KHÔNG nằm trong khoảng thì báo lỗi". Vậy khi bạn nhập trong TxtA giá trị "không nằm trong khoảng rằng buộc từ 0--->100" thì nó báo lỗi là đúng rồi còn gì?
Câu hỏi của bạn không chính xác. Phải là: "Tại sao hàm DK luôn trả về FALSE cho dù nhập giá trị trong hay ngoài khoảng 0 -100?"
Bạn thử nghĩ xem, nếu bạn nhập giá trị "đúng" thì làm gì có MsgBox "nhẩy" ra mà bạn dùng từ "Cũng xuất hiện Msgbox báo lỗi"? MsgBox không luôn luôn nhẩy ra nhưng hàm DK luôn luôn trả về FALSE vì bạn có Dieukien = FALSE (TRUE), Hàm của bạn tên là DK cơ mà, chứ có tên là Dieukien đâu.
Sửa lại (txtA <= 0 Or txtB > 100) thành (txtA <= 0 Or txtA > 100)
và
Dieukien = False(TRUE) thành DK = False(TRUE) nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn dùng code này thử xem:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Dim MyData As DataObject
Set MyData = New DataObject
MyData.SetText ActiveCell.Value
MyData.PutInClipboard
End Sub
Bạn ơi mình đã thử code này rồi nhưng không được. Bạn kiểm tra lại giúp mình với
 
Upvote 0
Cho em hỏi Code của em sửa thế nào cho đúng

Em viết code sau (ý em là ô A5 của Sheet 2 = ô A1 của Sheet đang đứng)

PHP:
Sub tinh()
Sh As String
Sh = "='" & AtiveSheet.Name & "'!"
Sheet2.[A5] = Sh & "A1"
End Sub
thì code trên phải sửa thế nào ah?
 
Upvote 0
Em viết code sau (ý em là ô A5 của Sheet 2 = ô A1 của Sheet đang đứng)

PHP:
Sub tinh()
Sh As String
Sh = "='" & AtiveSheet.Name & "'!"
Sheet2.[A5] = Sh & "A1"
End Sub
thì code trên phải sửa thế nào ah?
Ít nhất là có thể sửa như vầy (chú ý chỗ màu đỏ):
Mã:
Sub tinh()
    [COLOR=#FF0000][B]Dim [/B][/COLOR]Sh As String
    Sh = "='" & A[COLOR=#FF0000][B]c[/B][/COLOR]tiveSheet.Name & "'!"
    Sheet2.[A5] = Sh & "A1"
End Sub
 
Upvote 0
Em chưa hiểu tại sao lại có hai dấu ' làm gì? Em đọc Code mẫu thấy có nhưng không hiểu

Sh = "='" & ActiveSheet.Name & "'!"
 
Upvote 0
Em viết code sau (ý em là ô A5 của Sheet 2 = ô A1 của Sheet đang đứng)

PHP:
Sub tinh()
Sh As String
Sh = "='" & AtiveSheet.Name & "'!"
Sheet2.[A5] = Sh & "A1"
End Sub
thì code trên phải sửa thế nào ah?
Thế sao bạn không ghi vầy cho khỏe

Mã:
Sheet2.Range("A5").Value = ActiveSheet.Range("A1").Value
Cần gỉ phải khai báo biến
Còn vụ dấu nháy này:
Em chưa hiểu tại sao lại có hai dấu ' làm gì? Em đọc Code mẫu thấy có nhưng không hiểu

Sh = "='" & ActiveSheet.Name & "'!"
Là vì phòng trường hợp tên sheet có khoảng trắng hoặc có ký tự số thì nó... phải vậy
Thí nghiệm:
- Sửa tên của ActiveSheet thành Dau Thi Van
- Tại Sheet2, cell A5, tạo công thức liên kết đến A1 của sheet Dau Thi Van
- Xong, xem tại công thức trên thanh Formula, sẽ thấy có dạng thế này ='Dau Thi Van'!A1 <--- Có dấu nháy 2 đầu
Kết luận: Trong mọi trường hợp, cứ thêm 2 dấu nháy đơn cho chắc
 
Lần chỉnh sửa cuối:
Upvote 0
Em chưa hiểu tại sao lại có hai dấu ' làm gì? Em đọc Code mẫu thấy có nhưng không hiểu

Sh = "='" & ActiveSheet.Name & "'!"
Có 2 dấu ' là để phòng trường hợp tên sheet có khoảng trắng hoặc có dấu tiếng Việt.
Bạn thử nghiệm: Tại ô A5 của Sheet2, bạn gõ =Sheet1!A1 (gõ dấu = và chọn ô A1 trên Sheet1). Bây giờ bạn đổi tên Sheet1 thành Giải pháp Excel rồi nhìn lại công thức tại ô A5 lúc nãy xem có gì thay đổi.
 
Upvote 0
Em có 1 file *.xlt trong file này có rất nhiều Sheet nhưng nó chỉ hiển thị 3 sheet, các sheet khác bị ẩn không biết cho nó hiện lên thế nào. Em vốn kiến thức kém, bác nào chỉ giáo cho em với.
File này chỉ tồn tại trên ID của từng máy 7 ngày, nếu không xác nhận thì nó tự xóa em nghĩ code của nó đây:
Private Sub Workbook_Open()
On Error Resume Next
TT1.Visible = xlSheetVeryHidden
TT2.Visible = xlSheetVeryHidden
TT3.Visible = xlSheetVeryHidden
TT4.Visible = xlSheetVeryHidden
TT5.Visible = xlSheetVeryHidden
TT6.Visible = xlSheetVeryHidden
TT7.Visible = xlSheetVeryHidden
S4.Visible = xlSheetVeryHidden
'Tao doi tuong dich vu WMI
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
'Tim cac CPU
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
'Lap hien thi ID cua tung CPU
For Each objItem In colItems
ID_CPU = objItem.ProcessorId
Next
'=====
If S4.Range("C2").Value = "" Then
S4.Range("C2").Value = ID_CPU
S4.Range("C3").Value = 10000
S4.Range("C4").Value = Date * 1
End If
'=====
S4.Range("C5").Value = ID_CPU

If S4.Range("C2").Value <> S4.Range("C5").Value Then
S4.Range("C3").Value = 3
End If
'=====
Songayhanche = S4.Range("C3").Value
Ngaybatdau = S4.Range("C4").Value
'=====
'Bat dau so sanh. Neu qua han thi xoa file *.xlt
Ngayhientai = Date * 1 'Ngay hien tai
Ngaysosanh = Val(Ngaybatdau) + Val(Songayhanche) 'Gioi han su dung
If Ngayhientai >= Ngaysosanh Then
Application.DisplayAlerts = False
ThisWorkbook.ChangeFileAccess xlReadOnly
Kill ThisWorkbook.FullName
ThisWorkbook.Close False
Else
S2.Range("C8").Select
End If


End Sub


Em không hiểu đoạn code này bác nào giải thích giúp em hoặc chỉ cho em cách thay đổi, nói thì dài dòng lắm nếu bác nào ở Hoàng Mai thì cho em lĩnh hội nhé.
Cảm ơn các bác trước.

Email: ngocanhwin@gmail.com
 
Upvote 0
Sao không có bác nào giúp em vậy?

Nếu muốn hiện hết sheet lên, rất dễ, bạn đặt vào module và cho chạy code này:

PHP:
Sub HienSheet()
    Dim sh As Worksheet
    For Each sh In ActiveWorkbook.Worksheets
        sh.Visible = xlSheetVisible
    Next
End Sub
 
Upvote 0
Nếu muốn hiện hết sheet lên, rất dễ, bạn đặt vào module và cho chạy code này:

PHP:
Sub HienSheet()
    Dim sh As Worksheet
    For Each sh In ActiveWorkbook.Worksheets
        sh.Visible = xlSheetVisible
    Next
End Sub

Cảm ơn bác nhưng còn cái đoạn code trên của em thì làm thế nào đê không bị check thời gian nữa vậy? Bác giúp em luôn nhé
 
Upvote 0
Nhờ các anh chị giup đỡ viết đoạn code trong bảng tính Excel có định hạn thời gian sử dụng là 30 ngày. Mục đích là để nếu bảng tính đó bị thất lạc thì trong hạn 30 ngày kể từ khi đặt định hạn hoặc từ khi kích hoạt sẽ tự lỗi(ko sử dụng được) mà không phải đặt mật khẩu khi mở. hay nói cách khác là cho dùng thử. Trân trọng cảm ơn
 
Upvote 0
Nhờ anh em giải thích code trong VBA này giùm với

Nhờ anh em giải thích code trong VBA này giùm với.
Cảm ơn trước nhiều nha.
 

File đính kèm

Upvote 0
Mã:
[AB12].CurrentRegion.Offset(1).Copy Destination:=Sh.[B9]
Thầy cô & anh chị cho em hỏi:
1/Thông thường thuộc tính Offset có 2 đối số, sao ở trên có 1 đối số
2/ Có thể giải thích cho em đọan code trên.
Em cảm ơn.
 
Upvote 0
1. Đối số thứ 2 (dời theo column) được phép bỏ qua, nghĩa là không dời (tương đương với: Offset(1, 0))
2. Giải thích: Bắt đầu tại ô AB12 của sheet hiện thời, xác định (tự động) vùng liên tục (bao quanh bởi các cột, dòng trống) có chứa ô AB12, sau đó dời xuống 1 dòng để thực hiện lệnh Copy đồng thời Paste dữ liệu vào vị trí ô B9 của sheet Sh.
 
Upvote 0
Cho em hỏi thêm Resize(1) thì tương đương Resize(1,0) ???
Em cảm ơn!
 
Upvote 0
Cho em hỏi thêm Resize(1) thì tương đương Resize(1,0) ???
Em cảm ơn!

Cả 2 đối số của Offset và Resize, đối số nào cũng được phép bỏ qua
- Offset(lR) ---> Dịch chuyển lR dòng, không dịch chuyển cột
- Offset(, lC) ---> Dịch chuyển lC cột, không dịch chuyển dòng
- Resize(lR) ---> Thay đổi số dòng thành lR dòng, không thay đổi số cột
- Resize(, lC) ---> Thay đổi số cột thành lC cột, không thay đổi số dòng
vậy thôi
Mấy cái này đúng ra khỏi cần hỏi, cứ thí nghiệm cái sẽ biết ngay
 
Upvote 0
Chào các bạn! Mình có chút vấn đề về VBA mong các bạn giúp đỡ:
Mình tạo 1 userform, muốn khi mở file excel đó, nó chỉ hiện ra form mà không cho hiện file excel (Tức là chỉ hiện lên form nhập số liệu mà không hiện excel) khi tắt form thì file excel đó cũng tắt. Bổ sung thêm nút quay về excel (thoát từ form về excel)
Người nhập số liệu vào chỉ nhìn thầy Form thôi. Muốn vào xem bảng phải bấm vào nút "quay về excel"

Cảm ơn các bạn!
 
Upvote 0
Chào các bạn! Mình có chút vấn đề về VBA mong các bạn giúp đỡ:
Mình tạo 1 userform, muốn khi mở file excel đó, nó chỉ hiện ra form mà không cho hiện file excel (Tức là chỉ hiện lên form nhập số liệu mà không hiện excel) khi tắt form thì file excel đó cũng tắt. Bổ sung thêm nút quay về excel (thoát từ form về excel)
Người nhập số liệu vào chỉ nhìn thầy Form thôi. Muốn vào xem bảng phải bấm vào nút "quay về excel"

Cảm ơn các bạn!

Bạn muốn ẩn hiện excel ở đằng sau form thì bạn dùng thuộc tính Visible của Application. Tức là sử dụng Application.Visible=True hoặc False nếu muốn hiện/ẩn. Nhưng lưu ý rằng nếu ẩn rồi thì nhớ cho nó hiện lại ở phút cuối (tức là trước lúc thoát hoàn toàn), nếu không thì bạn tắt form nhưng thực sự là Excel vẫn chưa tắt và nó cứ nằm lỳ trong Window của bạn đấy
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom