Sử dụng hàm sẵn có trong Excel từ VBA (1 người xem)

Liên hệ QC

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

bucthucuoi

Thành viên mới
Tham gia
14/9/06
Bài viết
14
Được thích
9
Nghề nghiệp
SV
Khi viết code em muốn sử dụng một số hàm có sẵn trong VBA (bình phương, căn bậc hai,giá trị tuyệt đối,..)thì cách thức gọi như thế nào các bác nhỉ. Để tham khảo tên các hàm sẵn có thì em cần xem ở đâu nhỉ. Xin cảm ơn và hậu tạ các bác--=0
 
Có phải bạn muốn xài các hàm của excel trong VBA?

/(/ếu vậy nó là vầy: (gán giá trị tìm được của hàm VLooKup vô một ô)

Range(SRng).Value = Application.VLookup(Range("A5").Value, Range("F1:G8"), 2)
 
Lần chỉnh sửa cuối:
Như bác SQ_AD đã chỉ dẫn, tôi xin bổ sung thêm:
Mã:
Sub UseFunction()
    Dim myRange As Range
    Set myRange = Worksheets("Sheet1").Range("A1:C10")
    answer = [B][COLOR="Red"]Application.WorksheetFunction.[/COLOR][/B][COLOR="Yellow"][B]Min[/B][/COLOR](myRange)
    MsgBox answer
End Sub

Bạn chú ý là dùng Application hay Application.WorksheetFunction ở trước tên hàm nhé.
Dưới đây tôi sẽ liệt kê những hàm dùng được.

List of Worksheet Functions Available to Visual Basic

A

Acos
Acosh
And
Asin
Asinh
Atan2
Atanh
AveDev
Average

B

BetaDist
BetaInv
BinomDist

C

Ceiling
ChiDist
ChiInv
ChiTest
Choose
Clean
Combin
Confidence
Correl
Cosh
Count
CountA
CountBlank
CountIf
Covar
CritBinom

D

DAverage
Days360
Db
DCount
DCountA
Ddb
Degrees
DevSq
DGet
DMax
DMin
Dollar
DProduct
DStDev
DStDevP
DSum
DVar
DVarP

E

Even
ExponDist

F

Fact
FDist
Find
FindB
FInv
Fisher
FisherInv
Fixed
Floor
Forecast
Frequency
FTest
Fv

G

GammaDist
GammaInv
GammaLn
GeoMean
Growth

H

HarMean
HLookup
HypGeomDist

I

Index
Intercept
Ipmt
Irr
IsErr
IsError
IsLogical
IsNA
IsNonText
IsNumber
Ispmt
IsText

K

Kurt

L

Large
LinEst
Ln
Log
Log10
LogEst
LogInv
LogNormDist
Lookup

M

Match
Max
MDeterm
Median
Min
MInverse
MIrr
MMult
Mode

N

NegBinomDist
NormDist
NormInv
NormSDist
NormSInv
NPer
Npv

O

Odd
Or

P

Pearson
Percentile
PercentRank
Permut
Phonetic
Pi
Pmt
Poisson
Power
Ppmt
Prob
Product
Proper
Pv

Q

Quartile

R

Radians
Rank
Rate
Replace
ReplaceB
Rept
Roman
Round
RoundDown
RoundUp
RSq
RTD

S

Search
SearchB
Sinh
Skew
Sln
Slope
Small
Standardize
StDev
StDevP
StEyx
Substitute
Subtotal
Sum
SumIf
SumProduct
SumSq
SumX2MY2
SumX2PY2
SumXMY2
Syd

T

Tanh
TDist
Text
TInv
Transpose
Trend
Trim
TrimMean
TTest

U

USDollar

V

Var
VarP
Vdb
VLookup

W

Weekday
Weibull

Z

ZTest
 
Lần chỉnh sửa cuối:
Dùng trong VBA
Hàm Sumproduct dùng sao nhỉ ?? Thấy dùng cứ bị lỗi hoài.

Các bác có thể cho em 1 VD về hàm này được không ạ ??

Cảm ơn thật nhiều!!
 
bucthucuoi đã viết:
Khi viết code em muốn sử dụng một số hàm có sẵn trong VBA (bình phương, căn bậc hai,giá trị tuyệt đối,..)thì cách thức gọi như thế nào các bác nhỉ. Để tham khảo tên các hàm sẵn có thì em cần xem ở đâu nhỉ. Xin cảm ơn và hậu tạ các bác--=0
Trong box "Lập trình với Excel" đã có bài viết về vấn đề này rồi mà.
Bạn nên tìm kiếm trước khi post bài nhé!
Bài này rất hay đấy.

MrOkebab đã viết:
Hàm Sumproduct dùng sao nhỉ ?? Thấy dùng cứ bị lỗi hoài.
Các bác có thể cho em 1 VD về hàm này được không ạ ??
Bác thử đoạn code sau:
Mã:
Sub Tinhtoan()
Dim gtri
gtri = Evaluate("=SUMPRODUCT((A6:A16=""a"")*(B6:B16))")
MsgBox gtri
End Sub
và xem thêm bài này (#3) nữa nhé!
 
Ủa, chứ không dùng như bình thường được sao ??
Application.WorksheetFunction.Sumproduct(.......)

Thân!
 
Sử dụng hàm Sumproduct trong VBA

Mr Okebab đã viết:
Ủa, chứ không dùng như bình thường được sao ??
Application.WorksheetFunction.Sumproduct(.......)
Thân!

1. Nếu các tham số của của hàm Sumproduct mà không có điều kiện thì OK, bác cứ sử dụng bình thường.
Mã:
gtri = WorksheetFunction.SumProduct(Range("B1:B11"), Range("C1:C11"))
2. Nếu các tham số của của hàm Sumproduct có điều kiện thì không thể sử dụng theo cách trên được (Mình cũng ko rõ là tại sao nữa!).
- Lúc đó phải sử dụng thêm hàm Evaluate:
Mã:
[LEFT]Sub Tinhtoan()
Dim gtri
gtri = Evaluate("=SUMPRODUCT((A1:A11=""a"")*(B1:B11))")
MsgBox gtri
End Sub[/LEFT]
- hoặc:
Mã:
gtri = CDbl([SumProduct((A1:A11="a")*1,B1:B11)])
nhưng nếu vùng mà bác đã đặt tên rồi thì sử dụng như sau:
Mã:
gtri = CDbl([SumProduct((data1="a")*1,data2)])
Bác chú ý cái dấu [, ] nhé và data1 và data2 là Names nhưng lại không dùng Range("data1") như cách thông thường.
 
Cho mình hỏi :
Tại sao khi sử dụng các hàm trong VBA, lúc thì đòi Application.WorksheetFunction. nhưng có lúc lại không cần.

Sao thế nhỉ ??
 
oh, có một số hàm cả VBA và Excel đều có (chẳng hạn như hàm sin ...)
Lúc đó ta sử dụng luôn hàm của VBA thôi ---> không cần Application.WorksheetFunction.
 
Thế danh sách các hàm của VBA (không cần dùng Application.WorksheetFunction.) như thế nào nhỉ. Có thể chỉ luôn được không ??

Thanhks.

Thân!
 
Có ngay đây!
Trong cửa sổ VBA, bác nhấn F2, chọn VBA trong combobox Project/Library.
VBA đã phân loại các hàm theo kiểu: Conversion, DateTime, FileSystem, Math, String.... Biểu tượng của hàm VBA là cái hình màu xanh trước tên hàm đó!
 
Chú ý khi sử dụng hàm trong VBA:

Một số hàm trong Worksheet có tên giống như trong hàm trong VBA nhưng chúng có thể làm việc khác nhau. Ví dụ như: Application.WorksheetFunction.Log và Log cho kết quả khác nhau như ở dưới đây (ô D2 có giá trị là 2).

Mã:
Sub Log_in_Excel()
  Answer=Application.WorksheetFunction.Log(Worksheets("Sheet3").Range("D2"))
  MsgBox "Excel: Gia tri Log(" & Range("D2").Value & ") = " & Answer
End Sub



Mã:
Sub Log_in_VBA()
Dim myRange As Range
  Set myRange = Worksheets("Sheet3").Range("D2")
  MsgBox "VBA: Gia tri Log(" & myRange & ") =" & Log(myRange)
End Sub
 
Môi trường lập trình VBA trong Excel cho phép chúng ta sử dụng 2 thành phần đối tượng:
- Excel
- VB

Khi muốn dùng các thành phần đối tượng (các đối tượng, các thủ tục, hàm,...) của Excel ta khai báo
Application.

Ví dụ
Dim fn as WorksheetFunction
Set fn = Application.WorksheetFunction
x = fn.HamExcel(DoiSo)
Các DoiSo dùng trong HamExcel tương như khi ta dùng lập công thức trên Sheet, riêng đối tượng là một tham chiếu thì trong VBA phải là Range

Trên sheet ta có công thức:
= Vlookup("KH001",DMKH,2,0)
Trong VBA phải là
x = fn.Vlookup("KH001",Application.Range("DMKH"),2,0)
Hoặc
x = fn.Vlookup("KH001",Range("DMKH"),2,0)

Cú pháp chuẩn khi muốn khai thác thành phần của Excel đối tượng đầu tiên (mẹ) là Application, tuy nhiên trong Excel biến này được đặt dạng GLOBAL nên không cần phải khai báo. Tất cả các ứng dụng trong Office đều như vậy.
Nếu các bạn lập trình từ một ngôn ngữ khác, ví dụ như VB6 thì phải làm thế này

Dim oApp as Object
Dim fn as Object
Set oApp = CreateObject(,"Excel.Application")' Application
'Nếu Excel đã đang chạy thì
'Set oApp = GetObject(,"Excel.Application")
'Trong VBA chính là Set oApp = Application

Set fn = oApp.WorksheetFunction
x = fn.Vlookup("KH001",oApp.Range("DMKH"),2,0)
Nếu chúng ta không khai báo oApp thì VB sẽ không hiểu gì cả

Thành phần thứ 2 chúng ta có thể khai thác là VB. VB cung cấp các đối tượng, các hàm và thủ tục.
Để nhận các đối tượng, các hàm, các thủ tục ta chỉ cần khai báo VBA.
Thường thì ta không khai báo đối tượng này vì Excel đã nhận nó là một biến GLOBAL.
Ví dụ format màu nền của ô (Cell) hiện thời

Sub Test1()
Application.ActiveCell.Interior.Color = VBA.ColorConstants.vbBlue
End Sub

Sub Test2()
ActiveCell.Interior.Color = vbBlue
End Sub

Test1 và Test2 đều cho kết quả như nhau, chỉ khác là Test2 không cần phải khai báo đối tượng kiểu GLOBAL sẽ ngắn gọn hơn.

Khi bạn soạn thảo thì lưu ý cách làm nhanh. Cứ sau dấu chấm (.) bạn sẽ có một danh sách để chọn rồi. Nếu không hiện danh sách thì nhấn CTRL+Space bar.

Để tìm hiểu cách sử dụng các thành phần trong VB. Trong môi trường VBE, nhấn F1 để nhận help.

Mặc dù ta hiểu trong VBA ta có thể nhận các hàm của Excel theo cách làm trên nhưng không phải hàm nào cũng có, ví dụ như hàm MOD không có trong VBA.
Hàm MOD cho ta phần lẻ của phép chia
=MOD(2,7) kết quả là 2 (2 chia cho 7 thì sẽ dư 2)
=IF(MOD(YEAR(TODAY()),4)=0,"Năm nhuận","Không nhuận")

Với hàm MOD trong VBA ta phải tự viết thôi. Gửi các bạn hàm tôi viết đơn giản.
Mã:
Function VBA_MOD(ByVal Tuso, ByVal Mauso)
    x = Tuso / Mauso
    VBA_MOD = (x - Int(x)) * Mauso
End Function
 
Vậy mấy cái hàm VBA mình vừa tạo xong rồi dùng ngay trong sub tiếp theo được hay không vậy mấy anh?
 
Em xin hỏi là hàm MONTH trong VBA dùng thế nào chỉ cần Month()
hay mình phải dùng
1. Evaluate("=month()")
2. Application.WorksheetFunction.month()

Xin chỉ dạy
 
Lỗi nặng...........

Ẹc
 
Lỗi nặng ở chổ nào vậy bạn, bạn có thể đưa hộp thoại thông báo lỗi lên đây để mình xem được không.
 
Lỗi nặng ở chổ nào vậy bạn, bạn có thể đưa hộp thoại thông báo lỗi lên đây để mình xem được không.

untitled-3.jpg


-------------

Tks bác
 
Sai ở chổ này :

Sub Month()

Tên Sub không được trùng với tên hàm sử dụng trong nó.
 
Các pác chỉ cách sử dụng hàm Sumif trong VBA luon với các pác ơi !
 
Lần chỉnh sửa cuối:
Khi viết code em muốn sử dụng một số hàm có sẵn trong VBA (bình phương, căn bậc hai,giá trị tuyệt đối,..)thì cách thức gọi như thế nào các bác nhỉ. Để tham khảo tên các hàm sẵn có thì em cần xem ở đâu nhỉ. Xin cảm ơn và hậu tạ các bác--=0

Tác giả hỏi hàm có sẵn trong VBA , mà nhiều bài lại trả lời hàm có sẵn trong Excel
Mà cũng tại tác giả đặt tiêu đề Sử dụng hàm sẵn có trong Excel từ VBA
Xin tác giả xem lại

Tôi cũng muốn hỏi làm sao để hiện danh sách các hàm có sẵn trong VBA khi đang viết mã lệnh
 
Bạn vào địa chỉ sau tải về có đủ Hàm, mẹo, Hàm API bằng tiếng Việt rất dễ hiểu. Lưu ý đây là chương trình miễn phí

http://www.caulacbovb.com/vblib
 
Các bạn cho minh hỏi, trong VBA thì hàm này trong excel =VLOOKUP(LARGE($B$2:$B$11;H13);$B$2:$E$11;2;0) viết như thế nào?
Trong VBA thì thể hiện tham chiếu tuyệt đối thế nào?
xin cảm ơn.
 
Các bạn cho minh hỏi, trong VBA thì hàm này trong excel =VLOOKUP(LARGE($B$2:$B$11;H13);$B$2:$E$11;2;0) viết như thế nào?
Trong VBA thì thể hiện tham chiếu tuyệt đối thế nào?
xin cảm ơn.
Viết y chang vậy luôn
PHP:
Range("gì gì đó").Value = "=VLOOKUP(LARGE($B$2:$B$11;H13);$B$2:$E$11;2;0)"
 
Viết y chang vậy luôn
PHP:
Range("gì gì đó").Value = "=VLOOKUP(LARGE($B$2:$B$11;H13);$B$2:$E$11;2;0)"
----
Anh cứ vướng chổ này hoài nhờ chú giúp, phải viết như thế nào để khi mở rộng Vùng? Ví dụ như công thức trên được thay đổi từ $B$2:$E$11 thành $B$2:$E$15. Cám ơn
 
----
Anh cứ vướng chổ này hoài nhờ chú giúp, phải viết như thế nào để khi mở rộng Vùng? Ví dụ như công thức trên được thay đổi từ $B$2:$E$11 thành $B$2:$E$15. Cám ơn
Vậy sao anh không viết luôn thành $B$2:$E$1000 luôn cho nó khỏe
 
---
--=0 Vụ này thì anh biết và đang làm như thế --=0, anh hỏi vì muốn cho vùng lúc nào cũng cập nhật cho vừa đúng thôi ( Giống như hàm sumif viết trong VBA vậy mà)
Cho anh 1 ví dụ thế này:
PHP:
Sub Test()
  With Sheet1.Range(Sheet1.[B2], Sheet1.[B65536].End(xlUp))
    Range("A1").Value = "=VLOOKUP($A2," & .Resize(, 2).Address & ",2,0)"
  End With
End Sub
Còn dữ liệu thì giống như hình:

untitled.JPG
 
Hàm
Mã:
Public Function hamVBA(i As Integer)
Application.Volatile
If Application.WorksheetFunction.And(i > 1, i < 5) Then
hamVBA = "Dung"
Else
hamVBA = "Sai"
End If
End Function

hoặc
Mã:
Public Function hamVBA(i As Integer)
Application.Volatile
If Application.WorksheetFunction.And(i > 1, i < 5) = TRUE Then
hamVBA = "Dung"
Else
hamVBA = "Sai"
End If
End Function

sử dụng hàm AND trong EXCEL
 
Lần chỉnh sửa cuối:
các AC cho em hỏi có hàm nào tương đương hàm "Iferror" của Excell trong VBA không Ah!!!!
 
Dạ em thấy không đúng Ah. Vì hàm iferror có cấu trúc là: (Value, Value-if-error) còn hàm Iserror chỉ có (Value)
Ví dụ như em muốn dúng hàm Iferror khi giá trị lá#N/A thì trả về là khoảng trắng.=Iferror(vlookup(C3,CD!D4:G150,3,0),"")
Mong các AC giúp đỡ!!!!
 
Dạ em thấy không đúng Ah. Vì hàm iferror có cấu trúc là: (Value, Value-if-error) còn hàm Iserror chỉ có (Value)
Ví dụ như em muốn dúng hàm Iferror khi giá trị lá#N/A thì trả về là khoảng trắng.=Iferror(vlookup(C3,CD!D4:G150,3,0),"")
Mong các AC giúp đỡ!!!!

bạn đang nói về vba?
nếu làm như bạn thì cứ xài iferror vì bạn đang xài worksheetFunction mà?sao phải tìm hàm thay thế?

còn nếu xài code đơn thuần thì như vậy
Mã:
if iserror(value) then
 
Em viết trong "Private Sub Worksheet_Change(ByVal Target As Range) Range("E3").Value = "Iferror(Vlookup(C3,CD!D4:G1500,3,0),"")".Chắc em bị sai rối. Mong anh Let'GâuGâu giúp đỡ.
 
Em viết trong "Private Sub Worksheet_Change(ByVal Target As Range) Range("E3").Value = "Iferror(Vlookup(C3,CD!D4:G1500,3,0),"")".Chắc em bị sai rối. Mong anh Let'GâuGâu giúp đỡ.

sao bạn cho nó là value được
bạn phải viết như vậy
Mã:
[E3]=worksheetfunction.iferror(.................)
 
Sao em làm giống Anh, Sao nó báo lỗi ở chổ"D4:G1500", chổ dấu hai chấm. Mong Anh giúp đỡ.
 
Em viết trong "Private Sub Worksheet_Change(ByVal Target As Range) Range("E3").Value = "Iferror(Vlookup(C3,CD!D4:G1500,3,0),"")".Chắc em bị sai rối. Mong anh Let'GâuGâu giúp đỡ.

Đã dùng VBA thì VLOOKUP làm gì không biết (lại còn rối). Dùng Find đi bạn à!
Tìm giá trị cell C3 trong Sheets("CD").Range("D4:D1500") ---> Nếu tìm thấy thì "quẹo phải" 3 cột để lấy giá trị
Vậy thôi
 
Cũng phải chỉ ra chỗ sai.
Range("E3").Value = "=Iferror(Vlookup(C3,CD!D4:G1500,3,0),"""")"
Câu lệnh trên không sai chỗ chấm Value, mà sai ở chỗ thiếu mấy cái đỏ đỏ
 
Sao em làm giống Thầy ptm0412 mà bị lỗi "1004".
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)If Not Intersect(Target, [C3:D3]) Is Nothing Then
   Application.EnableEvents = False
   Dim tam
   If Target.Column = 3 Then
      tam = Target
      Target.FormulaR1C1 = "=""=" & "" & "" & tam & """"
   End If
   Sheet3.[D2:H10000].AdvancedFilter 2, [C2:D3], Sheet4.[D5:G5]
   If Target.Column = 3 Then Target = tam
   Application.EnableEvents = True
   Range("G3").FormulaR1C1 = "=sum(R[3]C:R[397]C)"
   Range("H3").FormulaR1C1 = "=(RC[-2]-RC[-1])"
   Range("E3").Value = "=iferror(Vlookup(C3,Sheet5!D4:G1500,3,0),"")"
   Range("F3").Value = "=iferror(Vlookup(C3,Sheet5!D4:G1500,4,0),"")"
    If Range("H3") < 0 Then
     MsgBox "So luong cat nhieu hon SL CD", , "Anh Quang bao !!!!"
 End If
End If
End Sub
Mong các AC giúp đỡ!!!!
 
Đã dùng VBA thì VLOOKUP làm gì không biết (lại còn rối). Dùng Find đi bạn à!
Tìm giá trị cell C3 trong Sheets("CD").Range("D4:D1500") ---> Nếu tìm thấy thì "quẹo phải" 3 cột để lấy giá trị
Vậy thôi

Em nghĩ là "quẹo trái" mới đúng hướng chứ anh.
 
Vì em muốn khi giá trị bằng #N/A thì bằng khoảng trắng, nên Thầy Ndu và Anh QuangHai có thể sửa trực tiếp trên code của bài 42 được không Ah!!!. Mong các A giúp đỡ,

giúp em chỉnh chổ:
Mã:
[COLOR=#000000]Range("E3").Value = "=iferror(Vlookup(C3,Sheet5!D4:G1500,3,0),"")"
[/COLOR][COLOR=#000000]   Range("F3").Value = "=iferror(Vlookup(C3,Sheet5!D4:G1500,4,0),"")"[/COLOR]
Mong mọi người giúp đỡ!!!!

Các AC có thể chỉ em dùng "Find" được không Ah!!!

Sao từ khi em sử dụng thêm hàm "Iferror" thì bị lỗi. Mong các AC giúp đỡ!!!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn có để ý thấy code của bạn bị thiếu 2 dấu nháy ở cuối không? (bạn xem bài #41 của bác ptm đó)
 
mình đã chỉnh theo Thầy ptm0412 rồi(như bài 42, 45) vẫn bị lỗi "1004"
 
Em đưa file lên, mong các AC xem giúp đỡ. Vấn đề là khi em dùng hàm "Iferror" là lỗi. Mong các AC xem code!!!
 

File đính kèm

Nói tóm lại là bạn làm không giống bài 41 tôi đã sửa lỗi.
 
Em đưa file lên, mong các AC xem giúp đỡ. Vấn đề là khi em dùng hàm "Iferror" là lỗi. Mong các AC xem code!!!

thử sửa lại như vậy
Mã:
 Range("B2").Value = "=Vlookup(A2,Oder!$A$3:$D$25,3,0)"
Range("C2").Value = "=Iferror(Vlookup(A2,Oder!$A$3:$D$25,4,0),"""")"

hoặc dùng Find
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tim As Range
If Not Intersect(Target, [A2]) Is Nothing Then
 
   [b2:c2].ClearContents
   Set tim = Sheet2.[a2:a25].Find(Target, , , 1)
   If Not tim Is Nothing Then
    [b2] = tim.Offset(, 3)
    [c2] = tim.Offset(, 4)
    End If
    
End If
End Sub
 
Đúng là em quá"gà", bây giờ em mới thấy được cái "sai" của em. Bài của Thầy ptm0412 là có tới "Bốn cái nháy kép" cón của em chỉ có "hai cái nháy kép". Em xin lỗi Thầy và Các AC.(Xin lỗi Anh nvson, em còn "cãi" lại). Nhân đây cho em hỏi các AC, dùng "Clearcontent" tốt hơn hay dùng "khoảng trắng"("").(trong trường hợp nhập liệu xong thì xóa đi hay cho nó là "".).Cũng mong các AC xem đoạn code có thể rút gọn dùm em được không Ah!!!
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)If Not Intersect(Target, [C3:D3]) Is Nothing Then
   Application.EnableEvents = False
   Dim tam
   If Target.Column = 3 Then
      tam = Target
      Target.FormulaR1C1 = "=""=" & "" & "" & tam & """"
   End If
   Sheet3.[D2:H10000].AdvancedFilter 2, [C2:D3], Sheet4.[D5:G5]
   If Target.Column = 3 Then Target = tam
   Application.EnableEvents = True
   Range("G3").FormulaR1C1 = "=if(sum(R[3]C:R[397]C)=0,"""",Sum(R[3]C:R[397]C))"
   Range("H3").FormulaR1C1 = "=iferror((RC[-2]-RC[-1]),"""")"
   Range("E3").Value = "=iferror(Vlookup(C3,CD!D5:G1500,3,0),"""")"
   Range("F3").Value = "=iferror(Vlookup(C3,CD!D5:G1500,4,0),"""")"
    If Range("H3") < 0 Then
     MsgBox "So luong cat nhieu hon SL CD", , "Anh Quang bao !!!!"
     End If
    If Range("E3") = "" Then
     MsgBox "Don hang nay khong co", , "Anh Quang bao"
 End If
End If
End Sub
Em xin cám ơn!!!!
 
Gửi Bình file này xem và tham khảo cho các ứng dụng của mình
Thân

Như file hướng dẫn của anh. Nếu em muốn giá trị tại cột G tự động khi có mã giống như Fill Công thức trong Excel vậy thì làm thế nào?
Bởi vì nếu phải khai rất nhiều dòng
Sheet1.Range("G5").Value = WorksheetFunction.SumIf(Range("C5:C13"), Range("F5"), Range("D5:D13"))
thì quá dài
Tức thay G5 bằng G6, G7, G8 thì có vẻ khổ hơn là dùng hàm ạ.
 
Như file hướng dẫn của anh. Nếu em muốn giá trị tại cột G tự động khi có mã giống như Fill Công thức trong Excel vậy thì làm thế nào?
Bởi vì nếu phải khai rất nhiều dòng
Sheet1.Range("G5").Value = WorksheetFunction.SumIf(Range("C5:C13"), Range("F5"), Range("D5:D13"))
thì quá dài
Tức thay G5 bằng G6, G7, G8 thì có vẻ khổ hơn là dùng hàm ạ.

tức nhiên trong trường hợp này, nó đơn giản sử dụng sumif là ok nhất rồi, tuy nhiên tôi nghĩ là người ta muốn dzo5c vba thôi nếu bạn muôn fill xuống thì bạn phải nhét luôn cái cthuc đó vào sheet
vi du như
Mã:
[G5].FormulaR1C1 = "=SUMIF(Hang,RC[-1],SoLuong)"
    [G6:G10].FillDown

đó là khi mới tập tành vba, môt khi đã có ít ngón nghề rôi thì sẻ không sử dụng worksheet function nữa
================
ví dụ 30 tết mà không có độ nhậu
Mã:
Sub Macro1()
Dim SArr, kq As Variant, d As Object, i, j, k As Long
SArr = [c5].Resize([c60000].End(3).Row - 4, 2).Value
ReDim kq(1 To UBound(SArr), 1 To 2)
Set d = CreateObject("Scripting.Dictionary")

For i = 1 To UBound(SArr)
If Not d.exists(SArr(i, 1)) Then
    k = k + 1
    d.Add SArr(i, 1), k
    kq(k, 1) = SArr(i, 1)
    kq(k, 2) = SArr(i, 2)
Else
    kq(d.Item(SArr(i, 1)), 2) = kq(d.Item(SArr(i, 1)), 2) + SArr(i, 2)
End If
Next
[F5:G100].Clear
[F5].Resize(k, 2).Value = kq
 Set d = Nothing
 
End Sub
 
Lần chỉnh sửa cuối:
tức nhiên trong trường hợp này, nó đơn giản sử dụng sumif là ok nhất rồi, tuy nhiên tôi nghĩ là người ta muốn dzo5c vba thôi nếu bạn muôn fill xuống thì bạn phải nhét luôn cái cthuc đó vào sheet
vi du như
Mã:
[G5].FormulaR1C1 = "=SUMIF(Hang,RC[-1],SoLuong)"
    [G6:G10].FillDown

đó là khi mới tập tành vba, môt khi đã có ít ngón nghề rôi thì sẻ không sử dụng worksheet function nữa
================
ví dụ 30 tết mà không có độ nhậu
Mã:
Sub Macro1()
Dim SArr, kq As Variant, d As Object, i, j, k As Long
SArr = [c5].Resize([c60000].End(3).Row - 4, 2).Value
ReDim kq(1 To UBound(SArr), 1 To 2)
Set d = CreateObject("Scripting.Dictionary")

For i = 1 To UBound(SArr)
If Not d.exists(SArr(i, 1)) Then
    k = k + 1
    d.Add SArr(i, 1), k
    kq(k, 1) = SArr(i, 1)
    kq(k, 2) = SArr(i, 2)
Else
    kq(d.Item(SArr(i, 1)), 2) = kq(d.Item(SArr(i, 1)), 2) + SArr(i, 2)
End If
Next
[F5:G100].Clear
[F5].Resize(k, 2).Value = kq
 Set d = Nothing
 
End Sub

Cảm ơn anh, 30 Tết vẫn giúp đỡ.
Em mới tập tành VBA thôi, nên em sẽ chọn code tập tành trước.
Em xin hỏi thêm ạ
Phần công thức nhét vào đó, em có copy y nguyên công thức như ở thanh fx để gán vào được không ạ?
Và sau đó em muốn giá trị hiển thị là Value chứ không phải công thức thì làm thế nào? Chứ để công thức thì file rất nặng ạ.
(Ý tưởng em sẽ tạo 01 nút để bấm, mỗi lần có số liệu mới sẽ bấm Cập nhật tính toán)
 
Cảm ơn anh, 30 Tết vẫn giúp đỡ.
Em mới tập tành VBA thôi, nên em sẽ chọn code tập tành trước.
Em xin hỏi thêm ạ
Phần công thức nhét vào đó, em có copy y nguyên công thức như ở thanh fx để gán vào được không ạ?
Và sau đó em muốn giá trị hiển thị là Value chứ không phải công thức thì làm thế nào? Chứ để công thức thì file rất nặng ạ.
(Ý tưởng em sẽ tạo 01 nút để bấm, mỗi lần có số liệu mới sẽ bấm Cập nhật tính toán)

bạn thử quay lại macro các thao tác
- nhập cthuc vào một cell
- fill nó xuống
- copy rồi paste value lại
===
việc copy y chang trên thanh cthuc tôi e là không được, vì trong vba nó tham chiếu dạng RC
 
bạn thử quay lại macro các thao tác
- nhập cthuc vào một cell
- fill nó xuống
- copy rồi paste value lại
===
việc copy y chang trên thanh cthuc tôi e là không được, vì trong vba nó tham chiếu dạng RC

Vậy em chuyển bảng tính về dạng RC và copy công thức trên thanh FX là được đúng không ạ?
 
Có chủ đề nào. Tuyển tập các bài tập VBA từ căn bản đến nâng cao không...
Hay ae có File nào chia sẻ với
 
Mình muốn dùng vba để giải quyết vấn đề:
nếu A1 = error (vd: #N/A, #REF...) thì trả về ô rỗng ("").
nhờ các bạn nào biết chỉ giúp
 
Mình muốn dùng vba để giải quyết vấn đề:
nếu A1 = error (vd: #N/A, #REF...) thì trả về ô rỗng ("").
nhờ các bạn nào biết chỉ giúp
Bạn xem đúng không nhé.
Mã:
Sub linhtinh()
  If Left(Range("A1").Text, 1) = "#" Then
     Range("A1").Value = Empty
  End If
End Sub
 

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

Back
Top Bottom