Xin giúp tôi làm quen với VBA trên Ecxel

Liên hệ QC

in85gp

Thành viên mới
Tham gia
1/7/07
Bài viết
13
Được thích
3
Chào cả nhà
minh có một bảng tính (gửi kèm) ecxel
minh muốn hỏi một số vân đề
- viết code như thế nào để Tìm những ô báo lỗi #value ở cột E (vidụ E33, E36, E93, E94.....)ecxel tự động điền vào ô số "1" vơi điều kiện nhừng ô tương ứng ở cọt D giả trị băng "0" ( E33-D33, E93- D93....)
- Co thể viết code làm đươc việc như thế này không: nhưng ô ở cột D co giá trị value= #0 thi ở cột G them VÀO SAU DẤU GẠCH NGANG ở đầu gia tri o côt D (dươc bôi do) và dấu / tiếp theo là gia trị ô tương ứng ở cột F. Nhữg ô báo lỗi #value ơ cot E mà cột D co giá tri #0 thi bỏ qua
vi dụ ô D67
D
E
F
G
67
1
15
14
D135-1/14/1/12/1/4-0

- trong bang tinh mình co Macro CANHOI minh khong biet viêt nên dài quá .Có thể giúp minh viet cho ngắn lai không
thank all
 

File đính kèm

  • aaaaaaaa.rar
    229.7 KB · Đọc: 30
Bảng tinh trên ,imh chen nhưng không dưoc
đay la vi du o D67
ô D67 =1 ô E67 =15 ô F67=14 ô G67 = D135-1/12/1/4-0 sau khi chay macro o G67= D135-1/14/1/12/1/4-0
 
Upvote 0
Để làm quen với VBA, bạn cần thiết trang bị cho mình tính cẩn thận & chịu khó hơn!

/(/hư tiêu đề bài viết có vài từ không dấu là không nên.
(Nếu được, bạn sửa ngay đi!)

- viết code như thế nào để Tìm những ô báo lỗi #value ở cột E (vidụ E33, E36, E93, E94.....)ecxel tự động điền vào ô số "1" vơi điều kiện nhừng ô tương ứng ở cọt D giả trị băng "0" ( E33-D33, E93- D93....)

Bạn xem lại trong câu trích dẫn trên có bao nhiêu lỗi?
Mà bạn biết rồi đó: Trong khi viết VBA, 1 lỗi cũng đủ điên cái đầu cả tuần, thậm chí cả tháng trời í chứ.

Nói về file bạn đã đưa lên:
Trang tính đầu chả để làm chi cả, Tốn tài nguyên của bạn & của diễn đàn.
Trong file có cơ man nào là modules trống huơ trống hoát; Bạn cần bỏ chúng đi, trước khi đưa file lên DĐ


Giờ mình hướng dẫn bạn cách tự học macrô thông qua bộ ghi;

(*) Kích hoạt trang tính đang chứa dữ liệu;
Vô menu Tool -> Macro -> Record New Macro . . .
Trong ngăn Macro name bạn nhập vô cái tên tuỳ thích nào đó, như ErrorCells;
Sau đó lấy mũi chuột chọn toàn bộ vùng từ [E1:E18];
Vô menu Edit & chọn dòng Go to . . . . Ta bấm vô nút Special trong CS (cửa sổ) vừa hiện ra.
Trong ngăn Select ta bấm chọn Formulas; Trong danh sách vừa được kích hoạt ta bỏ chọn 3 dòng trên cùng. & bấm vô nút OK có ở đâu đó trên màn hình.
Đến đây ta stop ghi macro.

Ta vô CS VBE sẽ thấy 1 macro có nội dung chủ iếu sau:

PHP:
Sub ErrorCells()
' . . . . '
    Range("E1:E18").Select
    Selection.SpecialCells(xlCellTypeFormulas, 16).Select
End Sub

Bạn hãy dịch & cố mà hiểu được 2 câu lệnh này 1 cách lưu loát. Mình nói lưu loát, vì 1 khi đã lưu loát, rồi thì ta ó thể hiểu cặn kẻ con số 16 nói lên điều gì & hơn nữa, ta có thể thay con 16 này bằng bất kỳ con số khác mà ta không bị cự nự.

/(/hiệm vụ tiếp theo sẽ nặng nề hơn: Hiệu chỉnh macro theo í ta:
Ý ta sẽ là: Tìm & chọn toàn bộ các ô lỗi trong cột 'E', chứ không fải chỉ gần 20 ô như trên.

Để vậy, ta cần tìm ra ô cuối cùng của cột 'E' có dữ liệu. Sau khi tìm ra nó, ta sẽ có cách thay nó vô ô 'E18' nêu trên.

Để làm điều đó với dữ liệu không liên tục trong cột 'E' thì ta cần chọn cách mà sẽ fải làm bằng tay như sau:

Chọn ô cuối cùng của cột 'E' này; Giữ fím {CTRL} & bấm fím mũi tên lên.

Nếu ta thu macro động tác trên, ta sẽ có dòng lệnh sau:

Mã:
 [E65535].End(xlUp)

Để bổ sung câu lệnh này vô macro thương iêu của chúng ta, ta cần khai báo thêm 1 biến ở đầu chương trình & tìm cách hiểu nó như dưới đây:

PHP:
Sub ErrorCells()
 Dim Rws As Long
 
 Rws = [E65535].End(xlUp).Row
 Range("E1:E" & Rws).Select
 Selection.SpecialCells(xlCellTypeFormulas, 16).Select
 
 MsgBox Selection.Address
End Sub

Bạn gắng hiểu các câu lệnh của macro này & chúc sớm thành công!
 
Upvote 0
Cảm ơn bạn HYen17 đa trả lời và góp ý
- Mình đã sửa file va gửi lai
- Có thể yêu cầu của mình chưa rõ ý lắm. Mình xin trình bày lai như sau bạn đã giúp mình tìm những ô báo lỗi #value ở cột E. Bước tiếp theo minh minh muốn ghi số "1" vào những ô đo (ô báo lỗi #value ở cột E) vơi điều kiện những ô cùng dòng ở cột D co gia tri bàng "0"
cảm ơn cả nhà
To HYen17 bảng tính mình đang làm đèu chạy theo macro kich bản của ecxel. với những câu hỏi ở trong topic này la minh chưa biét viêt và phải làm thủ công. Mong cả nhà giúp đỡ để minh làm viêc đươc nhanh hơn và hoc đươc nhiều hơn VBA cho Ecxel
Thank all
 

File đính kèm

  • aaaaaaaa.rar
    218.5 KB · Đọc: 15
Upvote 0
PHP:
Option Explicit
Sub ErrorCells()
 Dim Rws As Long, Cls As Range
 
 Rws = [E65535].End(xlUp).Row
 Range("E1:E" & Rws).Select
 Selection.SpecialCells(xlCellTypeFormulas, 16).Select
 For Each Cls In Selection
    If Cls.Offset(, -1).Value = 0 Then
        Cls.Value = 1
    End If
 Next Cls
End Sub
 
Upvote 0
cảm ơn HYen17 và ChanhTQ@ minh kiểm tra trên bảng tính và kết qủa rất tôt
Mình còn vấn đề nữa muốn nhờ cad nhà giúp đỡ
- Trong bàng tinh kiểm tra cột D những ô giả trị value=#0 (số nguyên dương)
+ Nếu ô tương ứng ở cột F giá trị value = số nguyên dương thi ở cột G thêm sau ky tự thư năm (VÀO SAU DẤU GẠCH NGANG) số "1" và dấu / (số 1đươc bôi đỏ) tiếp theo là gia trị ô tương ứng ở cột F và dấu gạch chéo vi dụ ô D67:
ô D67 =1 ô ô F67=14 ô G67 = D135-1/12/1/4-0
sau khi chay macro o G67= D135-1/14/1/12/1/4-0

+ Nếu ô tương ứng ở cột F giá trị value = x (ký tự chữ x) thi ở cột G sau ky tự thứ 6 (ký tự tiếp theo dấu gach ngang ) được công thêm "1" và đươc bôi đỏ)
vi dụ ô D136:
ô D136 =1 ô F136=x ô G136 = C127-1/2/1/2/1/8/1/5/2/......./1/7-0
sau khi chay macro ô G136 = C127-2/2/1/2/1/8/1/5/2/......./1/7-0
cảm ơn cả nhà
 
Upvote 0
Bạn xem trong file kèm theo

PHP:
Option Explicit
Sub FindAndReplace()
 Dim Chu As String:                     Const GX As String = "/"
 Dim Rws As Long, VTr As Byte
 Dim Rng As Range, Cls As Range, RgS As Range, Rg0 As Range, RgN As Range
 Const GN As String = "-":              Const Mt As String = "1/"
 
 Rws = Cells.Find(What:="*", After:=[A1], _
    SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
 [d1].Resize(Rws).Interior.ColorIndex = 2
 Set Rng = Range("D1:D" & Rws).SpecialCells(xlCellTypeConstants, 1)
 Set Rg0 = Rng.Offset(, 2).SpecialCells(xlCellTypeConstants, 1)
 
 Set RgN = Rg0.Offset(, -2)
 RgN.Interior.ColorIndex = 38
 For Each Cls In RgN
    With Cls.Offset(, 3)
        Chu = Trim(Mid$(.Value, 6, 999))
        .Value = Left(.Value, 5) & Mt & Cls.Offset(, 2).Value & GX & Chu
        With .Characters(Start:=6, Length:=1).Font
            .ColorIndex = 3
        End With
    End With
 Next Cls
 Set Rg0 = Rng.Offset(, 2).SpecialCells(xlCellTypeConstants, 2)
 Set Rg0 = Rg0.Offset(, -2)
 Rg0.Interior.ColorIndex = 36
 For Each Cls In Rg0
    With Cls.Offset(, 3)
        VTr = InStr(.Value, GX)
        Chu = Trim(Mid$(.Value, VTr, 999))
        .Value = Left(.Value, 5) & _
            CStr(1 + CByte(Mid$(.Value, 6, VTr - 6))) & Chu
        With .Characters(Start:=6, Length:=VTr - 6).Font
            .ColorIndex = 5
        End With
    End With
 Next Cls
End Sub
 

File đính kèm

  • gpeThuThuat.rar
    186.9 KB · Đọc: 39
Upvote 0
thank to SA_DQ
Đoạn code của bạn làm đúng với yêu cầu của mình rùi . Nhưng nẩy sinh một vấn để là những o ở cột G sau khi đươc thêm gia trị mới thi phấn tô mầu đỏ cua các ký tự gốc ở phía sau bi bôi đen. Có các nào đê giữ nguyên phần tô mầu đỏ cua cac ký tự gôc trươc khi chay macro không . Nhờ cả nhà gíup mình nhé
thank all
 
Upvote 0
Thêm vài câu lệnh bổ sung này vô sẽ khả dĩ hơn xíu!

Nhưng nẩy sinh một vấn để là những o ở cột G sau khi đươc thêm gia trị mới thi phấn tô mầu đỏ cua các ký tự gốc ở phía sau bi bôi đen. Có các nào đê giữ nguyên phần tô mầu đỏ cua cac ký tự gôc trươc khi chay macro không . Nhờ cả nhà gíup mình nhé
thank all
PHP:
[php]Option Explicit
Sub FindAndReplace()
 Dim Chu As String:                     Const GX As String = "/"
 Dim Rws As Long, VTr As Byte
 Dim Rng As Range, Cls As Range, RgS As Range, Rg0 As Range, RgN As Range
 Const GN As String = "-":              Const Mt As String = "1/"
 
 Rws = Cells.Find(What:="*", After:=[A1], _
    SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
 [d1].Resize(Rws).Interior.ColorIndex = 2
 Set Rng = Range("D1:D" & Rws).SpecialCells(xlCellTypeConstants, 1)
 Set Rg0 = Rng.Offset(, 2).SpecialCells(xlCellTypeConstants, 1)
 
 Set RgN = Rg0.Offset(, -2)
 RgN.Interior.ColorIndex = 38
 For Each Cls In RgN
    With Cls.Offset(, 3)
        Chu = Trim(Mid$(.Value, 6, 999))
        .Value = Left(.Value, 5) & Mt & Cls.Offset(, 2).Value & GX & Chu
        With .Characters(Start:=6, Length:=1).Font
            .ColorIndex = 3
        End With
2        VTr = 6
        Do
            VTr = InStr(VTr + 1, Cls.Offset(, 3).Value, Mt)
            If VTr < 1 Then Exit Do
            With .Characters(Start:=VTr, Length:=1).Font
                .ColorIndex = 3
            End With
5        Loop
    End With
 Next Cls
 Set Rg0 = Rng.Offset(, 2).SpecialCells(xlCellTypeConstants, 2)
 Set Rg0 = Rg0.Offset(, -2)
 Rg0.Interior.ColorIndex = 36
 For Each Cls In Rg0
    With Cls.Offset(, 3)
        VTr = InStr(.Value, GX)
        Chu = Trim(Mid$(.Value, VTr, 999))
        .Value = Left(.Value, 5) & _
            CStr(1 + CByte(Mid$(.Value, 6, VTr - 6))) & Chu
        With .Characters(Start:=6, Length:=VTr - 6).Font
            .ColorIndex = 5
        End With
6        VTr = 6
        Do
            VTr = InStr(VTr + 1, Cls.Offset(, 3).Value, Mt)
            If VTr < 1 Then Exit Do
            With .Characters(Start:=VTr, Length:=1).Font
                .ColorIndex = 3
            End With
9        Loop
    End With
 Next Cls
 
Upvote 0
Mình sẽ giúp bạn ghi 1 macro & sửa nó lại, nhe

- Trong bảng tinh mình co Macro CANHOI minh không biet viêt nên dài quá .Có thể giúp minh viet cho ngắn lai không

Trước tiên bạn chép dữ liệu cột của trang tính sang cột 'F' của 1 trang trắng;
Bạn mở bộ thu macro lên (E2003) & thu lại các động tác sau của bạn:

(*) Chọn cột 'F' của trang tính; Vô menu Edit & chọn dòng Go to . . .
Tiếp: Ta bấm chọn nút Special . . . để hiện CS (cửa sổ) Goto này;
Trong CS đó bạn bấm chọn hàng Constants trong ngăn Select
Có 4 nút được kích hoạt, ta bỏ chọn đi 3 nút, chỉ để lại nút Numbers
Tiếp sau đó ta bấm vô nút 'OK' ở đâu đó trên CS.
Cuối cùng, bấm chọn ô E1, hay 1 ô bất kỳ trên cột 'E' này mà cùng dòng với nó ở cột 'F' có số liệu
Lên thanh công thức ta nhập =1 + F1 & {ENTER}

Bấm kết thúc bộ thu macro;
Sau khi vô CS VBE ta thấy macro có nội dung sau:

Mã:
Sub Macro1()
 
1 Columns("F:F").Select
 Selection.SpecialCells(xlCellTypeConstants, 1).Select
3 Range("E1").Select
 ActiveCell.FormulaR1C1 = "=1+RC[1]"
5 Range("E2").Select
 
End Sub

Macro chưa hoàn toàn làm theo đúng í ta & ta cần chỉnh sửa như sau:

(*) Khai thêm 1 biến kiểu loại Range để xài: Dim Rng As Range

(*) Gán toàn thể các ô cột 'F' có số liệu vô biến vừa khai báo

Set Rng = Columns("F:F").SpecialCells(xlCellTypeConstants, 1)
(Rút trích từ dòng lệnh 1 & 2 ở trên có bổ sung fép gán vô biến)
(*) Lập công thức cho toàn bộ vùng:

Rng.Offset(, -1).FormulaR1C1 = "=1+RC[1]"

(Trích từ dòng lệnh mang số 4)

Macro sau khi sửa lại có nội dung sau:

PHP:
Sub GPE()
  Dim Rng As Range '<=|'
  
  Set Rng = Columns("F:F").SpecialCells(xlCellTypeConstants, 1)
  Rng.Offset(, -1).FormulaR1C1 = "=1+RC[1]"

End Sub

(húc thành công!
 
Upvote 0
cảm ơn bạn ChanhTQ@
sau khi chay macro trong bảng tính
- những ô ở cột G sau khi đươc thêm gia trị mới tất cả các ký tự bằng "1"dều bi tô mầu đỏ . một
sso ký tự #1 đang là đỏ thì bi tô thành mầu đen vi dụ ô G71,G73.G134, G135, G136 .....
Tính chất dữ liệu ô ở cột G : sau mỗi dấu "/" cứ 1 lần đỏ sau đó là một lân tô đen tiếp theo lại là đỏ và đen đến hết.

Nhờ các bạn giúp để minh hoàn thành bước công việc này
thank allầu d
ên
 

File đính kèm

  • 24 2 aaaaaaaa.rar
    225.1 KB · Đọc: 5
Upvote 0
Hi cả nhà bài sử lýtô mầu này có vẻ phức tạp ,thôi mình đành lám thợ thủ công vậy. Cảm ơn HYen17, SA_QD, ChanhTQ@ đã giúp mình làm đươc các bươc công viêc mà trước đó mình nghĩ sẽ phải làm bằng tay vất vả. Còn phần tô mầu minh cũng sử lý đươc rồi. nhưng code cua minh thi ghi từ máy thôi dai như cầu Long biên ấy minh gừi file kèm đẻ chia sẻ với mọi người. và mong bạn nào giúp minh viết cho code ngắn đi.
Nhân tiện cho minh hỏi muốn cho một đoạn mã lệnh thưc hiện ở một ô bất kỳ thì khi mình chọn con trỏ vò ô đo phải viêt như thế nào (không có địa chỉ cố định, để nó sử lý dữ liệu ở riêng ô đó thôi)
Thank all
 

File đính kèm

  • aaaaaaaa.rar
    220.5 KB · Đọc: 17
Upvote 0
Nhờ anh em xem hộ File g ửi kèm

File mmmm ket qua..xls
Modul 20 chay mot minh thi to mầu đỏ ơ ô T23 va ô T22 trị giá =1
Nhưng Run ở modul 25 thi nokhông thưc hiên

File 1111bbbbb.xls
Modul 29 và 16 không ẩn mà hinh khi Run
Modul 16 khi chạy phải dung chuôt nháy vao nut lệnh delete nó mới chay tiêp
Co cach nao để no chay mọt mach đên hêt không
Sau khi thưc hiễn xong mình muôn no save as sang một file mới co đường nằm cung thư mục với file gôc mà không biêt viet
 
Upvote 0
xin lỗi cả nhà
không hiêu sao minh không tải đươc file tu máy tinh lên diêndanf
 
Upvote 0
Hi cả nhà
Hôm trươc may tinh của minh bị lỗi nên không gửi file ơnha mình đã sủ lý xong rồi
hôm nay nình muôn hỏi một số thủ thuật trong ecxell
- minh muốn tắt chế độ auto save reong ecxel thi làm thế nào
- trong bang tinh minh có dữ liệu có số "0" ở đàu tiên làm thế nào đê hiện ký tự nay (nếu không khi lay 1 ký tự đấu tiên sẽ bị sai trị số)
-Tắt chế độ ngày tháng nêu không khi may tính sẽ đoc 1/4 thành ngày 1 thang 4

Tong bảng tính mảng (B1:B9) có giá trị lần lượt bằng 01,10,15.20,35,37,45,69,99 Mình muốn nếu cell C3 co trị giá bằng 1 trong các (B1:B9) tri to đỏ font chữ ô D3 thi viết code như thế nào. HIên tại minh phải viết 9 lần nếu C3=B1 thì tô đỏ D3, rôi C3=B2 thì tô đỏ D3, đến B9 .Minh muốn cho đoan code ngăn đi mà không biết viết thế nào
Mong cả nhà chỉ giúp nhé
thank for all
 
Upvote 0
Trong bảng tính minh có mảng (B1:B9) có giá trị lần lượt bằng 01,10,15.20,35,37,45,69,99 Mình muốn nếu cell E17 co trị giá bằng 1 trong các (B1:B9) thi thưc hiên lênh "If then" thi viết code như thế nào. (đe máy
tính hiểu nếu value E17 bằng value B1, hoăc Value B2...... ) HIên tại minh phải viết 9 lần như
đoan code sau


Sub Boooooo01


Dim Rws As Long, Cls As Range
Rws = [A16].End(xlUp).Row
Range("A16:A16").Select
For Each Cls In Selection
If Cls.Offset(1, 4).Value = 1 Then 'soi to mau Bo 01'
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 10 Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 15 Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 25Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 35 Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 37 Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 45 Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 69 Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
If Cls.Offset(1, 4).Value = 99 Then
Cls.Offset(7, 10).Font.ColorIndex = 3
Cls.Offset(6, 10).Value = "1"
Cls.Offset(69, 25).Value = "1"
End If
Next Cls


End Sub


- Minh muốn viết nếu ô E17 bằng một trong các sô 01,10,15.20,35,37,45,69,99 thi thưc hiện "if then"
Hoặc gía trị ô E17 bằng giá trị củar một trong cá ô B1đến B9 thi thực hiện lệnh "if then".để code ngắn lại
Nhờ cả nhà chỉ giùm
thank for all
 
Upvote 0
Web KT
Back
Top Bottom