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:
cầu kỳ hay không là ý cá nhân. Chỉ là hàm của người ta cần 2 tham số, bạn chỉ cung cấp 1 thì nó lỗi là lẽ đương nhiên. Cái đơn giản này mà bạn không biết thì kêu giải thích code làm chi cho mất công.
Rất cảm ơn anh VetMini đã giải đáp, em cũng có suy nghĩ là sai hàm khi áp dụng, nhưng mới học được chút ít nền chưa biết sửa thế nào cho phù hợp thôi ạ.
 
Upvote 0
Theo chỉ dẫn của Thầy NDu, Em xin gửi qua Topic này. Em có file giả định mong mọi người viết code cho phiếu xuất chép qua "Chi tiết xuất hàng". Tự động đánh số thứ tự và báo lỗi khi các cell G3,G4,G5,G6 không có dữ liệu.
 

File đính kèm

  • STT.xlsm
    17.7 KB · Đọc: 27
Upvote 0
Theo chỉ dẫn của Thầy NDu, Em xin gửi qua Topic này. Em có file giả định mong mọi người viết code cho phiếu xuất chép qua "Chi tiết xuất hàng". Tự động đánh số thứ tự và báo lỗi khi các cell G3,G4,G5,G6 không có dữ liệu.
PHP:
Sub PhieuXuat()
Dim Rngs(), i As Long, TieuDe(), kt
With Sheet2
    If .[F8] = "" Then Exit Sub
    kt = Application.CountA(.[G3], .[G4], .[G5], .[G6])
    If kt < 4 Then
      MsgBox "Thieu du lieu"
      Exit Sub
    End If
    Rngs = .Range(.[F8], .[I65536].End(3)).Value
    TieuDe = Array(.[G3].Value, .[G4].Value, .[G5].Value, .[G6].Value)
    .Range("G3:G6, F8:I30").ClearContents
    .[G3].Select
End With
With Sheet1.Range("D65536").End(3)
   .Offset(1, 5).Resize(UBound(Rngs), 4).Value = Rngs
   .Offset(1, 1).Resize(UBound(Rngs), 4).Value = TieuDe
   .Parent.Range("D4", .Parent.[E65536].End(3).Offset(, -1)) = [row(a:a)]
End With
ActiveWorkbook.Save
End Sub
 
Upvote 0
Chào các bác trong GPE!
Em thấy code trên diễn đàn như sau (bài: http://www.giaiphapexcel.com/forum/showthread.php?94949-Giúp-đỡ-Lấy-ra-kết-quả-ra-cột-mới):

Mã:
Sub fill()
With Application
For Each cell In ActiveSheet.UsedRange.Columns(1).Cells
If cell <> "" And .CountIf(Rows(1), cell) Then
Cells(cell.End(xlUp).Row, .Match(cell, Rows(1), 0)).Formula = "=" &cell.Offset(, 2).Address
End If
Next
End With 
End Sub

Em muốn copy giá trị Vật liệu, Nhân công, Máy thi công sang cột I, J, L (như file đính kèm) thì sửa code trên như thế nào ạ, các bác giúp em với.
Chân thành cảm ơn các bác!
Chúc diễn đàn ngày càng phát triển!
 

File đính kèm

  • Test.rar
    209.5 KB · Đọc: 26
Lần chỉnh sửa cuối:
Upvote 0
các anh cho em hỏi về private function marc1(bf0,n,radphi0,radphi)

em có đoạn code này từ trang nước ngoài.em muốn chuyển nó sang một ngôn ngữ khác.
các anh có thể giải thích cho em đoạn M = Marc1(bf0, n, RadPHI0, RadPHI) ma em gạch chân bên dưới ý nghĩa nó như thế nào được không ạ.như ở đây M sẽ lấy giá trị gì từ marc1.
e đang làm trong basic for androi không có kiểu như thế,có thể thay đổi bằng phương pháp tính toán nào khác đc k ạ
em xin cám ơn các anh


Function WGS84LL2North(PHI As Double, LAM As Double)
Dim a, b, e0, f0, n0, PHI0 As Double
a = 6378137
b = 6356752.3141
e0 = 500000
f0 = 0.9996
PHI0 = 0
n0 = 0


'Calculate LAM0 of the UTM zone which the user input Longitude is in
Dim PreZNum As Double
Dim ZNum As Integer
Dim LAM0 As Double
PreZNum = (180 + LAM) / 6 + 1
ZNum = Int(PreZNum)
LAM0 = -(183 - 6 * ZNum)


'Convert angle measures to radians
PI = 3.14159265358979
RadPHI = PHI * (PI / 180)
RadLAM = LAM * (PI / 180)
RadPHI0 = PHI0 * (PI / 180)
RadLAM0 = LAM0 * (PI / 180)

af0 = a * f0
bf0 = b * f0
e2 = ((af0 ^ 2) - (bf0 ^ 2)) / (af0 ^ 2)
n = (af0 - bf0) / (af0 + bf0)
nu = af0 / (Sqr(1 - (e2 * ((Sin(RadPHI)) ^ 2))))
rho = (nu * (1 - e2)) / (1 - (e2 * (Sin(RadPHI)) ^ 2))
eta2 = (nu / rho) - 1
p = RadLAM - RadLAM0

M = Marc1(bf0, n, RadPHI0, RadPHI)


I = M + n0
II = (nu / 2) * (Sin(RadPHI)) * (Cos(RadPHI))
III = ((nu / 24) * (Sin(RadPHI)) * ((Cos(RadPHI)) ^ 3)) * (5 - ((Tan(RadPHI)) ^ 2) + (9 * eta2))
IIIA = ((nu / 720) * (Sin(RadPHI)) * ((Cos(RadPHI)) ^ 5)) * (61 - (58 * ((Tan(RadPHI)) ^ 2)) + ((Tan(RadPHI)) ^ 4))

WGS84LL2North = I + ((p ^ 2) * II) + ((p ^ 4) * III) + ((p ^ 6) * IIIA)

End Function


Private Function Marc1(bf0, n, PHI0, PHI)
Marc1 = bf0 * (((1 + n + ((5 / 4) * (n ^ 2)) + ((5 / 4) * (n ^ 3))) * (PHI - PHI0)) _
- (((3 * n) + (3 * (n ^ 2)) + ((21 / 8) * (n ^ 3))) * (Sin(PHI - PHI0)) * (Cos(PHI + PHI0))) _
+ ((((15 / 8) * (n ^ 2)) + ((15 / 8) * (n ^ 3))) * (Sin(2 * (PHI - PHI0))) * (Cos(2 * (PHI + PHI0)))) _
- (((35 / 24) * (n ^ 3)) * (Sin(3 * (PHI - PHI0))) * (Cos(3 * (PHI + PHI0)))))

End Function
 
Upvote 0
Code 1
Mã:
Private Sub Command1_Click()    
    Dim xlApp As [COLOR=#ff0000]Excel.Application[/COLOR]
    Dim xlWB As [COLOR=#ff0000]Excel.Workbook[/COLOR]
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlWB = xlApp.Workbooks.Open("d:\tor\1.xls")
End Sub

Code 2
Mã:
Private Sub Command1_Click()
    Dim xlApp As [COLOR=#ff0000]Object[/COLOR]
    Dim xlWB As [COLOR=#ff0000]Object[/COLOR]
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    Set xlWB = xlApp.Workbooks.Open("d:\tor\1.xls")
End Sub

Code 2 chạy được, code 1 báo lỗi "user defined type not defined"
Xin hỏi vì sao báo lỗi?

Cảm ơn nhiều.
 
Upvote 0
Không chạy macro ở sheet mong muốn

- Chào các anh chị và các bạn!.
- Mình có viết một macro để sao chép một vùng dữ liệu (Code sử dụng mảng) như sau:

Mã:
Public Sub Tap_Chep()    
    Dim I As Long, J As Long, sArr(), dArr(), K As Long
    With Sheets("Tong_hop")
        sArr = Range("A12:AL52").Value
    End With
    ReDim dArr(1 To UBound(sArr, 1), 1 To 38)
    For I = 1 To UBound(sArr, 1)
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
        For J = 2 To 38
            dArr(K, J) = sArr(I, J)
        Next J
    Next I
    With Sheets("A_1")
        .[A12].Resize(K, 38).Value = dArr
        .[A12].Resize(K, 36).Borders.LineStyle = xlContinuous
        .[A12].Resize(K, 36).Borders(xlInsideHorizontal).Weight = xlHairline
    End With
End Sub

- Các bạn cho mình hỏi vì sao code của mình chỉ cho kết quả khi mình ở sheet Tong_hop để gọi Sub. Còn khi ở sheet A_1 để gọi Sub thì code lại không cho kết quả. Mà mình muốn code cho kết quả khi ở sheet A_1.
Xin cảm ơn !.
 

File đính kèm

  • tap chep.rar
    55.3 KB · Đọc: 27
Lần chỉnh sửa cuối:
Upvote 0
- Chào các anh chị và các bạn!.
- Mình có viết một macro để sao chép một vùng dữ liệu (Code sử dụng mảng) như sau:

Mã:
Public Sub Tap_Chep()    
    Dim I As Long, J As Long, sArr(), dArr(), K As Long
    With Sheets("Tong_hop")
        sArr = Range("A12:AL52").Value
    End With
    ReDim dArr(1 To UBound(sArr, 1), 1 To 38)
    For I = 1 To UBound(sArr, 1)
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
        For J = 2 To 38
            dArr(K, J) = sArr(I, J)
        Next J
    Next I
    With Sheets("A_1")
        .[A12].Resize(K, 38).Value = dArr
        .[A12].Resize(K, 36).Borders.LineStyle = xlContinuous
        .[A12].Resize(K, 36).Borders(xlInsideHorizontal).Weight = xlHairline
    End With
End Sub

- Các bạn cho mình hỏi vì sao code của mình chỉ cho kết quả khi mình ở sheet Tong_hop để gọi Sub. Còn khi ở sheet A_1 để gọi Sub thì code lại không cho kết quả. Mà mình muốn code cho kết quả khi ở sheet A_1.
Xin cảm ơn !.
Bạn sửa lệnh
With Sheets("Tong_hop")
sArr = Range("A12:AL52").Value
End With
thành
sArr = Sheets("Tong_hop").Range("A12:AL52").Value
 
Upvote 0
Bạn sửa lệnh
With Sheets("Tong_hop")
sArr = Range("A12:AL52").Value
End With
thành
sArr = Sheets("Tong_hop").Range("A12:AL52").Value
- Cảm ơn bạn nhé!. Mình sửa theo hướng dẫn của bạn code đã chạy OK!.
- Bạn ơi cho mình hỏi một chút!.
With Sheets("Tong_hop")
sArr = Range("A12:AL52").Value
End With

sArr = Sheets("Tong_hop").Range("A12:AL52").Value
Tại sao lại có sự khác nhau như vậy, theo mình hiều thì đều là gán vùng dữ liệu vào mảng ở sheet Tong_hop; còn khi đưa xuống sheet cần gán dữ liệu thì mình đã đặt trong cum này mà!.
Mã:
With Sheets("A_1")        
        .[A12].Resize(K, 38).Value = dArr
         [A12:AL52].Resize(K) = dArr
        .[A12].Resize(K, 36).Borders.LineStyle = xlContinuous
        .[A12].Resize(K, 36).Borders(xlInsideHorizontal).Weight = xlHairline
    End With
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
With Sheets("A_1")        .[A12].Resize(K, 38).Value = dArr
        '[A12:AL52].Resize(K) = dArr
        .[A12].Resize(K, 36).Borders.LineStyle = xlContinuous
        .[A12].Resize(K, 36).Borders(xlInsideHorizontal).Weight = xlHairline
    End With
- Cảm ơn bạn nhé!. Mình sửa theo hướng dẫn của bạn code đã chạy OK!.
- Bạn ơi cho mình hỏi một chút!.
With Sheets("Tong_hop")
sArr = Range("A12:AL52").Value
End With

sArr = Sheets("Tong_hop").Range("A12:AL52").Value
Tại sao lại có sự khác nhau như vậy, theo mình hiều thì đều là gán vùng dữ liệu vào mảng ở sheet Tong_hop; còn khi đưa xuống sheet cần gán dữ liệu thì mình đã đặt trong cum này mà!.
With Sheets("Tong_hop")
sArr = .Range("A12:AL52").Value
End With
bạn sửa thế xem sao
 
Upvote 0
- Chào các anh chị và các bạn!.
- Mình có viết một macro để sao chép một vùng dữ liệu (Code sử dụng mảng) như sau:

Mã:
Public Sub Tap_Chep()    
    Dim I As Long, J As Long, sArr(), dArr(), K As Long
    With Sheets("Tong_hop")
        sArr = Range("A12:AL52").Value
    End With
    ReDim dArr(1 To UBound(sArr, 1), 1 To 38)
    For I = 1 To UBound(sArr, 1)
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
        For J = 2 To 38
            dArr(K, J) = sArr(I, J)
        Next J
    Next I
    With Sheets("A_1")
        .[A12].Resize(K, 38).Value = dArr
        .[A12].Resize(K, 36).Borders.LineStyle = xlContinuous
        .[A12].Resize(K, 36).Borders(xlInsideHorizontal).Weight = xlHairline
    End With
End Sub

- Các bạn cho mình hỏi vì sao code của mình chỉ cho kết quả khi mình ở sheet Tong_hop để gọi Sub. Còn khi ở sheet A_1 để gọi Sub thì code lại không cho kết quả. Mà mình muốn code cho kết quả khi ở sheet A_1.
Xin cảm ơn !.

Thiếu chỉ một dấu chấm.
With Sheets("Tong_hop")
sArr = .Range("A12:AL52").Value
End With
 
Upvote 0
Thiếu chỉ một dấu chấm.
With Sheets("Tong_hop")
sArr = .Range("A12:AL52").Value
End With
- Em cảm ơn Thầy Ba Tê ạ!.
- Vậy mà em nhìn cả buổi mà không Thấy chỗ thiếu híc híc!.
- Vậy là:
Mã:
[COLOR=#000000][I]With Sheets("Tong_hop")[/I][/COLOR]
[COLOR=#000000][I]sArr = .Range("A12:AL52").Value[/I][/COLOR]
[COLOR=#000000][I]End With[/I][/COLOR]
[COLOR=#000000][I]và [/I][/COLOR]
[COLOR=#000000][I]sArr = Sheets("Tong_hop").Range("A12:AL52").Value
[/I][/COLOR]
Mới không có sự khác nhau!.
 
Upvote 0
Sử dụng with...end with.
Chào mọi người, em muốn hỏi:
Có cách nào thực hiện được việc khi đang ở sheet2 mà sử dụng With ... End with để chọn toàn bộ cells của sheet1 không? Em cảm ơn.
 
Upvote 0
Sử dụng with...end with.
Chào mọi người, em muốn hỏi:
Có cách nào thực hiện được việc khi đang ở sheet2 mà sử dụng With ... End withđể chọn toàn bộ cells của sheet1 không? Em cảm ơn.

bạn ở sheet2 thì làm sao chọn ở sheet1 được
nhưng bạn có thể làm bất cứ thao tác nào, như lấy dữ liệu, filter, hay làm cái gì đó
cái này không được
Mã:
With Sheet1
    .Cells.Select
    End With
nhưng cái này thì được
Mã:
With Sheet1
    .Cells.clear
    End With
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác LetGauGau. Mặc dù chưa được đúng theo ý hiểu của em nhưng sáng nay đọc bài của bác em mò mẫm tiếp thì lại có một kết quả khá thỏa mãn. Giải quyết được nhiều vấn đề vướng mắc lâu nay. Cho em hỏi thêm khi sử dụng with ..end with này có giúp code nhanh hơn không? (hiểu ngây ngô thì kiểu như đang ở sheet2 đỡ phải select về sheet1, thực hiện xong câu lệnh nào đó rồi mới quay lại sheet2, còn nếu đưa vào with thì không cần như thế&&&%$R)
 
Upvote 0
Xin hỏi về 2 dòng code vba này ạ

Các tiền bối cho mình hỏi 2 dòng lệnh này có ý nghĩa gì với ạ:
PHP:
  Range("SPValues").Columns.Hidden = False
        Range(Range("SFStart").Offset(1, 0), Range("SFStart").Offset(1, 6).End(xlDown)).ClearContents
 
Upvote 0
Upvote 0
Cảm ơn bác LetGauGau. Mặc dù chưa được đúng theo ý hiểu của em nhưng sáng nay đọc bài của bác em mò mẫm tiếp thì lại có một kết quả khá thỏa mãn. Giải quyết được nhiều vấn đề vướng mắc lâu nay. Cho em hỏi thêm khi sử dụng with ..end with này có giúp code nhanh hơn không? (hiểu ngây ngô thì kiểu như đang ở sheet2 đỡ phải select về sheet1, thực hiện xong câu lệnh nào đó rồi mới quay lại sheet2, còn nếu đưa vào with thì không cần như thế&&&%$R)

tôi nghĩ nếu bạn bỏ đi mấy cái select thì tốc độ nó sẻ nhanh hơn
ví dụ
Mã:
for i=1 to 1000
   [A1].offset(i).select
   selection.copy
   [B1].offset(i).paste
next
so với
Mã:
for i=1 to 1000
   [B1].offset(i).value=[A1].offset(i).value
next

bạn cho code chạy thì bạn sẻ cảm nhận được cái select
 
Upvote 0
Em có đoạn code mọi người xem có rút ngắn gọn hơn được không ạ?
Mã:
Dim oSelFormulas As Range
    Sheet5.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet5.Protect "123123", True, True, True, True
    Sheet10.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet10.Protect "123123", True, True, True, True
    Sheet12.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet12.Protect "123123", True, True, True, True
    Sheet13.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet13.Protect "123123", True, True, True, True
    Sheet6.Select
        Cells.Locked = False
        Set oSelFormulas = Cells.SpecialCells(xlCellTypeFormulas)
        oSelFormulas.Locked = True
        Sheet6.Protect "123123", True, True, True, True
 
Upvote 0
Web KT
Back
Top Bottom