
Gửi bởi
ChanhTQ@
Muốn VBA thì VBA; & tương lai sẽ fải VBA mà thôi
Nghe câu "tương lai sẽ phải VBA" của bạn Chanh mà ham, trong khi kiến thức Vba chỉ mới ở mức "đang tìm hiểu".... cho nên lấy code của bạn Chanh trên bài này để Nhờ bạn Chanh giải thích & khai sáng 1 số khúc mắc, chưa hiểu biết của mình. Bạn chanh (hoặc Bác nào ghé ngang hiểu code thì giải thích hộ mình).
Trân trọng cảm ơn!
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shCore.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shAutoloader.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushAppleScript.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushAS3.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushColdFusion.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushCpp.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushCSharp.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushCss.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushDelphi.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushDiff.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushErlang.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushGroovy.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushJava.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushJavaFx.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushJScript.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushPerl.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushPhp.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushPlain.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushPowerShell.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushPython.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushRuby.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushSass.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushScala.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushSql.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushVb.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shBrushXml.js"></script>
<script type="text/javascript" src="/forum/vctinh_xcode/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/forum/vctinh_xcode/styles/shCoreDefault.css">
<link type="text/css" rel="Stylesheet" href="/forum/vctinh_xcode/styles/shThemeDefault.css">
<pre class="brush: vb; toolbar: false;">Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, [b2]) Is Nothing Then
Dim Sh As Worksheet, Arr()
Dim Rws As Long, J&, W&
Set Sh = ThisWorkbook.Worksheets("DuLieuPhatSinh")
With Sh.[B3]
Rws = .CurrentRegion.Rows.Count
Arr() = .Resize(Rws, 6).Value
End With
[B6].CurrentRegion.Offset(1, 1).ClearContents
ReDim dArr(1 To Rws, 1 To 3)
For J = 1 To UBound(Arr())
If Arr(J, 3) = Target.Value Then
W = 1 + W
dArr(W, 1) = Arr(J, 1)
dArr(W, 2) = Arr(J, 2)
dArr(W, 3) = Arr(J, 6)
End If
Next J
If W Then
[B7].Resize(W, 3).Value = dArr()
Randomize
[b2].Interior.ColorIndex = 34 + 9 * Rnd() \ 1
End If
End If
End Sub</pre>
<script type="text/javascript">
function path()
{
var args = arguments,
result = []
;
for(var i = 0; i < args.length; i++)
result.push(args[i].replace('@', '/forum/vctinh_xcode/scripts/'));
return result;
};
SyntaxHighlighter.autoloader.apply(null, path(
'applescript @shBrushAppleScript.js',
'actionscript3 as3 @shBrushAS3.js',
'ahk autohotkey @shBrushAhk.js',
'asm x86 @shBrushAsm.js',
'bash shell @shBrushBash.js',
'coldfusion cf @shBrushColdFusion.js',
'cpp c @shBrushCpp.js',
'c# c-sharp csharp @shBrushCSharp.js',
'css @shBrushCss.js',
'delphi pascal @shBrushDelphi.js',
'diff patch pas @shBrushDiff.js',
'erl erlang @shBrushErlang.js',
'groovy @shBrushGroovy.js',
'java @shBrushJava.js',
'jfx javafx @shBrushJavaFX.js',
'js jscript javascript @shBrushJScript.js',
'perl pl @shBrushPerl.js',
'php @shBrushPhp.js',
'text plain @shBrushPlain.js',
'py python @shBrushPython.js',
'ruby rails ror rb @shBrushRuby.js',
'sass scss @shBrushSass.js',
'scala @shBrushScala.js',
'sql SQL @shBrushSql.js',
'vb vbnet vba @shBrushVb.js',
'xml xhtml xslt html @shBrushXml.js'
));
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script>
Bác giải thích giúp mình:
1.
Mã:
If Not Intersect(Target, [b2]) Is Nothing Then
+Lệnh If + then thì mình hiểu, nhưng thêm Not phía sau có nghĩa là phủ dịnh lại cái đem đi làm điều kiện if hay ntn? bạn giải thích giúp
+Phương thức Intersect, và cách sử dụng (tìm đọc trên gpe rồi mà chưa hiểu lắm........mông lung quá)
+Target ở đây (sự kiện change): có phải là sự thay đổi giá trị,...hay gì gì... .bạn giải thích giúp
+ (Target, [b2]): có phải là chỉ giá trị trong ô B2 thay đổi thôi?
+ Is nothing: ý nghĩa của câu lệnh này
2.
Mã:
Dim Sh As Worksheet, Arr() Dim Rws As Long, J&, W&
+ Arr(): đây là khai bảo dạng vùng (mảng) có phải không?
3.
Mã:
Set Sh = ThisWorkbook.Worksheets("DuLieuPhatSinh")
With Sh.[B3]
Rws = .CurrentRegion.Rows.Count
Arr() = .Resize(Rws, 6).Value
End With
+ CurrentRegion: lệnh này nghĩa là gì? tìm đọc mà mông lung quá
+ Arr() = .Resize(Rws, 6).Value: hiểu là: Sau khi count được dữ liệu có bao nhiêu dòng, thì gán cho mãng Arr() Count dòng & 6 cột? giải thích giúp.
4.
Mã:
[B6].CurrentRegion.Offset(1, 1).ClearContents
+ Offset(1, 1): chỗ này được hiểu là xóa vùng sau ô B6 1 dòng, & 1 cột (mà trên file thực tế có 1 cột nữa là số lượng, vậy đổi Offset(1, 1) -> Offset(1, 2) có được không?)
Và theo mình hiểu thì xóa giá trị theo chỉ định vùng sau ô B6, trong khi mình Offset(1, 1) (chỉ 1 dòng 1 cột) , vậy làm sao chỗ này vba hiểu là xóa hết dữ liệu từ dòng 7 trở đi.....về sau. (có chăng là nhờ cái CurrentRegion......mà chưa hiểuCurrentRegion...hixxx.)
5.
Mã:
ReDim dArr(1 To Rws, 1 To 3)
Có phải thêm chữ Re trước dim là tạo ra mãng mới từ mãng Arr(), tại sao lại thêm ký tự d trước Arr (mãng mới) có thể thay ký tự "d" bằng những ký tự chữ khác không?
1 To Rws: tạo mãng với số dòng bằng biến Rws ở trên???
1 to 3: cái này mình hiểu là cần 3 cột để gán kết quả nên 1 to 3
6.
Mã:
For J = 1 To UBound(Arr())
If Arr(J, 3) = Target.Value Then
W = 1 + W
dArr(W, 1) = Arr(J, 1)
dArr(W, 2) = Arr(J, 2)
dArr(W, 3) = Arr(J, 6)
End If
Next J
+ If Arr(J, 3) = Target.Value Then: xét từng dòng & cột 3 (code sản phẩm )của vùng Arr , nếu bằng giá trị tại ô B2 thì thực hiện cái lệnh phía sau.???
+ 1 to Ubound(Arr()) : là chạy đến dòng cuối cùng của mãng có phải không?
+ W = 1+ W : chưa hiểu biến W tại sao phải khai báo như vậy. Vì không thấy W bắt đầu từ bao nhiêu (1,2,....n)
Bạn giải thích hộ biến W được khai báo chỗ này, và kết hợp vào dArr
</font>
<font color="#ff0000">Biến W chỗ này mình còn chưa hiểu, mông lung quá.......bạn giải thích giúp!
Đoạn này thì hiểu là tương ứng dòng cột tại vùng Arr lấy được thì gán vào vùng dArr tương ứng dòng cột quy định:
dArr(W, 1) = Arr(J, 1): 1 số phiếu
dArr(W, 2) = Arr(J, 2): 2 ngày
dArr(W, 3) = Arr(J, 6): 6 số lượng
7.
Mã:
If W Then
[B7].Resize(W, 3).Value = dArr()
Randomize
[b2].Interior.ColorIndex = 34 + 9 * Rnd() \ 1
End If
+ Đoạn này nếu W là gì ?? chưa hiểu ý nghĩa.
+ Đoạn Randomize: chắc là tạo số ngẫu nhiên rồi gán màu ngẫu nhiên cho ô B2
Nhờ các bạn giải thích giúp, để hiểu thêm & khai sáng kiến thức cơ bản của vba...[IMG]images/smilies/a01.gif[/IMG][IMG]images/smilies/a01.gif[/IMG][IMG]images/smilies/a01.gif[/IMG]!