Chập chững bước vào VBA

  • Thread starter Thread starter ZzNHCzZ
  • Ngày gửi Ngày gửi
Liên hệ QC

ZzNHCzZ

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
8/5/08
Bài viết
166
Được thích
44
Nghề nghiệp
Hàng Không
Em có bài toán nhỏ muốn hỏi mọi người viết VBA thì làm như thế nào:
Em có 3 cột: A,B,C
C = A*B
Bây giờ em muốn thêm dữ liệu vào 2 cột A,B thì cột C sẽ có Kết Quả.
Vì không nắm rõ cấu trúc vòng lặp nên làm bị sai.
Mong anh chị hướng dẩn giúp em.

Thân!
 
Dùng code này xem (khỏi cần công thức A*B luôn)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("A2:B1000"), Target) Is Nothing Then
      Cells(Target.Row, 3) = Cells(Target.Row, 1) * Cells(Target.Row, 2)
   End If
End Sub
 
Upvote 0
Xài cái ni sẽ lẹ hơn tẹo:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("B2:B1000"), Target) Is Nothing Then
       With Target
                  .Offset(, 1) = .Offset(, -1) * .Value
       End With
   End If
End Sub

Vui thôi, Với 1 record thì nhanh chậm không là cái đinh gì!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("B2:B1000"), Target) Is Nothing Then
       With Target
                  .Offset(, 1) = .Offset(, -1) * .Value
       End With
   End If
End Sub
Vui thôi, Với 1 record thì nhanh chậm không là cái đinh gì!
Có lý à nha!
Đàng nào thì nếu cột B hoặc A không nhập gì thì khỏi cần ra kết quả
Cảm ơn sư phụ!
 
Upvote 0
Các Huynh ơi
Not Intersect phải dịch như thế nào?
Có phải là nếu Range ko bị rỗng???

with target
.Offset(, 1) = .Offset(, -1) * .Value
Có phải là ở trên do ta viết with target nên đoạn code dưới ta ko cần viết
.offset(,1) = .offset(,-1)*target.value

Tks
 
Lần chỉnh sửa cuối:
Upvote 0
Các Huynh ơi
Not Intersect phải dịch như thế nào?
Có phải là nếu Range ko bị rỗng???

Tks
Diển nôm câu lệnh Intersect ở trên:
"Nếu cell mà ta đang gỏ không nằm trong vùng B2:B1000 thì khỏi làm gì cả, bằng ngược lại thì làm... cái code phía dưới"
Bạn chỉ việc thuộc lòng code này, sau đó áp dụng vào file của mình, thế Range cho phù hợp là ăn tiền!
Code này chuyên dùng để giới hạn vùng hoạt động của code (nếu không cứ gõ vào ở đâu đó nó cũng chạy thì mệt)
Có phải là ở trên do ta viết with target nên đoạn code dưới ta ko cần viết
.offset(,1) = .offset(,-1)*target.value
With giống như bạn đặt thừa số chung vậy!
With Target
.Offset(,1) = .Offset(,-1)*.Value

Tương đương với:
Target.Offset(,1) = Target.Offset(,-1)*Target.Value
3 cái đều có chử "Target", lấy ra làm "thừa số chung"
Nôm na là thế
 
Lần chỉnh sửa cuối:
Upvote 0
Các Huynh ơi
Not Intersect phải dịch như thế nào?
Có phải là nếu Range ko bị rỗng???

INTERSECT có thể dịch là phần giao nhau/phép giao.

Intersect(Range("B2:B1000"), Target)
là phần giao/phép giao giữa vùng B2:B1000 và ô Target

Intersect(Range("B2:B1000"), Target) Is Nothing
là không có gì trong phép giao/phần giao giữa vùng B2:B1000 và ô Target ---> diễn giải cách khác là ô Target không nằm trong vùng B2:B1000

Not Intersect(Range("B2:B1000"), Target) Is Nothing
là phủ định lại Intersect(Range("B2:B1000"), Target) Is Nothing
nghĩa là ô Target nằm trong vùng B2:B1000

Vậy:
If Not Intersect(Range("B2:B1000"), Target) Is Nothing Then
Diễn giải là: Nếu ô Target nằm trong vùng B2:B1000 thì thực hiện....(lệnh gì đó tiếp theo)

Nếu bạn muốn hiểu rõ hơn về INTERSECT thỉ nhìn vào chữ ký của bác SA_DQ nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Thế nếu thay đổi trên cột A thì nó kg that đổi gì phải kg các bạn?
 
Upvote 0
Viết VBA

Xin chào GPE!
Em có bài toán nhỏ muốn viết bằng VBA, nhờ anh chị cho em xin đoạn Code.
Bài này em đã làm công thức đươc rồi, nhưng muốn biết VBA sẽ viết như thế nào.

Nếu là Y thì lấy thông tin sang KQ và Sum lại.

Em cám ơn ạ!

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào GPE!
Em có bài toán nhỏ muốn viết bằng VBA, nhờ anh chị cho em xin đoạn Code.
Bài này em đã làm công thức đươc rồi, nhưng muốn biết VBA sẽ viết như thế nào.

Nếu là Y thì lấy thông tin sang KQ và Sum lại.

Em cám ơn ạ!

Thân!
Nhìn sơ bộ yêu cầu thì tôi nghĩ ngay sẽ dùng Advanced Filter để làm việc này!
Bạn thử xem
 
Upvote 0
Nhìn sơ bộ yêu cầu thì tôi nghĩ ngay sẽ dùng Advanced Filter để làm việc này!

Em đã nói là đã làm được với công thức và các cách khác.
Nhưng muốn biết nếu là VBA thì sẽ viết như thế nào? Em viết mà ko chạy
Em đang tự học VBA, nhờ các anh viết để em tham khảo.

Chân thành cám ơn
Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã nói là đã làm được với công thức và các cách khác.
Nhưng muốn biết nếu là VBA thì sẽ viết như thế nào? Em viết mà ko chạy
Em đang tự học VBA, nhờ các anh viết để em tham khảo.

Chân thành cám ơn
Thân!
Thì tôi đang nói VBA đấy chứ, nhưng dựa trên cơ sở của AF... tức là bạn record macro quá trình lọc bằng Advanced Filter, sau đó chỉnh lại code cho phù hợp
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Đầu tiên tôi record macro và được kết quả:
PHP:
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 08/08/2008 by ndu
'

'
    Sheet2.Range("C1:H7").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheet2.Range("J1:J2"), CopyToRange:=Sheet1.Range("A4"), _
        Unique:=False
End Sub
Tôi bắt đầu sửa lại như sau:
PHP:
Option Explicit
Sub Loc()
  Dim DS As Range, DK As Range
  Set DS = Sheet2.[C1].CurrentRegion                'Định nghĩa vùng dử liệu
  Set DK = Sheet2.[J1:J2]                                'Định nghĩa vùng điều kiện
  Sheet1.Range("A4:D10000").ClearContents        'Xóa vùng lọc lần trước
  DS.AdvancedFilter Action:=2, CriteriaRange:=DK, CopyToRange:=Sheet1.Range("A4")
  Columns("E:F").Clear        'Xóa 2 cột E và F
  Er = Sheet1.[A65536].End(xlUp).Row + 1
  With Sheet1.Cells(Er, 1)    'Tạo cell TONG CONG bên dưới bảng tính
    .Resize(1, 3).Merge
    .Value = "TONG CONG"
    .Offset(, 1) = Application.WorksheetFunction.Sum(Range("D4:D" & Er - 1))
  End With
End Sub
Đại khái như thế... Bạn có thể "chế tạo" thêm gì đó tùy thích
 

File đính kèm

Upvote 0
Dùng code này xem (khỏi cần công thức A*B luôn)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("A2:B1000"), Target) Is Nothing Then
      Cells(Target.Row, 3) = Cells(Target.Row, 1) * Cells(Target.Row, 2)
   End If
End Sub


Mình coppy doạn code trên dán vào ThisWorkbook nhưng khi nhập số liệu vào cột A và cột B thì cột C chẳng thấy gì cả?
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("B2:B1000"), Target) Is Nothing Then
       With Target
                  .Offset(, 1) = .Offset(, -1) * .Value
       End With
   End If
End Sub
Vui thôi, Với 1 record thì nhanh chậm không là cái đinh gì!


Mình coppy doạn code trên dán vào ThisWorkbook nhưng khi nhập số liệu vào cột A và cột B thì cột C cũng chẳng thấy gì cả?
 
Lần chỉnh sửa cuối:
Upvote 0
Mình coppy doạn code trên dán vào ThisWorkbook nhưng khi nhập số liệu vào cột A và cột B thì cột C cũng chẳng thấy gì cả?

Đoạn code trên không phải dán vào ThisWorkbook, mà bạn phải dán vào sheet nào cần code này hoạt động ấy.
 
Upvote 0
Đoạn code trên không phải dán vào ThisWorkbook, mà bạn phải dán vào sheet nào cần code này hoạt động ấy.

Trước khi hỏi mình cũng đã dán vào Sheet nhưng lỗi là tại mình Paste số liệu vào cột B nên không được, bây giờ mới phát hiện nếu gõ vào thì được vậy làm thế nào khi Paste Values vào cột B mà vẫn có kết quả. Bạn có thể gửi cho mình File mẫu được không ? mình đang rất cần để áp dụng vào công việc. Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Trước khi hỏi mình cũng đã dán vào Sheet nhưng lỗi là tại mình Paste số liệu vào cột B nên không được, bây giờ mới phát hiện nếu gõ vào thì được vậy làm thế nào khi Paste Values vào cột B mà vẫn có kết quả. Bạn có thể gửi cho mình File mẫu được không ? mình đang rất cần để áp dụng vào công việc. Thanks!

Bạn xem lại. Vì đoạn code trên :
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("B2:B1000"), Target) Is Nothing Then
       With Target
                  .Offset(, 1) = .Offset(, -1) * .Value
       End With
   End If
End Sub
Đoạn này xử lý sự kiện Worksheet_Change, nên bạn có paste kiểu gì thì code vẫn chạy tốt.

Xin lưu ý thêm, vì sự kiện Worksheet_Change này giới hạn vùng từ B2:B1000, nếu bạn gõ dữ liệu vào ô B1 hay B1001 thì cũng không có tác dụng gì. Muốn vậy bạn phải nới rộng vùng giới hạn, tùy theo dữ liệu của bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom