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:
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
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 ạ
Không ai giúp em bài này với ạ
 
Upvote 0
Mình muốn viết 1 đoạn code xử lý công việc như sau: Trong vùng sắp xếp dữ liệu của mình có những cell tham chiếu giá trị đến nhau. Nếu ta sắp xếp dữ liệu thì những link này sẽ link sai vị trí hết. Có cách nào xử lý việc này không?
Cảm ơn các bạn!
Ví dụ: sắp xếp dữ liệu theo cột từ D4 đến D9
 

File đính kèm

  • Sap xep du lieu.xlsx
    8.5 KB · Đọc: 8
Upvote 0
Mình muốn viết 1 đoạn code xử lý công việc như sau: Trong vùng sắp xếp dữ liệu của mình có những cell tham chiếu giá trị đến nhau. Nếu ta sắp xếp dữ liệu thì những link này sẽ link sai vị trí hết. Có cách nào xử lý việc này không?
Cảm ơn các bạn!
Ví dụ: sắp xếp dữ liệu theo cột từ D4 đến D9

Bạn quên save Marco enable rồi
 
Upvote 0
Giải thích giúp em câu lệnh này với ạ:
Rich (BB code):
Dic.Item(a(i, 1) & "|" & a(i, 3)) = a(i, 4)
 
Upvote 0
Chào mọi người
Mình có một function đơn giản như sau:

Mã:
Function func01(str As String, X As Variant)
func01 = Evaluate(Replace(str, "x", X))
End Function

Cơ bản thì hàm này dùng như sau: ví dụ mình có hàm f(x) = ln(x) + x^2. Mình muốn tính f(x) với x = 2 chẳng hạng thì mình có 2 cách
Cách 1: =Ln(A1) + A1^2. Với A1=2 <-- Cái này ko có gì đáng nói
Cách 2: dùng hàm mình viết func01. Mình nhập là =func01("ln(x)+x^2",A1) trong đó A1=2. Hàm func01 sẽ thay thế các giá trị x bằng giá trị ở A1, tức 2. Kết quả ra tương đương với cách 1.

Tuy nhiên bây giờ có 1 vấn đề mà mấy ngày nay mình hỏi khắp nơi ko ra là như vậy:

nếu hàm func01("x",A1) tức là A1 thế nào thì func01 trả ra thế đấy.
Vấn đề bắt đầu từ đây,
1. Hàm func01 xài được với mọi trường hợp, mọi hàm trừ duy nhất khi là func01("x",A1) và giá trị A1=1. Chỉ duy nhất trường hợp này trả ra giá trị lỗi. Mọi người xem Cell C12 trong file Excel đính kèm giúp mình

2. Nếu các bạn mởi 1 sheet độc lập, viết lại hàm func01 y chang thì.
2.1 Dừng lại ở đây thì hàm func01 trả ra giá trị đúng với func01("x",A1)=1 với A1=1
2.2 Nếu thêm UserForm các thứ thì lỗi lại bị. ???

Ruốt cuộc mình chẳng biết vấn đề là từ đâu ra nữa
Anh em bạn bè gần xa, có ai cao thủ vụ này giúp mình với.

Cảm ơn mọi người
 

File đính kèm

  • Regression_PHAN.xlsm
    44.6 KB · Đọc: 6
Upvote 0
Web KT

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

Back
Top Bottom