Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

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


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cảm ơn ndu sáng nay mất điện bây giờ mới xem được bài, Tôi đã test thử cách của bạn kết quả OK.

Trước khi bạn giúp tôi phải dùng hạ sách là cho vùng chọn xuống dưới đường vạch của Freeze Panes
(đổi L2:AU2 -> L4:AU4)sau đó selection.offset(-2,0).Value = Calendar1 kết quả cũng được nhưng người khác thì làm sao biết mà dùng.

Tôi cũng đã xem qua các bài theo đường link của bạn, thì ra vấn đề Freeze Panes không đơn giản chút nào.
 
Lần chỉnh sửa cuối:
Upvote 0
Save and Exit

thanhnhanubnd đã viết:
Nhờ bạn viết dùm mình code để liên kết 2 file excel :
- File A có 01 form, có nút để đóng, lưu file A và mở file B.
- File B tương tự.
- Làm sao để bỏ qua mọi masgbox.
Thank.

Có phải ý bạn muốn thế này không? Xem file
rar.gif
MyFolder.rar (16.1 KB)​
 

File đính kèm

  • MyFolder.rar
    16.1 KB · Đọc: 33
Upvote 0
Từ câu lệnh chọn 2 vùng không liên tục: Range("K8:O28,T8:Y28").Select
Tôi muốn thay số dòng cuối 28 trong câu lệnh này thành & [F65536].End(xlUp).Row + 1 thì phải viết như thế nào ?

Nếu viết là Range("K8:O" & [F65536].End(xlUp).Row + 1, "T8:Y" & [F65536].End(xlUp).Row + 1).Select thì máy chấp nhận nhưng nó chọn luôn 2 vùng thành 1. Nhờ các bạn chỉ giúp chỗ sai trong câu lệnh hoặc viết lại giúp câu lệnh, Thanks!
 
Upvote 0
Từ câu lệnh chọn 2 vùng không liên tục: Range("K8:O28,T8:Y28").Select
Tôi muốn thay số dòng cuối 28 trong câu lệnh này thành & [F65536].End(xlUp).Row + 1 thì phải viết như thế nào ?

Nếu viết là Range("K8:O" & [F65536].End(xlUp).Row + 1, "T8:Y" & [F65536].End(xlUp).Row + 1).Select thì máy chấp nhận nhưng nó chọn luôn 2 vùng thành 1. Nhờ các bạn chỉ giúp chỗ sai trong câu lệnh hoặc viết lại giúp câu lệnh, Thanks!
Anh dùng thử cái này xem:
PHP:
Union(Range("K8:O" & [F65536].End(xlUp).Row + 1), Range("T8:Y" & [F65536].End(xlUp).Row + 1)).Select
Hoặc
PHP:
With Range("K8:O" & [F65536].End(xlUp).Row + 1)
    Union(.Cells, .Offset(, 9)).Select
End With
 
Lần chỉnh sửa cuối:
Upvote 0
Anh dùng thử cái này xem:
PHP:
With Range("K8:O" & [F65536].End(xlUp).Row + 1)
    Union(.Cells, .Offset(, 9)).Select
End With

@ ndu: Cái này nó chọn được 2 vùng riêng biệt nhưng số cột vùng 1 luôn bằng số cột vùng 2. Cách khắc phục. Thanks!
 
Upvote 0
@ ndu: Cái này nó chọn được 2 vùng riêng biệt nhưng số cột vùng 1 luôn bằng số cột vùng 2. Cách khắc phục. Thanks!
Vùng 2 là chổ .Offset(,9) ---> Mặc định nó có số cột = số cột vùng 1 ---> Nếu anh muốn thay đổi số cột thì them Resize vào
Ví dụ: .Offset(,9).Resize(,6) ---> Sẽ chỉnh vùng 2 thành 6 cột
 
Upvote 0
Khi làm việc trên sheet hiện hành thì câu lệnh như sau:
PHP:
Sub Macro1()
 Range("F3:F26").Select   
 Selection = "=SUM(RC[-3]:RC[-1])"
 Selection.Value = Selection.Value
End Sub
Nếu muốn làm tương tự cho một sheet khác (không phải sheet hiện hành hoặc có thể là sheet ẩn) thì viết như thế nào ? Mục đích dùng Selection là để xoá công thức

Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Khi làm việc trên sheet hiện hành thì câu lệnh như sau:
PHP:
Sub Macro1()
 Range("F3:F26").Select   
 Selection = "=SUM(RC[-3]:RC[-1])"
 Selection.Value = Selection.Value
End Sub
Nếu muốn làm tương tự cho một sheet khác (không phải sheet hiện hành hoặc có thể là sheet ẩn) thì viết như thế nào ? Mục đích dùng Selection là để xoá công thức

Thanks!
Ý anh là sao? Có phải anh đang nói đến trường hợp vùng dử liệu nằm ở sheet khác, còn vùng đặt kết quả lại nằm ở 1 sheet khác?
Vậy thì anh ghi thêm tên sheet vào nữa là được!
Ví dụ: Vùng dử liệu nằm tại sheet 2, C3:E26 .. Cò vùng cần đặt kết quả là Sheet1, F3:F26 ---> Anh viết code như sau:
PHP:
Sub Macro1()
 With Sheet1.Range("F3:F26")
  .Value = "=SUM(Sheet2!RC[-3]:RC[-1])"
  .Value = .Value
 End With
End Sub
Ghi tên sheet rõ ràng để có thể đúng bất cứ nơi đâu gọi macro cũng cho kết quả chính xác...
Thêm nữa: Hạn chế vụ Select, nếu không sẽ bị lổi khi anh đang ở 1 sheet, lại đi select 1 sheet đang ẩn
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn ndu: ý mình hỏi là làm thế nào để từ hiện hành (vd đang ở sheet2) mà vẫn thực hiện được trên sheet khác không mở hoặc ẩn (vd sheet1 đang ẩn) mà ra được kết quả như đoạn code trên và đúng như bạn nhắc nhở: đang ở sheet2 tôi muốn xoá công thức ở sheet1 bằng cách dùng selection thì bị lỗi select.

Với đoạn code của bạn tôi chỉ sửa "=SUM(Sheet2!RC[-3]:RC[-1])" -> "=SUM(Sheet1!RC[-3]:RC[-1])" hoặc bỏ Sheet1! -> "=SUM(RC[-3]:RC[-1])" là OK.

Tôi thấy kiểu viết này code chạy cực nhanh (có thể gọi là siêu tốc), tôi đã thử với 10 cột và 65.536 dòng chỉ mất khoảng 0,4 giây.

Điểm mấu chốt ở đây chính là ta đã thực hiện đồng thời gán công thức vào tất cả các ô trong vùng chọn (thay vì dùng vòng lặp quét để gán công thức cho từng ô như vẫn thường làm).

PHP:
Sub Macro1()
    startTime = Timer
        With Sheet1.Range("L3:L65536")
        .Value = "=SUM(RC[-10]:RC[-1])" 
        .Value = .Value
        End With
    EndTime = Timer
    MsgBox "Total Time: " & (EndTime - startTime)
End Sub
 
Upvote 0
Tôi xem bài này http://www.giaiphapexcel.com/forum/showthread.php?t=13005
thấy có nhiều câu từ rất lạ (không thấy trong Macro bao giờ) Tôi muốn nhờ các bạn dịch nôm theo từng dòng xen kẽ (nôm na dòng code đó nói gì). Đặc biệt những từ tôi không hiểu là những từ được tô đậm, màu đỏ. Thanks !

Mã:
Option Explicit
Sub SelectExpandSelectionToLastUsedRow() 
 Dim lRow As Long, Rng As Range    
 If WorksheetFunction.CountA(Cells) > 0 Then 
    Set Rng = Selection 
    lRow = Cells.Find([B][COLOR=Red]What[/COLOR][/B]:="*", [B][COLOR=Red]After[/COLOR][/B]:=Cells(1, 1), Search[COLOR=Red][B]Order[/B][/COLOR]:=[COLOR=Red][B]xlByRows[/B][/COLOR], _ 
        Search[COLOR=Red][B]Direction[/B][/COLOR]:=[B][COLOR=Red]xlPrevious[/COLOR][/B]).Row 
    Set Rng = Rng.Resize(lRow, Rng.Columns.Count)             
    lRow = Rng.Find(What:="*", After:=Rng.Cells(1, 1), SearchOrder:=xlByRows, _ 
        SearchDirection:=xlPrevious).Row 
    Rng.Resize(lRow - Rng.Cells(1, 1).Row + 1, Rng.Columns.Count).Select 
 End If 
End Sub
 
Upvote 0
http://giaiphapexcel.com/forum/showthread.php?t=15116

Tôi xem bài này http://www.giaiphapexcel.com/forum/showthread.php?t=13005
thấy có nhiều câu từ rất lạ (không thấy trong Macro bao giờ) Tôi không hiểu là những từ được tô đậm, màu đỏ. Thanks !
Mã:
    lRow = Cells.Find([B][COLOR=Red]What[/COLOR][/B]:="*", [B][COLOR=Red]After[/COLOR][/B]:=Cells(1, 1), Search[COLOR=Red][B]Order[/B][/COLOR]:=[COLOR=Red][B]xlByRows[/B][/COLOR], _ 
        Search[COLOR=Red][B]Direction[/B][/COLOR]:=[B][COLOR=Red]xlPrevious[/COLOR][/B]).Row

Bạn đến đây & nghiền ngẫn tự ên nha!
 
Upvote 0
Tôi xem bài này http://www.giaiphapexcel.com/forum/showthread.php?t=13005
thấy có nhiều câu từ rất lạ (không thấy trong Macro bao giờ) Tôi muốn nhờ các bạn dịch nôm theo từng dòng xen kẽ (nôm na dòng code đó nói gì). Đặc biệt những từ tôi không hiểu là những từ được tô đậm, màu đỏ. Thanks !

Mã:
Option Explicit
Sub SelectExpandSelectionToLastUsedRow() 
 Dim lRow As Long, Rng As Range    
 If WorksheetFunction.CountA(Cells) > 0 Then 
    Set Rng = Selection 
    lRow = Cells.Find([B][COLOR=Red]What[/COLOR][/B]:="*", [B][COLOR=Red]After[/COLOR][/B]:=Cells(1, 1), Search[COLOR=Red][B]Order[/B][/COLOR]:=[COLOR=Red][B]xlByRows[/B][/COLOR], _ 
        Search[COLOR=Red][B]Direction[/B][/COLOR]:=[B][COLOR=Red]xlPrevious[/COLOR][/B]).Row 
    Set Rng = Rng.Resize(lRow, Rng.Columns.Count)             
    lRow = Rng.Find(What:="*", After:=Rng.Cells(1, 1), SearchOrder:=xlByRows, _ 
        SearchDirection:=xlPrevious).Row 
    Rng.Resize(lRow - Rng.Cells(1, 1).Row + 1, Rng.Columns.Count).Select 
 End If 
End Sub
Cái đó là chức năng Find (trong menu Edit) của Excel thôi anh à!
Anh Record macro quá trình tìm kiếm (bằng Ctrl + F) sẽ thấy
 
Upvote 0
Mình mới học VBA nên còn nhiều chỗ chưa hiểu được. Nhờ các bạn kiểm tra giúp minh cái code này, mình chạy thử cứ đến dòng "đánh đấu" là lỗi.

ActiveSheet.Calculate
n = Range("b4").Value
Sec1:
For i = 8 To n + 7
If Range("H" & i).Value = "C" Then heso = 0.013 Else If Range("H" & i).Value = "CI" Then heso = 0.012 Else heso = 0.011
qdv = Range("K3").Value / Range("D4").Value
q1 = qdv * Range("F" & i).Value
Next
GoTo Congtron

Congtron:
flag = 0
Dk = Range("K" & i) / 10
doday = 0.95
step = 0.05
Slope = Range("O" & i)
Suite3:
X = 2 * doday - 1
X = Atn(X / Sqr(-X * X + 1))
alpha = (X + 3.1416 / 2) * 180 / 3.1416
Pr = alpha * 3.1416 * Dk / 100 / 180
a = (alpha * 3.1416 * 2 / 180 - Sin(2 * 3.1416 * alpha / 180)) / 8 * Dk ^ 2 / 100 ^ 2
Rh = a / Pr
lamda = 2.5 * heso ^ 0.5 - 0.13 - 0.75 * Rh ^ 0.5 * (heso ^ 0.5 - 0.1)
V2 = Sqr(Rh * Slope / 1000) * Rh ^ lamda / heso
q2 = a * V2
If flag = 1 Then GoTo Suite1
If q1 > q2 Then GoTo modif
GoTo Suite2
Suite1:
If q1 < q2 Then GoTo Suite2
doday = doday + step
step = step / 10
Suite2:
flag = 1
doday = doday - step
If step > 0.0001 Then GoTo Suite3
Range("Q" & i) = doday
GoTo Sec2
modif:
Range("K" & i).Select
UserForm1.Show
Sec2:
For i = 8 To n + 7
Range("I" & i).Value = qdv
Range("J" & i).Value = q1
Range("M" & i).Value = doday * Range("K" & i)
Range("N" & i).Value = V2
Range("P" & i).Value = (Range("O" & i).Value * Range("D" & i).Value) / 1000
Next
GoTo Fin
Fin:
End Sub
 
Upvote 0
Mình mới học VBA nên còn nhiều chỗ chưa hiểu được. Nhờ các bạn kiểm tra giúp minh cái code này, mình chạy thử cứ đến dòng "đánh đấu" là lỗi.

ActiveSheet.Calculate
n = Range("b4").Value
Sec1:
For i = 8 To n + 7
If Range("H" & i).Value = "C" Then heso = 0.013 Else If Range("H" & i).Value = "CI" Then heso = 0.012 Else heso = 0.011
qdv = Range("K3").Value / Range("D4").Value
q1 = qdv * Range("F" & i).Value
Next
GoTo Congtron

Congtron:
flag = 0
Dk = Range("K" & i) / 10
doday = 0.95
step = 0.05
Slope = Range("O" & i)
Suite3:
X = 2 * doday - 1
X = Atn(X / Sqr(-X * X + 1))
alpha = (X + 3.1416 / 2) * 180 / 3.1416
Pr = alpha * 3.1416 * Dk / 100 / 180
a = (alpha * 3.1416 * 2 / 180 - Sin(2 * 3.1416 * alpha / 180)) / 8 * Dk ^ 2 / 100 ^ 2
Rh = a / Pr
lamda = 2.5 * heso ^ 0.5 - 0.13 - 0.75 * Rh ^ 0.5 * (heso ^ 0.5 - 0.1)
V2 = Sqr(Rh * Slope / 1000) * Rh ^ lamda / heso
q2 = a * V2
If flag = 1 Then GoTo Suite1
If q1 > q2 Then GoTo modif
GoTo Suite2
Suite1:
If q1 < q2 Then GoTo Suite2
doday = doday + step
step = step / 10
Suite2:
flag = 1
doday = doday - step
If step > 0.0001 Then GoTo Suite3
Range("Q" & i) = doday
GoTo Sec2
modif:
Range("K" & i).Select
UserForm1.Show
Sec2:
For i = 8 To n + 7
Range("I" & i).Value = qdv
Range("J" & i).Value = q1
Range("M" & i).Value = doday * Range("K" & i)
Range("N" & i).Value = V2
Range("P" & i).Value = (Range("O" & i).Value * Range("D" & i).Value) / 1000
Next
GoTo Fin
Fin:
End Sub
 
Upvote 0
Cảm ơn Bác HYen: đọc mãi mới hiểu là Bác chỉ bài theo đường link này http://giaiphapexcel.com/forum/showthread.php?t=15116

Loạt bài này em đã xem qua khi mới đăng nhưng không nhớ ra, em sẽ nghiên cứu tiếp nếu có gì chưa hiểu Bác lại giúp em nha.
 
Upvote 0
Em có viết đoạn code tra bảng nội suy bảng 2 chiều nhưng không hiểu sao nó không chạy nữa. Cái bảng này của e nó lại khác kiểu so với các ví dụ đã có ở diến đàn. Mong các bác kiểm tra giúp em. Em xin chân thành cảm ơn. Chúc các bác và gia đình luôn mạnh khỏe.
Đoạn Code như sau:

Function CalE(vungtra As Range, R As Double, V As Double) As Double
'Ham noi suy gia tri e tu R va V cho truoc
Dim ktra As Boolean
Dim i As Integer
Dim r1 As Double, r2 As Double, e1 As Double, e2 As Double
For i = 1 To vungtra.Cells.Count
kiemtra = False
Select Case V
Case V = 20
If vungtra.Cells(i, 2) >= R And vungtra.Cells(i + 1, 2) <= R Then
r1 = vungtra.Cells(i, 2): r2 = vungtra.Cells(i + 1, 2)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 30
If vungtra.Cells(i, 3) >= R And vungtra.Cells(i + 1, 3) <= R Then
r1 = vungtra.Cells(i, 3): r2 = vungtra.Cells(i + 1, 3)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 40
If vungtra.Cells(i, 4) >= R And vungtra.Cells(i + 1, 4) <= R Then
r1 = vungtra.Cells(i, 4): r2 = vungtra.Cells(i + 1, 4)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 50
If vungtra.Cells(i, 5) >= R And vungtra.Cells(i + 1, 5) <= R Then
r1 = vungtra.Cells(i, 5): r2 = vungtra.Cells(i + 1, 5)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 60
If vungtra.Cells(i, 6) >= R And vungtra.Cells(i + 1, 6) <= R Then
r1 = vungtra.Cells(i, 6): r2 = vungtra.Cells(i + 1, 6)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 70
If vungtra.Cells(i, 7) >= R And vungtra.Cells(i + 1, 7) <= R Then
r1 = vungtra.Cells(i, 7): r2 = vungtra.Cells(i + 1, 7)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 80
If vungtra.Cells(i, 8) >= R And vungtra.Cells(i + 1, 8) <= R Then
r1 = vungtra.Cells(i, 8): r2 = vungtra.Cells(i + 1, 8)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 90
If vungtra.Cells(i, 9) >= R And vungtra.Cells(i + 1, 9) <= R Then
r1 = vungtra.Cells(i, 9): r2 = vungtra.Cells(i + 1, 9)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 100
If vungtra.Cells(i, 10) >= R And vungtra.Cells(i + 1, 10) <= R Then
r1 = vungtra.Cells(i, 10): r2 = vungtra.Cells(i + 1, 10)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 110
If vungtra.Cells(i, 11) >= R And vungtra.Cells(i + 1, 11) <= R Then
r1 = vungtra.Cells(i, 11): r2 = vungtra.Cells(i + 1, 11)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 120
If vungtra.Cells(i, 12) >= R And vungtra.Cells(i + 1, 12) <= R Then
r1 = vungtra.Cells(i, 12): r2 = vungtra.Cells(i + 1, 12)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 130
If vungtra.Cells(i, 13) >= R And vungtra.Cells(i + 1, 13) <= R Then
r1 = vungtra.Cells(i, 13): r2 = vungtra.Cells(i + 1, 13)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
End Select
End Function
 

File đính kèm

  • Super_Elevation_AASHTO.xls
    57.5 KB · Đọc: 7
Upvote 0
Các bác ơi
Em xin hỏi là khi nào mình dùng đến Set
ví dụ
Dim Rng As Range
Set Rng = Application.InputBox _

nếu dùng thế cuối đoạn code có cần set lại = nothing không?

-----
Em đã search lại nhưng ko thấy, mạn phép hỏi lại

Thanks các bác
 
Upvote 0
Các bác ơi
Em xin hỏi là khi nào mình dùng đến Set
ví dụ


nếu dùng thế cuối đoạn code có cần set lại = nothing không?

-----
Em đã search lại nhưng ko thấy, mạn phép hỏi lại

Thanks các bác
Theo chổ tôi biết thì Set thường dùng để khai báo 1 vùng hoặc 1 Object (gần giống Define name ấy)
Còn chuyện Set... = nothing thì... tùy thói quen... Tôi thấy cũng chẳng cần, sau khi chạy xong code, biến sẽ tự giải phóng khỏi bộ nhớ (Nếu biến nằm dưới tên Sub)
Bạn xem bài này:
http://www.giaiphapexcel.com/forum/showpost.php?p=94013&postcount=12
 
Upvote 0
Em có viết đoạn code tra bảng nội suy bảng 2 chiều nhưng không hiểu sao nó không chạy nữa. Cái bảng này của e nó lại khác kiểu so với các ví dụ đã có ở diến đàn. Mong các bác kiểm tra giúp em. Em xin chân thành cảm ơn. Chúc các bác và gia đình luôn mạnh khỏe.
Đoạn Code như sau:

Function CalE(vungtra As Range, R As Double, V As Double) As Double
'Ham noi suy gia tri e tu R va V cho truoc
Dim ktra As Boolean
Dim i As Integer
Dim r1 As Double, r2 As Double, e1 As Double, e2 As Double
For i = 1 To vungtra.Cells.Count
kiemtra = False
Select Case V
Case V = 20
If vungtra.Cells(i, 2) >= R And vungtra.Cells(i + 1, 2) <= R Then
r1 = vungtra.Cells(i, 2): r2 = vungtra.Cells(i + 1, 2)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 30
If vungtra.Cells(i, 3) >= R And vungtra.Cells(i + 1, 3) <= R Then
r1 = vungtra.Cells(i, 3): r2 = vungtra.Cells(i + 1, 3)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 40
If vungtra.Cells(i, 4) >= R And vungtra.Cells(i + 1, 4) <= R Then
r1 = vungtra.Cells(i, 4): r2 = vungtra.Cells(i + 1, 4)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 50
If vungtra.Cells(i, 5) >= R And vungtra.Cells(i + 1, 5) <= R Then
r1 = vungtra.Cells(i, 5): r2 = vungtra.Cells(i + 1, 5)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 60
If vungtra.Cells(i, 6) >= R And vungtra.Cells(i + 1, 6) <= R Then
r1 = vungtra.Cells(i, 6): r2 = vungtra.Cells(i + 1, 6)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 70
If vungtra.Cells(i, 7) >= R And vungtra.Cells(i + 1, 7) <= R Then
r1 = vungtra.Cells(i, 7): r2 = vungtra.Cells(i + 1, 7)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 80
If vungtra.Cells(i, 8) >= R And vungtra.Cells(i + 1, 8) <= R Then
r1 = vungtra.Cells(i, 8): r2 = vungtra.Cells(i + 1, 8)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 90
If vungtra.Cells(i, 9) >= R And vungtra.Cells(i + 1, 9) <= R Then
r1 = vungtra.Cells(i, 9): r2 = vungtra.Cells(i + 1, 9)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 100
If vungtra.Cells(i, 10) >= R And vungtra.Cells(i + 1, 10) <= R Then
r1 = vungtra.Cells(i, 10): r2 = vungtra.Cells(i + 1, 10)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 110
If vungtra.Cells(i, 11) >= R And vungtra.Cells(i + 1, 11) <= R Then
r1 = vungtra.Cells(i, 11): r2 = vungtra.Cells(i + 1, 11)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 120
If vungtra.Cells(i, 12) >= R And vungtra.Cells(i + 1, 12) <= R Then
r1 = vungtra.Cells(i, 12): r2 = vungtra.Cells(i + 1, 12)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
Case V = 130
If vungtra.Cells(i, 13) >= R And vungtra.Cells(i + 1, 13) <= R Then
r1 = vungtra.Cells(i, 13): r2 = vungtra.Cells(i + 1, 13)
e1 = vungtra.Cells(i, 1): e2 = vungtra.Cells(i + 1, 1)
CalE = (e2 - e1) * (r1 - R) / (r1 - r2) + e1
ktra = True
End If
Next i
If ktra = False Then
MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
Exit Function
End If
End Select
End Function

Ôi không bác nào giúp em sao?
 
Upvote 0
Các bác ơi Em xin hỏi là khi nào mình dùng đến Set
ví dụ

nếu dùng thế cuối đoạn code có cần set lại = nothing không?
-----

Có khi đến giữa chừng của chương trình, nhưng muốn xài biến đối tượng đó vô việc khác thì ta cũng nên Set nó thành Nothing Với ví dụ sau:
PHP:
 Dim Rng As Range, sRng As Range
 Set Rng= Range([A2, [B3].End(xlDown))
 Set sRng= Rng.FIND("GPE", , , xlPart)
' . . . . . . . . '
' Để xài việc nữa, ta nên '
 
Set Rng = Nothing
' Sau đó lại '
 Set Rng= Union(sRng, cRng) ' . . . . ' 
 
' . . . . . . . . '
End Sub

Bạn xem ví dụ cụ thể sau:
PHP:
Sub ColorAndCopy()
 Dim Sh As Worksheet:                     Dim MyAdd As String
 Dim Rng As Range, sRng As Range, cRng As Range
 Dim jJ As Long, eRw As Long
 
1 ' Add Font Color Or Interior Color '
 Set Sh = Sheets("SP")
 Set Rng = Sh.Range(Sh.[c10], Sh.[c65500].End(xlUp))
 Sheets("PM").Select:         eRw = [d65500].End(xlUp).Row
 For jJ = 2 To eRw
   With Cells(jJ, "G")
      If .Value <> "" Then
         Set sRng = Rng.Find(.Value, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
               sRng.Font.ColorIndex = 3
               .Interior.ColorIndex = 35
               Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         End If
      End If
   End With
 Next jJ
2 ' Copy From None Color "SP" '
 Sheets("KQ").Select:            Cells.Clear
 [a1].Resize(, 9).Value = Sheets("PM").[a1].Resize(, 9).Value
 eRw = Sh.[A65500].End(xlUp).Row
 Set Rng = Sh.Range(Sh.[c11], Sh.Cells(eRw, "C"))
 For Each sRng In Rng
   With sRng
      If .Value <> "" And .Font.ColorIndex <> 3 Then
         Set cRng = Cells(65500, "C").End(xlUp)
         cRng.Offset(1).Value = .Offset(, -1).Value
         cRng.Offset(1, 5).Value = .Value
         cRng.Offset(1, 6).Value = .Offset(, 2).Value
      End If
   End With
 Next sRng
3 ' Copy From "PM" '
 Set Rng = Nothing
 Set Sh = Sheets("PM"):          eRw = Sh.[d65500].End(xlUp).Row
 For jJ = 2 To eRw
   With Sh.Cells(jJ, "G")
      If .Value <> "" And .Interior.ColorIndex <> 35 Then
         If Rng Is Nothing Then
            Set Rng = .Offset(, -6).Resize(, 9)
         Else
            Set Rng = Union(Rng, .Offset(, -6).Resize(, 9))
         End If
      End If
   End With
 Next jJ
 Rng.Copy Destination:=[c65500].End(xlUp).Offset(1, -2)
End Sub


Chúc vui.
 
Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom