Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Dùng tạm cái này xem.
PHP:
Option Explicit

Public Sub sGpe()
Dim sArr(), dArr(), I As Long, J As Long, R As Long, Col As Long
With Sheets("TINH NVL")
    Col = .Range("XFD5").End(xlToLeft).Column - 5
    R = .Range("C100000").End(xlUp).Row - 6
    sArr = .Range("F7").Resize(R, Col).Value
   [B] R = UBound(sArr)[/B]
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        For J = 1 To Col
            dArr(I, 1) = dArr(I, 1) + sArr(I, J)
        Next J
    Next I
    .Range("E7").Resize(R) = dArr
End With
End Sub
Cho mình hỏi dòng in đậm có cần thiết ko, và thêm nó có tác dụng gì, và nếu ko có thì sao ạ? Tại mình bỏ cái dòng đó code vẫn chạy bình thường ạ!
Xin cảm ơn
 
Upvote 0
:) Sorry
 
Lần chỉnh sửa cuối:
Upvote 0
Cho mình hỏi dòng in đậm có cần thiết ko, và thêm nó có tác dụng gì, và nếu ko có thì sao ạ? Tại mình bỏ cái dòng đó code vẫn chạy bình thường ạ!
Xin cảm ơn
Chạy bình thường mà có đúng không vậy bạn ?
Bỏ đi thì R = 0, chạy ra sao thì bạn tìm hiểu tiếp :D
Câu này hả bạn hay câu nào.
Option Explicit
 
Upvote 0
Sorry, em lại nhanh nhẩu đoảng, nhầm. Do không đọc kỹ đoạn code phía trên.
Mã:
.....
R = .Range("C100000").End(xlUp).Row - 6
....
R = UBound(sArr)
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy cuối cùng là chỗ đó sao vậy Snow nhỉ?
R = .Range("C100000").End(xlUp).Row - 6 ' (A)
sArr = .Range("F7").Resize(R, Col).Value ' (B)
R = UBound(sArr) ' (C)

(A) R là số dòng có dữ liệu trên sheet tính từ dòng 7. Vd. dữ liệu tới dòng 11 thì
.Range("C100000").End(xlUp).Row trả về 11, vậy R = 11 - 6 = 5 (5 dòng dữ liệu: 7, 8, 9, 10, 11)

(B) các dòng dữ liệu trên sheet tính từ dòng 7 được nhập vào mảng sArr. Tức trên sheet có R dòng dữ liệu, và trong sArr cũng có R dòng.

(C) R bằng chỉ số trên của dòng trong mảng sArr. Do chỉ số được tính từ 1 nên R cũng chính là số dòng trong mảng sArr, mà số dòng trong sArr bằng số dòng có dữ liệu trên sheet tính từ dòng 7. Vậy R ở (C) bằng R ở (A). Chính vì thế bạn bỏ R ở (C) thì code vẫn chạy vì R đã được xác định tại (A).

R ở điểm (C) thừa nhưng nếu có thì bạn nhìn ra ngay, khỏi suy nghĩ kỹ, là mảng dArr có cùng kích thước với mảng sArr. Thế thôi.

Ở đây code ngắn nên bạn nhìn thấy ngay là R ở (C) không cần nhưng nếu code dài mà (C) nằm ở cuối thì bạn không nhìn thấy ngay được. Có R ở (C) thì dứt khoát dArr có cùng kích thước với mảng sArr.
 
Upvote 0
Dear All.
Mọi người cho e hỏi có cách nào khi sử dụng FileSystemScriptingObject để GetFolder lấy NameFile trong thư mục thì nó bỏ qua các file ẩn và các file tạm đang mở không ạ.
Cám ơn rất nhiều .
 
Upvote 0
Không bạn, Files trả về hết tất cả các File object với mọi thuộc tính. Bạn muốn lọc thì dùng GetAttr hay File.Attributes để loại ra với vbHidden = Hidden = 2
Còn nếu file đang mở thì có nhiều loại đang mở: mở share read, mở share write, mở exclusive (độc quyền). Bạn có thể dùng Open statement: Open xxx As Read Write Lock Read Write để thử mở độc quyền file đó. Nhớ bẫy lỗi On Error. Nếu mở được thì file đó chưa mở, không được thì có thằng process khác đang mở rồi.
Còn muốn biết file đó đang được process nào mở, mở như thế nào, quyền ra sao, security attribues ra sao thì phải dùng NT API. Cách này hơi lòng vòng, phức tạp. Các tool phổ biến xem được vấn đề này là Process Explorer, Process Hacker...
 
Upvote 0
Chào ace
Mình muốn hỏi một chút về hàm Evaluate và Replace. Mình có hai câu hỏi

Câu hỏi 1:
Mình hiện đang học VBA và có đoạn code lồng hàm Evaluate và Replace. Mình ko hiểu rõ lắm cách mà code chạy ở đây.
Code:
Mã:
Sub iteration()
 Dim i As Integer
 Dim x As Double
 
 Dim fxn As String
 
 fxn = InputBox("Enter function form x = f(x)")
 x = InputBox("Enter inital guess")
 
 For i = 1 To 20
  x = Evaluate(Replace(fxn, "x", x))
 Next i

 MsgBox ("Solution is " & FormatNumber(x, 2))
End Sub

Mình tạm hiểu phần Replace tức replace các giá trị x trong hàm f(x) đã nhập từ string thành x. Còn phần evaluate trước đó thì mình không hiểu lắm. Ace ai hiểu giải thích giúp mình với.

Câu hỏi 2:
Giả sử mình có hàm f(x,y) thì nếu muốn làm tương tự như trên thì phần Evaluate(Replace(...)) mình phải viết thế nào. Mình coi syntax của nó thì chỉ có dạng như sau:
Mã:
Replace ( string1, find, replacement, [start, [count, [compare]]] )

Cảm ơn ace
 
Upvote 0
Hỏi thì đừng viết tắt. Lập trình là phải đọc một đống viết tắt rồi, bây giờ còn bắt phải đoán thêm câu hỏi viết tắt nữa?

...
Câu hỏi 1:
Mình hiện đang học VBA và có đoạn code lồng hàm Evaluate và Replace. Mình ko hiểu rõ lắm cách mà code chạy ở đây.
Code:
... x = Evaluate(Replace(fxn, "x", x))
...

Mình tạm hiểu phần Replace tức replace các giá trị x trong hàm f(x) đã nhập từ string thành x. Còn phần evaluate trước đó thì mình không hiểu lắm. Ace ai hiểu giải thích giúp mình với.
...
Evaluate là hàm tính biểu thức dạng chuỗi sang kết quả số. Ví dụ cho biểu thức "123+456" thì Evaluate("123+456") sẽ cho kết quả là 579.
Ở trên nếu fxn là "x*x + 3*x + 5" và x là 2 thì hàm replace sẽ nạp thành Evaluate("2*2 + 3*2 + 5"); được kết quả là 15.

...
For i = 1 To 20
x = Evaluate(Replace(fxn, "x", x))
Next i
...
Câu hỏi 2:
Giả sử mình có hàm f(x,y) thì nếu muốn làm tương tự như trên thì phần Evaluate(Replace(...)) mình phải viết thế nào. Mình coi syntax của nó thì chỉ có dạng như sau:
Mã:
Replace ( string1, find, replacement, [start, [count, [compare]]] )
Bài tập trên là nạp trị mới vào biểu thức cũ để tính tiếp, đại khái là cách giải fixed-point iteration.
Nếu muốn f(x,y) thì bạn phải lục lại lý thuyết toán để tìm cách giải ấy (nếu có)
 
Upvote 0
Mình có file excel cần sort cột C theo thứ tự từ nhỏ đến lớn (số lô từ nhỏ đến lớn), rất mong được các anh chị giúp đỡ. Mình đã sort nhưng nó không đúng ý. Nó ra kq như sau:
19/NV1/CN/1040
19/NV1/CN/243
19/NV1/CN/313
Nghĩa là nó chỉ sort được số đầu tiên của các cụm số 1040, 243, 313, trong khi mình muốn nó sắp xếp theo thứ tự
19/NV/CN/243
19/NV1/CN/313
19/NV1/CN/1040
 

File đính kèm

  • Thong ke.xlsx
    19.5 KB · Đọc: 6
Upvote 0
Mình có file excel cần sort cột C theo thứ tự từ nhỏ đến lớn (số lô từ nhỏ đến lớn), rất mong được các anh chị giúp đỡ. Mình đã sort nhưng nó không đúng ý. Nó ra kq như sau:
19/NV1/CN/1040
19/NV1/CN/243
19/NV1/CN/313
Nghĩa là nó chỉ sort được số đầu tiên của các cụm số 1040, 243, 313, trong khi mình muốn nó sắp xếp theo thứ tự
19/NV/CN/243
19/NV1/CN/313
19/NV1/CN/1040
Cái này nó đang sort theo thứ tự từ trái qua phải nhé.Nếu bạn muốn sort theo kiểu như vậy thì tách nó ra mà sort nhé.
 
Upvote 0
NHưng trong cột C của file em đó còn có những lô 19/NV1/GĐ/243, nghĩa là có những lô CN và GĐ trùng số nhau nên muốn tách theo chuỗi ký tự của số lô. anh chị giúp . Hay ai đó có thể dùng code vba để sort
Bài đã được tự động gộp:

NHưng trong cột C của file em đó còn có những lô 19/NV1/GĐ/243, nghĩa là có những lô CN và GĐ trùng số nhau nên muốn tách theo chuỗi ký tự của số lô. anh chị giúp . Hay ai đó có thể dùng code vba để sort
Bài đã được tự động gộp:

Cái này nó đang sort theo thứ tự từ trái qua phải nhé.Nếu bạn muốn sort theo kiểu như vậy thì tách nó ra mà sort nhé.
NHưng trong cột C của file em đó còn có những lô 19/NV1/GĐ/243, nghĩa là có những lô CN và GĐ trùng số nhau nên muốn tách theo chuỗi ký tự của số lô. anh chị giúp .
 
Upvote 0
NHưng trong cột C của file em đó còn có những lô 19/NV1/GĐ/243, nghĩa là có những lô CN và GĐ trùng số nhau nên muốn tách theo chuỗi ký tự của số lô. anh chị giúp . Hay ai đó có thể dùng code vba để sort
Bài đã được tự động gộp:

NHưng trong cột C của file em đó còn có những lô 19/NV1/GĐ/243, nghĩa là có những lô CN và GĐ trùng số nhau nên muốn tách theo chuỗi ký tự của số lô. anh chị giúp . Hay ai đó có thể dùng code vba để sort
Bài đã được tự động gộp:


NHưng trong cột C của file em đó còn có những lô 19/NV1/GĐ/243, nghĩa là có những lô CN và GĐ trùng số nhau nên muốn tách theo chuỗi ký tự của số lô. anh chị giúp .
Bạn đưa dữ liệu "giống thật" khoảng 10 dòng (đủ loại chuỗi có thể có) và 1 bảng kết quả mẫu bạn muốn có bằng thủ công xem.
 
Upvote 0
Em nhờ anh Ba Tê và các anh chị khác giúp đỡ. Em xin gửi lại file, trong đó có 2 sheets trước và sau sắp xếp
 

File đính kèm

  • Thong ke.xlsx
    16.6 KB · Đọc: 2
Upvote 0
Em chào cả nhà
Hiện tại em có file excel để coppy dữ liệu từ sheet file nguon sang sheet Htoan, cách thức copy như sau ạ:
- Lọc ở cột bồi thường nhượng của sheet file nguồn, nếu có giá trị khác blank thì copy sang sheet Htoan TK nợ là 1368211, tk có là 1313111, bên cột phân loại note là bồi thường nhượng. Các dữ liệu khác thì copy từ dữ liệu tương ứng ở sheet file nguồn, ngoài ra một số biến đổi công thức ở sheet Htoan thì anh chị xem hộ em công thức ở sheet này luôn ạ
- Lọc ở cột phí nhượng nếu có dữ liệu khác blank thì copy và điền thêm bên sheet Htoan tai khoan nợ là 3313111 , tk có 1368211 đối với phí nhượng, bên cột phân loại note lại là phí nhượng
- Đối với hoa hồng nhượng tương tự.
Mong anh chị giúp đỡ em ạ
 

File đính kèm

  • copydulieuhachtoan.xlsx
    138.8 KB · Đọc: 12
Upvote 0
Xin chào!.
Hiện tại mình có viết 1 đoạn code đơn giản để Thay thế Giá trị dữ liệu từ Excel vào Word.
Tuy Nhiên, hiện tại code này không thực hiện được trong phần nội dung header và Footer của Word. Rất mong được hỗ trợ.
Sub Replace_Word_Excel()
Dim Rws As Byte
'optimize macro
Application.ScreenUpdating = False
Application.EnableEvents = False
'Define the end rows to circulate

Range("B1").Select
Rws = Range(Selection, Selection.End(xlDown)).Count
'word execution
On Error Resume Next
With CreateObject("Word.Application") 'Open word
.Visible = True
file = [a1]
Doc = .documents.Open(ThisWorkbook.Path & "\" & file & ".docx")
.documents(ThisWorkbook.Path & "\" & file & ".docx").SaveAs Filename:=ThisWorkbook.Path & "\" & Cells(2, 2) & ".docx"
For i = 3 To Rws 'Run Cells replacement

a = Range("B" & i).Value

.Selection.Replace a, , , , , , , , , Sheets("Replacedlist").Range("C" & i).Value, 2 'Replace word from B by C value

Next

.documents(ThisWorkbook.Path & "\" & Cells(2, 2) & ".docx").Close (True)

.Quit

End With

End Sub
 
Upvote 0
Chào các bác !
Trên GPE có 1 đoạn code chèn hình vào cell và autofit. Với cell đơn lẻ thì code ok nhưng với 2 cell merge làm 1 (vd A1 và A2 merge lại thì code này chỉ chèn hình vừa với cell A1 thôi chứ không phải là Cell A1+A2 đã merge
Nhờ các bác edit giúp code giúp mình với. Xin cảm ơn
Sub ChenHinh()
'chen hinh vao cell cho truoc
Dim PicList() As Variant
Dim PicFormat As String
Dim rng As Range
Dim sShape As Shape
Dim Col As Variant
Dim Row As Variant
Dim i As Long

On Error Resume Next
PicList = Application.GetOpenFilename(PicFormat, MultiSelect:=True)
Col = Application.ActiveCell.Column
If IsArray(PicList) Then
Row = Application.ActiveCell.Row
For i = LBound(PicList) To UBound(PicList)
Set rng = Cells(Row, Col)
Set sShape = ActiveSheet.Shapes.AddPicture(PicList(i), msoFalse, msoCTrue, rng.Left, rng.Top, rng.Width, rng.Height)
Row = Row + 1

ActiveSheet.DrawingObjects.Placement = xlMoveAndSize
Application.CommandBars("Format Object").visible = False
Next i
End If
End Sub
 
Upvote 0
Chào các bác !
Trên GPE có 1 đoạn code chèn hình vào cell và autofit. Với cell đơn lẻ thì code ok nhưng với 2 cell merge làm 1 (vd A1 và A2 merge lại thì code này chỉ chèn hình vừa với cell A1 thôi chứ không phải là Cell A1+A2 đã merge
Bạn dùng Sub InsertPicture của tôi trong bài #9 ở link sau


Có nhiều lựa chọn:
- vùng chèn ảnh là 1 cell hoặc vùng nhiều cell, hoặc nhập vào ActiveCell
- chèn ảnh kích thước thực
- chèn ảnh vừa khít vùng. Vừa khít thường không tốt. Vd. vùng chèn là hình vuông trong đó ảnh A là hình chữ nhật dài > cao, ảnh B là hình chữ nhật dài < cao. Lúc này nếu chèn vừa khít thì ảnh A và B sẽ được phóng to/thu nhỏ ở 2 chiều không như nhau nên nhìn sẽ bị "méo"
- chèn ảnh Center. Lúc này ảnh chèn luôn cân đối - 2 chiều phóng to/thu nhỏ theo cùng một tỷ lệ.
- có thể chỉ chèn link (ảnh luôn phải giữ trên đĩa. Khi mang sang máy khác phải mang ảnh theo) hoặc chèn vĩnh viễn (sau khi chèn có thể xóa ảnh trên đĩa. Khi mang sang máy khác không cần mang ảnh theo)
 
Upvote 0
Web KT
Back
Top Bottom