Giúp rút ngắn code! (1 người xem)

Liên hệ QC

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

babyheomoi

Thành viên thường trực
Tham gia
22/9/13
Bài viết
395
Được thích
91
Mình chỉ mới bập bẹ học VBA!
Mình xài marco, và dùng công thức cho file của mình!
Tuy nhiên, theo mình biết thì đã dùng vba thì hạn chế dùng hàm!
Mình đưa code vba file mình theo marco, nhờ các cao thủ rút ngắn và hướng dẫn để mai mốt mình thực hiện!
Mã:
Sub updatedata()
'
' updatedata Macro
'
'
    ActiveCell.Select
    Range("BQ3:BQ250").Select
    Selection.Formula = "=VLOOKUP(RC[-67],[updateTD.xlsm]data!R2C8:R10000C87,25,FALSE)"
    Range("BR3:BR250").Select
    Selection.Formula = "=VLOOKUP(RC[-68],[updateTD.xlsm]data!R2C8:R10000C87,29,FALSE)"
    Range("BO3:BO250").Select
    Selection.Formula = "=VLOOKUP(RC[-65],[updateTD.xlsm]data!R2C8:R10000C87,13,FALSE)"
    Range("BP3:BP250").Select
    Selection.Formula = "=VLOOKUP(RC[-66],[updateTD.xlsm]data!R2C8:R10000C87,14,FALSE)"
    Range("BZ3:BZ250").Select
    Selection.Formula = "=VLOOKUP(RC[-76],[updateTD.xlsm]data!R2C8:R10000C87,11,FALSE)"
    Selection.NumberFormat = "0.00%"
    ActiveWorkbook.Save

Code 2
Mã:
Sub Texttocolum()
'
' Texttocolum Macro
' Text to colum
'
' Keyboard Shortcut: Ctrl+Shift+T
'
    Columns("T:T").Select
    Selection.TextToColumns Destination:=Range("T1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("U:U").Select
    Selection.TextToColumns Destination:=Range("U1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("V:V").Select
    Selection.TextToColumns Destination:=Range("V1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("W:W").Select
    Selection.TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("X:X").Select
mình cám ơn trước, mong các bác cho em ít kinh nghiệm khi xử lý code!
 
Mình chỉ mới bập bẹ học VBA!
Mình xài marco, và dùng công thức cho file của mình!
Tuy nhiên, theo mình biết thì đã dùng vba thì hạn chế dùng hàm!
Mình đưa code vba file mình theo marco, nhờ các cao thủ rút ngắn và hướng dẫn để mai mốt mình thực hiện!
Mã:
Sub updatedata()
'
' updatedata Macro
'
'
    ActiveCell.Select
    Range("BQ3:BQ250").Select
    Selection.Formula = "=VLOOKUP(RC[-67],[updateTD.xlsm]data!R2C8:R10000C87,25,FALSE)"
    Range("BR3:BR250").Select
    Selection.Formula = "=VLOOKUP(RC[-68],[updateTD.xlsm]data!R2C8:R10000C87,29,FALSE)"
    Range("BO3:BO250").Select
    Selection.Formula = "=VLOOKUP(RC[-65],[updateTD.xlsm]data!R2C8:R10000C87,13,FALSE)"
    Range("BP3:BP250").Select
    Selection.Formula = "=VLOOKUP(RC[-66],[updateTD.xlsm]data!R2C8:R10000C87,14,FALSE)"
    Range("BZ3:BZ250").Select
    Selection.Formula = "=VLOOKUP(RC[-76],[updateTD.xlsm]data!R2C8:R10000C87,11,FALSE)"
    Selection.NumberFormat = "0.00%"
    ActiveWorkbook.Save

Code 2
Mã:
Sub Texttocolum()
'
' Texttocolum Macro
' Text to colum
'
' Keyboard Shortcut: Ctrl+Shift+T
'
    Columns("T:T").Select
    Selection.TextToColumns Destination:=Range("T1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("U:U").Select
    Selection.TextToColumns Destination:=Range("U1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("V:V").Select
    Selection.TextToColumns Destination:=Range("V1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("W:W").Select
    Selection.TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("X:X").Select
mình cám ơn trước, mong các bác cho em ít kinh nghiệm khi xử lý code!
Nhìn code là biết Record macro rồi. Tôi cũng học VBA theo cách này. Có một cách mà bạn có thể áp dụng để rút gọn code cho dễ nhìn hơn sau khi record:
- Nếu câu lệnh trên có dạng Range(...).Select và câu lệnh dưới có dạng Selection.[gì gì đó] thì bạn bỏ cái Select ở trên và cái Selection ở dưới đi, nối 2 câu lệnh này lại thành 1 câu có dạng Range(...).[gì gì đó].
- Nếu có nhiều câu lệnh bắt đầu từ Selection thì bạn gộp chúng trong 1 câu lệnh With cho dễ theo dõi.

Chẳng hạn, code ở trên có thể rút đi một chút thành thế này:
[GPECODE=vb]Sub updatedata()
' updatedata Macro
Range("BQ3:BQ250").Formula = "=VLOOKUP(RC[-67],[updateTD.xlsm]data!R2C8:R10000C87,25,FALSE)"
Range("BR3:BR250").Formula = "=VLOOKUP(RC[-68],[updateTD.xlsm]data!R2C8:R10000C87,29,FALSE)"
Range("BO3:BO250").Formula = "=VLOOKUP(RC[-65],[updateTD.xlsm]data!R2C8:R10000C87,13,FALSE)"
Range("BP3:BP250").Formula = "=VLOOKUP(RC[-66],[updateTD.xlsm]data!R2C8:R10000C87,14,FALSE)"
With Range("BZ3:BZ250")
.Formula = "=VLOOKUP(RC[-76],[updateTD.xlsm]data!R2C8:R10000C87,11,FALSE)"
.NumberFormat = "0.00%"
End With
ActiveWorkbook.Save
'........[/GPECODE]
 
Upvote 0
Thanks bác, hiện code hiện tại có bất tiện là không có dữ liệu nó cũng sẽ hiện N/A.
Vậy bác nào có thể cho thêm code để khi nó vloolkup không có dữ liệu thì nó sẽ tự động để trống cho đẹp mắt ko??
 
Upvote 0
Tại sao không bẫy lỗi từ hàm sau đó record vô ta
 
Upvote 0
Có thể rút gọn bằng cách tách làm 2 macro cha & con:

với
Mã:
Sub Texttocolum()
' Texttocolum Macro
' Text to colum
' Keyboard Shortcut: Ctrl+Shift+T
    Columns("T:T").Select
    Selection.TextToColumns Destination:=Range("T1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("U:U").Select
    Selection.TextToColumns Destination:=Range("U1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("V:V").Select
    Selection.TextToColumns Destination:=Range("V1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("W:W").Select
    Selection.TextToColumns Destination:=Range("W1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    End Sub

Ta có thể làm vầy:
PHP:
Sub Cha ()

 Con Columns("T:T")
 Con Columns("U:U")
'. . . . .'
 Con Columns("W:W")
End Sub


Mã:
Sub Con( Rng As Range )
    Rng.TextToColumns Destination:=Rng(1), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
End Sub
 
Upvote 0
Rng(1) cái này có ý nghĩa ji bác? tại sao ko là range(1)
 
Upvote 0
Rng(1) cái này có ý nghĩa ji bác? tại sao ko là range(1)

Khi Rng được xác định là vùng thuộc các ô của 1 cột thì Rng(1) là ô đầu tiên trong vùng Rng

Nếu Set Rng= Range("A2:B9")
Thì lúc đó Rng(1) là ô [A2]; Rng(2) là ô [B2] & Rng(3) là ô [A3] đó bạn.

Chuyện này bạn có thể thử bằng macro sau:

PHP:
Sub ThuNghiem()
 Dim J As Long, Rng As Range 

 Set Rng= Range("A2:B9")
 For J =1 To Rng.Cells.Count -1
      MsgBox Rng(J).Address
 Next
End Sub
 
Upvote 0
Còn việc này nữa mấy bác giúp em nha!
Thanks bác, hiện code hiện tại có bất tiện là không có dữ liệu nó cũng sẽ hiện N/A.
Vậy bác nào có thể cho thêm code để khi nó vloolkup không có dữ liệu thì nó sẽ tự động để trống cho đẹp mắt ko??
Hoặc ko dùng hàm vlookup mà tự động tìm kiếm tham chiếu dữ liệu với mỗi số định danh 1 khách hàng
 
Upvote 0
Còn việc này nữa mấy bác giúp em nha!
Hoặc ko dùng hàm vlookup mà tự động tìm kiếm tham chiếu dữ liệu với mỗi số định danh 1 khách hàng

Muốn nhận nhanh sự giúp đỡ, bạn cần đưa file giả lập lên;
Chắc không ai có thể hình dung & giả lập file đúng í bạn được đâu!
 
Upvote 0
Nhìn code là biết Record macro rồi. Tôi cũng học VBA theo cách này. Có một cách mà bạn có thể áp dụng để rút gọn code cho dễ nhìn hơn sau khi record:
- Nếu câu lệnh trên có dạng Range(...).Select và câu lệnh dưới có dạng Selection.[gì gì đó] thì bạn bỏ cái Select ở trên và cái Selection ở dưới đi, nối 2 câu lệnh này lại thành 1 câu có dạng Range(...).[gì gì đó].
- Nếu có nhiều câu lệnh bắt đầu từ Selection thì bạn gộp chúng trong 1 câu lệnh With cho dễ theo dõi.

Chẳng hạn, code ở trên có thể rút đi một chút thành thế này:
[GPECODE=vb]Sub updatedata()
' updatedata Macro
Range("BQ3:BQ250").Formula = "=VLOOKUP(RC[-67],[updateTD.xlsm]data!R2C8:R10000C87,25,FALSE)"
Range("BR3:BR250").Formula = "=VLOOKUP(RC[-68],[updateTD.xlsm]data!R2C8:R10000C87,29,FALSE)"
Range("BO3:BO250").Formula = "=VLOOKUP(RC[-65],[updateTD.xlsm]data!R2C8:R10000C87,13,FALSE)"
Range("BP3:BP250").Formula = "=VLOOKUP(RC[-66],[updateTD.xlsm]data!R2C8:R10000C87,14,FALSE)"
With Range("BZ3:BZ250")
.Formula = "=VLOOKUP(RC[-76],[updateTD.xlsm]data!R2C8:R10000C87,11,FALSE)"
.NumberFormat = "0.00%"
End With
ActiveWorkbook.Save
'........[/GPECODE]
Vậy còn trường hợp mình chọn nhiều columns hoặc row cho cùng 1 định dạng thì sao? mình có thể dùng cấu trúc dạng gì để nối nhiều cái với nhau?
Riêng với cấu trúc With range(cell1, cell2) em thấy thì nó chỉ có cell 1, cell 2, vậy nếu nhìu vùng thì sao ạ?
 
Upvote 0
Vậy còn trường hợp mình chọn nhiều columns hoặc row cho cùng 1 định dạng thì sao? mình có thể dùng cấu trúc dạng gì để nối nhiều cái với nhau?
Riêng với cấu trúc With range(cell1, cell2) em thấy thì nó chỉ có cell 1, cell 2, vậy nếu nhìu vùng thì sao ạ?
PHP:
Sub Tomau_vung()
Cells.Interior.ColorIndex = xlNone
Range("A1:A2,C3:C6,D8:D15").Interior.ColorIndex = 6
End Sub
Bạn thử như vậy xem, nhưng bạn nên có file đính kèm của bạn thì sẽ nhanh có câu trả lời. Đặc biệt khi mới học nên có file đính kèm, khi mọi người giúp đỡ , bạn dễ hình dung code hơn.
 
Upvote 0
Mấy bác ơi, giúp em với cái!!
E mới tập tành học code
Code trên:
Mã:
[TABLE="width: 894"]
[TR]
[TD="class: gutter"][RIGHT]1
2
3
4
5
6
7
8
9
10
11
12[/RIGHT]
[/TD]
[TD="class: code"]Sub updatedata()
' updatedata Macro
Range("BQ3:BQ250").Formula = "=VLOOKUP(RC[-67],[updateTD.xlsm]data!R2C8:R10000C87,25,FALSE)"
Range("BR3:BR250").Formula = "=VLOOKUP(RC[-68],[updateTD.xlsm]data!R2C8:R10000C87,29,FALSE)"
Range("BO3:BO250").Formula = "=VLOOKUP(RC[-65],[updateTD.xlsm]data!R2C8:R10000C87,13,FALSE)"
Range("BP3:BP250").Formula = "=VLOOKUP(RC[-66],[updateTD.xlsm]data!R2C8:R10000C87,14,FALSE)"
With Range("BZ3:BZ250")
.Formula = "=VLOOKUP(RC[-76],[updateTD.xlsm]data!R2C8:R10000C87,11,FALSE)"
.NumberFormat = "0.00%"
End With
ActiveWorkbook.Save
'........
[/TD]
[/TR]
[/TABLE]

Em tập tành viết thành như vầy!
Mã:
[COLOR=#000000][FONT=Times New Roman]Dim ham As WorksheetFunction, daGN As Range, Duno As Range
[/FONT][/COLOR][COLOR=#000000][FONT=Arial][FONT=Times New Roman]Set ham = WorksheetFunction[/FONT][/FONT][/COLOR]
[COLOR=#000000][FONT=Arial][FONT=Times New Roman]Set daGN = Range("BQ3", [BQ65536].End(xlUp))[/FONT][/FONT][/COLOR]
[COLOR=#000000][FONT=Arial][FONT=Times New Roman]For Each Cells In daGN[/FONT][/FONT][/COLOR]
[COLOR=#000000][FONT=Times New Roman]    .Values = ham.VLookup("RC[-67]", Sheets("data").Range("R2C8:R10000C87"), 25, False)
[/FONT][/COLOR]Next
End sub
Tuy nhiên, code vãn bị lỗi!! Vậy mọi người cho em hỏi với cú pháp như code ở trên thì e nên xài sao cho hay nhỉ?
Mọi người chỉ em các auto fill hàm vlookup luôn nha!

Theo cả nhà, trong trường hợp này, xài kiểu FIND có được ko?
Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Mấy bác ơi, giúp em với cái!!
E mới tập tành học code
Code trên:
Mã:
[TABLE="width: 894"]
[TR]
[TD="class: gutter"][RIGHT]1
2
3
4
5
6
7
8
9
10
11
12[/RIGHT]
[/TD]
[TD="class: code"]Sub updatedata()
' updatedata Macro
Range("BQ3:BQ250").Formula = "=VLOOKUP(RC[-67],[updateTD.xlsm]data!R2C8:R10000C87,25,FALSE)"
Range("BR3:BR250").Formula = "=VLOOKUP(RC[-68],[updateTD.xlsm]data!R2C8:R10000C87,29,FALSE)"
Range("BO3:BO250").Formula = "=VLOOKUP(RC[-65],[updateTD.xlsm]data!R2C8:R10000C87,13,FALSE)"
Range("BP3:BP250").Formula = "=VLOOKUP(RC[-66],[updateTD.xlsm]data!R2C8:R10000C87,14,FALSE)"
With Range("BZ3:BZ250")
.Formula = "=VLOOKUP(RC[-76],[updateTD.xlsm]data!R2C8:R10000C87,11,FALSE)"
.NumberFormat = "0.00%"
End With
ActiveWorkbook.Save
'........
[/TD]
[/TR]
[/TABLE]

Em tập tành viết thành như vầy!
Mã:
[COLOR=#000000][FONT=Times New Roman]Dim ham As WorksheetFunction, daGN As Range, Duno As Range[/FONT][/COLOR][COLOR=#000000][FONT=Arial][FONT=Times New Roman]Set ham = WorksheetFunction[/FONT][/FONT][/COLOR]
[COLOR=#000000][FONT=Arial][FONT=Times New Roman]Set daGN = Range("BQ3", [BQ65536].End(xlUp))[/FONT][/FONT][/COLOR]
[COLOR=#000000][FONT=Arial][FONT=Times New Roman]For Each Cells In daGN[/FONT][/FONT][/COLOR]
[COLOR=#000000][FONT=Times New Roman]    .Values = ham.VLookup("RC[-67]", Sheets("data").Range("R2C8:R10000C87"), 25, False)
[/FONT][/COLOR]Next
End sub
Tuy nhiên, code vãn bị lỗi!! Vậy mọi người cho em hỏi với cú pháp như code ở trên thì e nên xài sao cho hay nhỉ?
Mọi người chỉ em các auto fill hàm vlookup luôn nha!

Theo cả nhà, trong trường hợp này, xài kiểu FIND có được ko?
Thanks

Sai tùm lum hết thì sao chạy được. Set ham= application.......
Cells là của bác Bill xài, mình đâu có quyền dùng for each cells
Rồi thêm .Values nữa.
 
Upvote 0
Ah, e biết chỗ em sai rồi!
Câu lệnh Set ham = WorksheetFunction
phải đổi thành Set ham =Application. WorksheetFunction
phải ko?
Còn chỗ cell thì e chưa biết biến tấu thế nào!!
 
Upvote 0
[thongbao]Còn chỗ cell thì e chưa biết biến tấu thế nào!![/thongbao]
PHP:
Dim Cls As Range

For Each Cls In Range("GPE")
     MsgBox Cls.Value  
Next Cls
 
Upvote 0
...
Còn chỗ cell thì e chưa biết biến tấu thế nào!!

Đã each (số ít) rồi mà còn Cells (số nhiều) nữa. Chỉ cần sửa lại thành Cell là đủ để tránh lỗi - từ không được dùng là Cellsi. Tuy nhiên, nên tránh những tên biến có dính liu đến worksheet như sheet, cell, range,...

Trong lập trình có cái gọi là từ khoá được ngôn ngữ giành sẵn (reserved words), không được dùng làm tên biến hoặc hàm. Cells là một trong các từ khoá ấy.

Rất tiếc là cái danh sách từ khoá này dài lắm, khó thể đưa lên đây. Bạn phải tự tìm lấy.
 
Upvote 0

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

Back
Top Bottom