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:
Đây là công thức name trong VBA
Range("B10:B" & [B65536].End(3).Row).Name = "BBBB"
Mình muốn viết name động trên excel thì làm thế nào. Cách mình biết thì nếu như mình delete dòng thì thông số của cái name động đang đối chiếu trên vùng cũng bị thu hẹp theo.
Giả sử công thức name động mình sưu tầm được là Offset($A$1, 0, 0, countA($A$1:$A$1000), 1)

Nhưng khi mình delete từ dòng 500 đổ xuống dưới là cái thông số 1000 cũng bị thay đổi thành 500. Mình muốn có một công thức tổng quát hơn không ảnh hưởng khi mình xóa dòng thì cần làm thế nào. Nếu làm được như cái code VBA trên thì ngon.
Bạn điều chỉnh công thức cho phù hợp với vùng bạn cần lấy chứ...
Mã:
Offset($B$10, 0, 0, countA($B$10:$B$60000), 1)
(điều kiện để đúng: dữ liệu phải có liên tục từ B10 trở xuống)
 
Upvote 0
Đây là công thức name trong VBA
Range("B10:B" & [B65536].End(3).Row).Name = "BBBB"
Mình muốn viết name động trên excel thì làm thế nào. Cách mình biết thì nếu như mình delete dòng thì thông số của cái name động đang đối chiếu trên vùng cũng bị thu hẹp theo.
Giả sử công thức name động mình sưu tầm được là Offset($A$1, 0, 0, countA($A$1:$A$1000), 1)

Nhưng khi mình delete từ dòng 500 đổ xuống dưới là cái thông số 1000 cũng bị thay đổi thành 500. Mình muốn có một công thức tổng quát hơn không ảnh hưởng khi mình xóa dòng thì cần làm thế nào. Nếu làm được như cái code VBA trên thì ngon.
Đã dùng đến code thì tôi nghĩ cái name động kia hoàn toàn không cần thiết. Bởi mỗi khi code chạy, bạn hoàn toàn có thể xác định chính xác vùng dữ liệu (bằng cách cố định cell đầu và xác định cell cuối bằng End(xlUp) là được).
Cái name động kia nếu tham gia vào quá trình tính toán của code chỉ tổ làm nặng máy???
Bạn nghĩ sao?
 
Upvote 0
Bạn điều chỉnh công thức cho phù hợp với vùng bạn cần lấy chứ...
Mã:
Offset($B$10, 0, 0, countA($B$10:$B$60000), 1)
(điều kiện để đúng: dữ liệu phải có liên tục từ B10 trở xuống)

Ví một lý do nào đó mình delete dòng từ 50000 đến 60000 thì thông số $B$60000 có đổi thành $B$50000 không bạn?
 
Upvote 0
Đã dùng đến code thì tôi nghĩ cái name động kia hoàn toàn không cần thiết. Bởi mỗi khi code chạy, bạn hoàn toàn có thể xác định chính xác vùng dữ liệu (bằng cách cố định cell đầu và xác định cell cuối bằng End(xlUp) là được).
Cái name động kia nếu tham gia vào quá trình tính toán của code chỉ tổ làm nặng máy???
Bạn nghĩ sao?

Vâng nhưng code em nửa mùa, vừa code vừa hàm anh ạ :D.
 
Upvote 0
Kể như có hàm xác định được ô chứa dữ liệu cuối cùng xét từ dưới lên thì hay.
 
Upvote 0
Mã:
Offset($B$10,0,0,MAX(MATCH(1E+306,B:B,1),MATCH("*",B:B,-1)), 1)

Bạn có thể giải thích cách thức sử dụng được không, vì mình đánh name vào cell nào đó thì vùng đối chiếu nó có sự thay đổi. Giả sử mình cần lập name Từ cột B8 đến AM8 kéo xuống dưới với điều kiện cột B dữ liệu cuối cùng ở đâu thì tham chiếu đến đó thì cần thay đổi hàm trên như nào?
 
Upvote 0
Chào cả nhà,

Mình muốn sử dụng code sau dùng trong office 2010, hiện tại chỉ sử dụng trong office cũ:

Sub SaveThanhFileKhacBoCongThuc()
Dim wPath As String, wName As String
wPath = ThisWorkbook.Path
wName = ThisWorkbook.Name
For i = 1 To Sheets.Count
Sheets(i).Activate
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Next
ActiveWorkbook.SaveAs Filename:=wPath & "\SA_" & wName
End Sub

Thân chào.
 
Upvote 0
Chào cả nhà,

Mình muốn sử dụng code sau dùng trong office 2010, hiện tại chỉ sử dụng trong office cũ:

PHP:
Sub SaveThanhFileKhacBoCongThuc()
Dim wPath As String, wName As String
wPath = ThisWorkbook.Path
wName = ThisWorkbook.Name
For i = 1 To Sheets.Count
Sheets(i).Activate
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Next
ActiveWorkbook.SaveAs Filename:=wPath & "\SA_" & wName
End Sub

Thân chào.
Đoạn trên sử dụng được với Excel 2010.
 
Upvote 0
Mình copy vào chạy ok nhưng lưu lại thì báo lỗi
Bạn đọc xem cái thông báo đó nói gì? Có chỗ nào nó bảo lỗi lầm gì đâu...
mởi lại file là code bị xóa mất.
Đã biết xài code rồi mà không biết file nào chứa được nó...

Các định dạng file excel cho phép chứa marco: *.xls, *.xla, *.xlm, *.xlsm, *.xltm, *.xlsb, *.xlam, *.xll
https://support.office.com/en-us/ar...in-Excel-a28ae1d3-6d19-4180-9209-5a950d51b719
https://en.wikipedia.org/wiki/List_of_Microsoft_Office_filename_extensions
 
Upvote 0
Đọc về hàm offset() thôi... Mỗi lúc thêm một tí. híc...

À befait ơi mình thấy có công thức =+COUNTIF(INDIRECT("'"&E$1&"'!$ao$9:$ao$5000"),$A2)
Về Indirect lấy địa chỉ vùng theo một ô chỉ định. Vậy thì có thể áp dụng cái Indirect đó với name động không.
 
Upvote 0
Mình có vấn đề về xác định mảng:
ví dụ: sArray = Sheet1.Range(Sheet1.[D9], Sheet1.[G65536].End(xlUp)).Value
cho mình hỏi chuyển đoạn code nay sang dạng define name như thế nào, mong nhận dược sự giúp đỡ của các bạn
 
Upvote 0
ví dụ: sArray = Sheet1.Range(Sheet1.[D9], Sheet1.[G65536].End(xlUp)).Value
mình hỏi, chuyển đoạn code nay sang dạng define name như thế nào, . . .

Thì trước tiên ta dịch sang nghĩa tiếng Việt:

Vùng dữ liệu tại trang tính có tên Sheet1 kể từ (ô trái nhất là) [D9] tới ô cuối cùng thuộc cột [G:G] có dữ liệu được đem nạp vô biến (mảng) sArray.

(Như vậy ta biết vùng này gồm 4 cột & bao nhiêu dòng tùy thuộc vô dòng cuối có dữ liệu thuộc cột [g:g]

Chúc ngày lễ vui vẻ!


:oops:
 
Upvote 0
Mình có vấn đề về xác định mảng:
ví dụ: sArray = Sheet1.Range(Sheet1.[D9], Sheet1.[G65536].End(xlUp)).Value
cho mình hỏi chuyển đoạn code nay sang dạng define name như thế nào, mong nhận dược sự giúp đỡ của các bạn
Không biết đúng ý bạn không nửa, thử code này xem sao.
Mã:
ActiveWorkbook.Names.Add Name:="Ten", RefersToR1C1:="=" & Sheet1.Name & "!R9C4:R" & Sheet1.[G65536].End(xlUp).Row & "C7"
 
Upvote 0
Là vầy nè:
Mã:
Sub Macro1()
 Dim Rws As Long
 Rws = [G65432].End(xlUp).Row
 ActiveWorkbook.Names.Add Name:="GPE", RefersToR1C1:="=Sheet1!R9C4:R" & Rws & "C7"
 ActiveWorkbook.Names("GPE").Comment = "GPE.COM"
End Sub
 
Upvote 0
Mình có vấn đề về xác định mảng:
ví dụ: sArray = Sheet1.Range(Sheet1.[D9], Sheet1.[G65536].End(xlUp)).Value
cho mình hỏi chuyển đoạn code nay sang dạng define name như thế nào, mong nhận dược sự giúp đỡ của các bạn
Bạn đã xác định được vùng dữ liệu, vậy cách dễ nhất khỏi phải suy nghĩ là bạn chuyển biến mảng sArray sang biến Range theo kiểu:
Mã:
Set rng = Sheet1.Range(Sheet1.[D9], Sheet1.[G65536].End(xlUp))
Tiếp theo gán name bình thường
Mã:
ThisWorkbook.Names.Add "TenGiDo", rng
Vậy là xong!
 
Upvote 0
Chào mấy Anh/Chị trên diễn đàn!

Mọi người cho em hỏi ý nghĩa của những code này!
Và trong file này em có vấn đề , em có ghi chú bằng màu đỏ, em có đưa kết quả ra,vậy code sẽ thay đổi như thế nào?

Public Function TachText(ByVal txt As String) As Variant
txt = Replace(txt, "*", "")
txt = WorksheetFunction.Trim(txt)
If InStrRev(txt, ".") = Len(txt) - 2 Then txt = Left(txt, InStrRev(txt, " ") - 1)
Dim Tmp As Variant, m As Long, Arr(1 To 4)
Tmp = Split(txt, " "): m = UBound(Tmp)
If m < 3 Then Exit Function
Arr(1) = Tmp(0)
If InStr(Arr(1), "/") Then Arr(2) = Tmp(2) Else Arr(2) = Tmp(1)
If Arr(2) = Tmp(2) Then
If IsNumeric(Tmp(3)) Then Arr(3) = Tmp(3) Else Arr(3) = Tmp(m - 2)
Else
If IsNumeric(Tmp(2)) Then Arr(3) = Tmp(2) Else Arr(3) = Tmp(m - 2)
End If
Arr(4) = Tmp(m - 1)
TachText = Arr
End Function

Sub Main()
Dim sArr(), txt As String, i As Long, j As Long, Tmp
sArr = Sheet1.Range("A2:A699").Value: maxA = UBound(sArr, 1)
ReDim darr(1 To maxA, 1 To 4)
For i = 1 To maxA
txt = sArr(i, 1)
If txt <> "" Then
Tmp = TachText(txt)
If TypeName(Tmp) = "Variant()" Then
For j = 1 To 4
darr(i, j) = Tmp(j)
Next j
End If
End If
Next i
Sheet1.Range("F2").Resize(maxA, 4).NumberFormat = "@"
Sheet1.Range("F2").Resize(maxA, 4) = darr
End Sub

Em cảm ơn!
 

File đính kèm

  • hihi ^^.xlsm
    64.1 KB · Đọc: 12
Upvote 0
Web KT

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

Back
Top Bottom