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 (3 người xem)

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

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

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:
XIn các bác chỉ dẫn dùm cho mình vấn đề này:

Trong ổ D:\ của mình có các folder sau : vb1, vb2,.....
Bây giờ mình đánh văn bản mới nếu Cell A1 có chữ vb1 thì khi save nó save tự động vào d:\vb1. Tương tự với vb2
Với tên file là chuỗi bao gồm "tenvanban+ngaythangnam+giophutgiay.xls"
Mong các bác chỉ giáo!!!!

Bạn xen thử file đính kèm xem sao!
 

File đính kèm

Upvote 0
cám ơn các bạn, mình chỉ muốn hiểu ý nghĩa của đoạn code thôi, còn làm gì mình ko để ý, vì đây là đoạn code trong 1 source mà mình phải tìm hiểu, mình chỉ biết nó sẽ trả về kết quả là địa chỉ của 1 ô nào đó thôi
 
Upvote 0
Hỏi code tạo sổ chi tiết

Mình vận dụng hướng dẫn bài học VBA trên diễn đàn để tạo sổ chi tiết,nhưng làm hoài mà không được ,xin SỬA lại dùm maccro INOSOCHITIET1 để nó có thể chạy được.Chân thành cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
qua kho de giai thich can ke

mình cần hiểu và làm theo nhưng ko biết cách đọc các bạn giúp mình với.
Sub SAVING_data()

If Cells.Find(What:=BL_NO, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False) Is Nothing Then
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Else
Cells.Find(What:=BL_NO, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Activate
End If
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Application.CutCopyMode = False
ActiveCell.Select
ActiveWorkbook.Save

End Sub
Sub SAVE_Bien_ban()


BL_NO = Range("s5")
If BL_NO = "" Then
MsgBox ("Yeu cau nhap so BIEN BAN vao S5")
Exit Sub
End If
Range("'Link'!A2:AZ2").Copy
Sheets("Data").Select
Range("A1").Select
Application.Run ("SAVING_data")
Sheets("Bien ban").Select
End Sub
Sub VIEW_bien_ban()
So_xem = Range("a1")
cotdl = 1
Range("s5") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Cells(11, 7) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Cells(13, 15) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Cells(14, 15) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Cells(15, 15) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Range("f19") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Range("o19") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Range("u19") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Range("f20") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Range("o20") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Range("u20") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1

For hang = 21 To 29
For cot = 12 To 13
Cells(hang, cot) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Next cot
Next hang
cotdl = 30
For hang = 30 To 37
Cells(hang, 12) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl + 1
Next hang

Range("f5").Select
End Sub

Sub Nhap_Bien_ban_moi()

Sheets("data").Select
Range("a1").Select
Selection.End(xlDown).Select
Bien_ban_moi_so = ActiveCell.Row() - 1
Sheets("Bien ban").Select
Range("g11") = Now()

If Range("a5") = "" Then
MsgBox ("Yeu cau chon LOAI BIEN BAN CAN NHAP roi nhap tiep sau")
Exit Sub
End If
If Range("a5") = 1 Then
Range("S5") = "GX-" & Year(Now) & "-" & Bien_ban_moi_so
Else
If Range("a5") = 2 Then
Range("S5") = "NX-" & Year(Now) & "-" & Bien_ban_moi_so
End If
End If
Range("o15:S15,F19:K20,o19:r20,u19:u20,l21:l29,l21:u29,l30:u35").ClearContents
Range("A6").Select
End Sub
 
Upvote 0
Upvote 0
Private Sub Cmd_Loc_Click()
On Error GoTo ErrorHandling
Dim ConnStr As String, conn As Object
Dim strSQL As String
Dim rs
ConnStr = "driver={Microsoft ODBC for Oracle}; server=QLT; uid=qlt_read; pwd=qlt_read"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = ConnStr
conn.Open
strSQL = "SELECT QLT_CTU_HDR.TIN, QLT_CTU_HDR.TEN_DTNT, QLT_CTU_DTL.CCG_MA_CAP, QLT_CTU_DTL.CCG_MA_CHUONG, QLT_CTU_DTL.TMT_MA_MUC, QLT_CTU_DTL.TMT_MA_TMUC, QLT_CTU_HDR.SO_CTU, QLT_CTU_DTL.SO_TIEN, QLT_CTU_HDR.NGAY_NOP_KB, QLT_CTU_HDR.DCT_LOAI FROM QLT_OWNER.QLT_CTU_DTL QLT_CTU_DTL, QLT_OWNER.QLT_CTU_HDR QLT_CTU_HDR WHERE QLT_CTU_HDR.ID = QLT_CTU_DTL.CTH_ID AND ((QLT_CTU_HDR.NGAY_NOP_KB Between {ts '2008-11-01 00:00:00'} And {ts '2008-11-30 00:00:00'}) AND (QLT_CTU_HDR.DCT_LOAI='05'))"
Set rs = CreateObject("ADODB.Recordsets")
rs.Open strSQL
If rs Is Nothing Then
MsgBox "Kh«ng cã b¶n ghi nµo tho¶ m·n!", vbExclamation, ThisWorkbook.Name
Else
'Worksheets.Select
Cells(1, 1).Select
n = 0
Do Until n = rs.Fields.Count
Cells(1, n + 1) = rs.Fields.Item(n).Name
n = n + 1
Loop
Cells(2, 1).CopyFromRecordset rs
End If
rs.Close
conn.Close
Exit Sub
ErrorHandling:
MsgBox Err.Description
End Sub
Đoạn code trên bị lỗi khi mở recordset, Ai làm vấn đề này rồi giúp mình với!
 
Upvote 0
Doạn mã trên được sửa lại như sau:
<code>
On Error GoTo ErrorHandling
Dim ConnStr As String, conn As Object
Dim strSQL As String
Dim rs As Object

Range("A10: I2000").Delete ' xóa kết quả cũ đi
Range("A10: I2000").Font.Name = ".VnTime"
Range("A10: I2000").Font.Size = 11
df = Txt_Dfrom.Value
dt = Txt_Dto.Value
tm = Txt_Mst.Text
ConnStr = "driver={Microsoft ODBC for Oracle}; server=QLT; uid=qlt_read; pwd=qlt_read"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = ConnStr
conn.Open
If tm = "" Then
strSQL = "SELECT QLT_CTU_HDR.TIN, QLT_CTU_HDR.TEN_DTNT, QLT_CTU_DTL.CCG_MA_CAP, QLT_CTU_DTL.CCG_MA_CHUONG, QLT_CTU_DTL.TMT_MA_MUC, QLT_CTU_DTL.TMT_MA_TMUC, QLT_CTU_HDR.SO_CTU, QLT_CTU_DTL.SO_TIEN/1, QLT_CTU_HDR.NGAY_NOP_KB FROM QLT_OWNER.QLT_CTU_DTL QLT_CTU_DTL, QLT_OWNER.QLT_CTU_HDR QLT_CTU_HDR WHERE QLT_CTU_HDR.ID = QLT_CTU_DTL.CTH_ID AND ((QLT_CTU_HDR.NGAY_NOP_KB Between '" & df & "' And '" & dt & "') AND (QLT_CTU_HDR.DCT_LOAI='04'))"
Else
strSQL = "SELECT QLT_CTU_HDR.TIN, QLT_CTU_HDR.TEN_DTNT, QLT_CTU_DTL.CCG_MA_CAP, QLT_CTU_DTL.CCG_MA_CHUONG, QLT_CTU_DTL.TMT_MA_MUC, QLT_CTU_DTL.TMT_MA_TMUC, QLT_CTU_HDR.SO_CTU, QLT_CTU_DTL.SO_TIEN/1, QLT_CTU_HDR.NGAY_NOP_KB FROM QLT_OWNER.QLT_CTU_DTL QLT_CTU_DTL, QLT_OWNER.QLT_CTU_HDR QLT_CTU_HDR WHERE QLT_CTU_HDR.ID = QLT_CTU_DTL.CTH_ID AND ((QLT_CTU_HDR.NGAY_NOP_KB Between '" & df & "' And '" & dt & "') AND (QLT_CTU_HDR.DCT_LOAI='04') AND QLT_CTU_HDR.TIN='" & tm & "')"
End If
' Ngày có thể là kiểu: {ts '2008-01-01 00:00:00'} And {ts '2008-11-30 00:00:00'}
Set rs = CreateObject("ADODB.Recordset")
Set rs = conn.Execute(strSQL)
'rs.Open strSQL
If rs Is Nothing Then
MsgBox "Không có dữ liệu nào thỏa mãn!", vbExclamation, ThisWorkbook.Name
Else
'Worksheets.Select
Cells(10, 1).Select ' Ghi dữ liệu từ dòng 10
n = 0
Do Until n = rs.Fields.Count
Cells(10, n + 1) = rs.Fields(n).Name
n = n + 1
Loop
Cells(11, 1).CopyFromRecordset rs
End If
rs.Close
conn.Close
Range("A10:I10").Delete ' xóa dòng tiêu đề == tên trường
Exit Sub
ErrorHandling:
MsgBox Err.Description ' Msgbox "Không kết nối được CSDL hoặc sai điều kiện"
End Sub
</code>
Mình đã kết nối thành công và có thể đưa bất cứ điều kiện nào vào để lấy ra dữ liệu theo ý muốn.
 
Upvote 0
Doạn mã trên được sửa lại như sau:

Mình đã kết nối thành công và có thể đưa bất cứ điều kiện nào vào để lấy ra dữ liệu theo ý muốn.
Nếu có thể bạn cho 1 ví dụ. Rất cám ơn! Mấy cái này mình rất muốn nghiên cứu mà khó hiểu quá.
 
Upvote 0
Mình muốn select lần lượt từng ô dạng: Cells(i, j) i = X->A; j = Y->B để gán công thức;
Mình dùng code: Range(...). Slelect nhưng thấy nó chỉ cho range ô cụ thể.
Có thể cho Range(...). Select chạy với dạng ô (i,j) ở trên được ko nhỉ. Hay có code tương đương ko ?
Các bạn chỉ giúp.
Thanks a lot
 
Upvote 0
Các bác chỉ dùm em trong VB có hàm nào giống hàm date trong excel không a?
 
Upvote 0
Hi All,

Hai doan code nay minh hoc duoc tren giaiphapexcel, nhung khi ap dung vao cung 1 workbook thi khong biet ghep nhu the nao cho dung. Cac ban xem giup voi nhe. (Minh khong ranh lam ve VBA.. :-)). Many thanks, lnt

** doan code nay dung de xoa cac sheet trong workbook neu ngay hien tai nho hon ngay duoc chi dinh
Private Sub Workbook_Open()
Dim ws As Worksheet
Application.DisplayAlerts = False
If Date > #12/30/2008# Then
For Each ws In Worksheets
On Error Resume Next
ws.Delete
Next
Range("a:o").Clear
Application.DisplayAlerts = True
End If
End Sub

** Doan code nay cho phep su dung tinh nang Group and Outline tren bang tinh bi khoa
Private Sub Workbook_Open()
With Sheet1
.Protect Password:="Secret", UserInterfaceOnly:=True
.EnableOutlining = True
End With
End Sub
 
Upvote 0
em muốn tính ngày cuối cùng của tháng là ngày nào, trong excel thì em làm được như sau: day(date(year(x),month(x)+1,0)
nhưng em không biết làm thế nào trong VB, vì không có hàm date.
Em thử hàm now của bác nhưng chưa được, nhờ bác chỉ chi tiết với a!
 
Upvote 0
em muốn tính ngày cuối cùng của tháng là ngày nào, trong excel thì em làm được như sau: day(date(year(x),month(x)+1,0)
nhưng em không biết làm thế nào trong VB, vì không có hàm date.
Em thử hàm now của bác nhưng chưa được, nhờ bác chỉ chi tiết với a!
Trong VB bạn có thể dùng hàm này DateSerial. Cấu trúc cũng giống với hàm Date của excel.
 
Upvote 0
em muốn tính ngày cuối cùng của tháng là ngày nào, trong excel thì em làm được như sau: day(date(year(x),month(x)+1,0)
nhưng em không biết làm thế nào trong VB, vì không có hàm date.
Em thử hàm now của bác nhưng chưa được, nhờ bác chỉ chi tiết với a!
Ah... xin lổi... đọc nhoáng qua, cứ tưởng là TODAY()... Vậy thì dùng DATESERIAL như Rollover79 vừa nói
 
Upvote 0
Chào các bạn , mình có đoạn code này , chẳng biết sai gì mà chạy không đúng ý đồ , mời các bạn xem file và giúp dùm , cảm ơn

Sub DmTG()
dm = 0
For i = 7 To 21
On Error Resume Next
k = Application.WorksheetFunction.Match("*" & Cells(i, 3) & "*", [I8:I10], 0)
If k > 0 Then
h = Cells(i, 4)
End If
dm = h + dm
Next
Cells(12, 10) = dm
End Sub
 

File đính kèm

Upvote 0
Chào các bạn , mình có đoạn code này , chẳng biết sai gì mà chạy không đúng ý đồ , mời các bạn xem file và giúp dùm , cảm ơn

Sub DmTG()
dm = 0
For i = 7 To 21
On Error Resume Next
k = Application.WorksheetFunction.Match("*" & Cells(i, 3) & "*", [I8:I10], 0)
If k > 0 Then
h = Cells(i, 4)
End If
dm = h + dm
Next
Cells(12, 10) = dm
End Sub
Sửa lại:
PHP:
Sub DmTG()
  Dim i As Long, dm As Double
  For i = 7 To 21
    If WorksheetFunction.CountIf([I8:I10], "*" & Cells(i, 3) & "*") > 0 Then
      dm = Cells(i, 4) + dm
    End If
  Next
  Cells(12, 10) = dm
End Sub
Làm chi mà nhiều biến thế chứ
Thêm nữa... bài này công thức cũng ra mà:
PHP:
=SUMPRODUCT((COUNTIF($I$8:$I$10,"*"&$C$7:$C$21&"*"))*($D$7:$D$21))
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ Hoangdanh và anh em

Tôi có một file (c:\dulieu\doanhso.xls) có trường Doanhso và trường Tenhang, và file (c:\dulieu\tonghop.xls) có trường Tenhang,TongDT. tôi muốn tính tổng doanh số của từng mặt hàng bên file doanhso.xls rồi ghi giá trị sang file tổng hợp nhưng không muốn mở thủ công file doanhso.xls làm cách nào mong bạn và các chuyên gia Excel giúp đỡ.
Có file đính kèm!
 

File đính kèm

Upvote 0
Tôi có một file (c:\dulieu\doanhso.xls) có trường Doanhso và trường Tenhang, và file (c:\dulieu\tonghop.xls) có trường Tenhang,TongDT. tôi muốn tính tổng doanh số của từng mặt hàng bên file doanhso.xls rồi ghi giá trị sang file tổng hợp nhưng không muốn mở thủ công file doanhso.xls làm cách nào mong bạn và các chuyên gia Excel giúp đỡ.
Có file đính kèm!
Cái này dùng Consolidate là nhanh gọn nhất ---> Khỏi cần Open source file
PHP:
Sub TongHop()
  Dim SrcRng As String
  SrcRng = "'" & ThisWorkbook.Path & "\[doanhso.xls]Sheet1'!R2C2:R1000C3"
  With Range("A1").CurrentRegion.Offset(1)
    .Clear
    .Consolidate SrcRng, 9, , True
  End With
End Sub
 

File đính kèm

Upvote 0
Tôi có một file (c:\dulieu\doanhso.xls) có trường Doanhso và trường Tenhang, và file (c:\dulieu\tonghop.xls) có trường Tenhang,TongDT. tôi muốn tính tổng doanh số của từng mặt hàng bên file doanhso.xls rồi ghi giá trị sang file tổng hợp nhưng không muốn mở thủ công file doanhso.xls làm cách nào mong bạn và các chuyên gia Excel giúp đỡ.
Có file đính kèm!
SUMIF có thể bị lổi nếu tham chiếu nằm trên 1 Workbook khác và Workbook này đang đóng!
Giãi pháp: Dùng SUMPRODUCT
 
Upvote 0
Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!
 
Upvote 0
Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!
Câu hỏi rất hay nhưng cũng.. hơi.. buồn cười...
Tôi thì làm khác: Cố gắng hạn chế càng ít biến càng tốt (trong 1 vài trường hợp With.. End With có thể làm tốt việc này)
 
Upvote 0
Em thì khác khai báo vài biến thôi! Rồi dùng lại các biến này nếu nó đã hết nhiệm vụ trong quá trình xữ lý. Vậy đâu cần nhiều mà vẫn đủ!
Chúc vui.
Thân.
 
Upvote 0
Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!
Sao Thu Nghi không khai báo biến mảng?
Mã:
Dim Ma As Variant
For i = 1 to 99
Ma(i) = ...
Next

Nếu lấy giá trị trên sheet còn khoẻ nữa:

Mã:
Dim Ma As Variant
Ma=Range("A1:A100").Value
 
Upvote 0
Thú thật do trình độ nên không dám dùng lại biến, mà không khai thì nó không chạy, nhất là các biến endRow hoặc EndR dễ nhầm lẫn giữa các sheet. Lúc viết code mình hay copy đọan khai biến sẵn có và cứ thế mà "phang".
Rất cám ơn các bạn.
Còn một vấn đề nữa, có cách gì để loại bỏ bớt biến đã khai mà không sử dụng. Sợ dư thì cũng phí.
 
Upvote 0
Bác không để ý chứ 1 chức năng có thể quét các vấn đề này là Debug -> Debug cho phép quét xem code có đúng hay không thôi. Bác có thể thấy nó kế lệnh Run trên menu VBA đó -> Click vào và chọn Compile VBAProject. Và nếu có dư hoặc thiếu thì nó sẽ báo ngay.
Còn việc dùng như thế nào thì còn tùy thuộc vào tình huống nữa bác ơi, nói khơi khơi thì không thể hiểu được đâu.
Đành phải chờ dịp khác vậy!
Thân.
 
Upvote 0
Lúc viết code mình hay copy đọan khai biến sẵn có và cứ thế mà "phang". Còn một vấn đề nữa, có cách gì để loại bỏ bớt biến đã khai mà không sử dụng. Sợ dư thì cũng phí.
Mình có mẹo vặt sau:
*/ Vô hiệu hóa hoàn toàn các khai báo biến;
*/ Thêm từ Option Explicit vô trên macro;
*/ Thử chạy trình biên dịch để kiểm tra;
*/ Nếu biến nào bị báo thiếu khai báo thì hiệu lực nó lại

Còn muốn dùng lại biến, thì trước tiên ta dùng 'Tìm kiếm' từng biến một. Mục đích là đến chổ nào thì hết dùng nó trong đoạn mã; Đánh dấu '* [TenBien] để biết đến dòng lệnh đó là hết xài nó;
Lưu í các vòng lặp cần kết thúc một cách tường minh
Không phải là
Mã:
 . . . . . . 
           Next
Next

Mà là
PHP:
  . . . . . 
          Next GPE
Next Rng


Sau đó, cứ sau dòng lệnh được đánh dấu ta xài biến vô việc khác, nếu cùng kiểu dữ liệu
Dần dần sẽ tích lũy các mẹo này thôi.

Chúc bạn thành công.:-=
 
Lần chỉnh sửa cuối:
Upvote 0
Bác không để ý chứ 1 chức năng có thể quét các vấn đề này là Debug -> Debug cho phép quét xem code có đúng hay không thôi. Bác có thể thấy nó kế lệnh Run trên menu VBA đó -> Click vào và chọn Compile VBAProject. Và nếu có dư hoặc thiếu thì nó sẽ báo ngay.
Còn việc dùng như thế nào thì còn tùy thuộc vào tình huống nữa bác ơi, nói khơi khơi thì không thể hiểu được đâu.
Đành phải chờ dịp khác vậy!
Thân.

Chỉ thiếu nó mới báo (Khi có Option Explicit) chứ dư thì nó đâu có báo đâu.

Thân!
 
Upvote 0
Chào ThuNghi!
Mình cũng mới code VBA, ngày trước mình chẳng bao giờ động đến cả, do nhu cầu công việc nên đành phải làm thôi, nếu bạn quan tâm tới các ví dụ kết nối Oracle thì có thể xem một vài ví dụ của mình, bao gồm:
- Tác nghiệp với dữ liệu oracle
- an toàn dữ liệu, quyền truy cập, cho phép hay không cho phép mang dữ liệu ra ngoài hệ thống,....!
- Vì Việt Nam mình đa số được FPT cung cấp Oracle nên phát triển theo hướng đó là có lợi, SAP thì còn lâu lâu vì họ không thèm quan tâm ở VN mặc dù SAP đẳng cấp hơn Oracle 2 bậc.
Vì ở đây mình không có quyền post with attachment file, nên bạn vào www.gocrieng.com/quangle để xem nhé!
Thực ra ở đây toàn các anh chị cao thủ VBA cả, mình mới tập thôi! :d
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Macro bị lỗi?

Mình có file này bạn bè cho dùng để tính thép trong xây dựng, mà nó bị lỗi không biết nguyên nhân. Mình thì không rành mấy cái này lắm nên nhờ các bác cao thủ của GPExel giúp đỡ. Các bác dow về máy rồi kiểm tra sửa chữa cho em cái, rồi up lên cho em hoặc gửi qua em mail của em: minhtranxd@gmail.com
Rất mong sự nhiệt tình của các bác. Chúc các bác sang năm mới nhiều điều thành công mới....
 

File đính kèm

Upvote 0
Mình có file này bạn bè cho dùng để tính thép trong xây dựng, mà nó bị lỗi không biết nguyên nhân. Mình thì không rành mấy cái này lắm nên nhờ các bác cao thủ của GPExel giúp đỡ. Các bác dow về máy rồi kiểm tra sửa chữa cho em cái, rồi up lên cho em hoặc gửi qua em mail của em: minhtranxd@gmail.com
Rất mong sự nhiệt tình của các bác. Chúc các bác sang năm mới nhiều điều thành công mới....
Có code này trong file đâu mà "CHẠY"
Chỉ có VIRUS thôi!
Ẹc... Ẹc...
 
Upvote 0
Nhờ sửa giúp đoạn code sau

Từ một cột có dữ liệu (cột làm điều kiện) tôi muốn dịch sang một số cột để xóa dữ liệu Tôi viết [F6:F1000].SpecialCells(2, 23).Offset(0, 28 , 0 , 3).ClearContents nhưng không được nên phải viết như sau:
Mã:
            [F6:F1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
            [F6:F1000].SpecialCells(2, 23).Offset(0, 29).ClearContents
            [G6:G1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
            [G6:G1000].SpecialCells(2, 23).Offset(0, 26).ClearContents
            [I6:I1000].SpecialCells(2, 23).Offset(0, 25).ClearContents
            [I6:I1000].SpecialCells(2, 23).Offset(0, 24).ClearContents
Nhờ các bạn sửa giúp đoạn code này. Xin cảm ơn !
 
Lần chỉnh sửa cuối:
Upvote 0
Từ một cột có dữ liệu (cột làm điều kiện) tôi muốn dịch sang một số cột để xóa dữ liệu Tôi viết [F6:F1000].SpecialCells(2, 23).Offset(0, 28 , 0 , 3).ClearContents nhưng không được nên phải viết như sau:
Mã:
            [B][COLOR=Red][F6:F1000][/COLOR][/B].SpecialCells(2, 23).Offset(0,[COLOR=Blue][B]28[/B][/COLOR]).ClearContents
            [B][COLOR=Red][F6:F1000][/COLOR][/B].SpecialCells(2, 23).Offset(0, [COLOR=Blue][B]29[/B][/COLOR]).ClearContents
           [B][COLOR=Red] [G6:G1000][/COLOR][/B].SpecialCells(2, 23).Offset(0, [COLOR=Blue][B]28[/B][/COLOR]).ClearContents
            [B][COLOR=Red][G6:G1000][/COLOR][/B].SpecialCells(2, 23).Offset(0, [B][COLOR=Blue]26[/COLOR][/B]).ClearContents
            [B][COLOR=Red][I6:I1000][/COLOR][/B].SpecialCells(2, 23).Offset(0, [COLOR=Blue][B]25[/B][/COLOR]).ClearContents
            [B][COLOR=Red][I6:I1000][/COLOR][/B].SpecialCells(2, 23).Offset(0, [COLOR=Blue][B]24[/B][/COLOR]).ClearContents
Nhờ các bạn sửa giúp đoạn code này. Xin cảm ơn !


  1. Đoạn code trên thực hiện xoá dữ liệu ở các cột dịch đi số cột so với cột mốc khi dữ liệu ở cột làm mốc là Text
  2. Nếu cột làm mốc là Formmuula (chứa công thức)thì phải thay SpecialCells(2, 23) thành SpecialCells(3, 23)
 
Upvote 0
Xin lỗi có lẽ do mình nói chưa rõ: Mình muốn từ cột F dịch sang phải 28 cột và xóa dữ liệu ở 2 cột 28 và 29 thì viết như thế nào ?
 
Upvote 0
Từ một cột có dữ liệu (cột làm điều kiện) tôi muốn dịch sang một số cột để xóa dữ liệu Tôi viết [F6:F1000].SpecialCells(2, 23).Offset(0, 28 , 0 , 3).ClearContents nhưng không được nên phải viết như sau:
Mã:
            [F6:F1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
            [F6:F1000].SpecialCells(2, 23).Offset(0, 29).ClearContents
            [G6:G1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
            [G6:G1000].SpecialCells(2, 23).Offset(0, 26).ClearContents
            [I6:I1000].SpecialCells(2, 23).Offset(0, 25).ClearContents
            [I6:I1000].SpecialCells(2, 23).Offset(0, 24).ClearContents
Nhờ các bạn sửa giúp đoạn code này. Xin cảm ơn !
Bạn sửa lại thành:
PHP:
[F6:F1000].SpecialCells(2, 23).Offset(0, 28).Resize(, 3).ClearContents
Đại khái là vậy
Bạn để ý sẽ thấy hàm Offset + Resize trong VBA sẽ tương đương với 1 hàm OFFSET trong công thức Excel
 
Upvote 0
Xin lỗi có lẽ do mình nói chưa rõ: Mình muốn từ cột F dịch sang phải 28 cột và xóa dữ liệu ở 2 cột 28 và 29 thì viết như thế nào ?

Nói vậy vẫn khó hình dung

  1. Từ cột F (cột 6) dịch sang phải 28 cột ta được cột 34 (cột AH)
  2. Vậy muốn xoá 2 cột AH và AI hay là xoá hai cột 28 và 29 (cột AB và AC)
 
Upvote 0
Mình đang muốn giải thích 2 câu này mà
[F6:F1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
[F6:F1000].SpecialCells(2, 23).Offset(0, 29).ClearContents
tức là 2 cột cột AH và AI
 
Upvote 0
Bạn sửa lại thành:
PHP:
[F6:F1000].SpecialCells(2, 23).Offset(0, 28).Resize(, 3).ClearContents
Đại khái là vậy
Bạn để ý sẽ thấy hàm Offset + Resize trong VBA sẽ tương đương với 1 hàm OFFSET trong công thức Excel

@ Ndu câu này bị lỗi bạn ạ. Bạn vui lòng kiểm tra lại giúp mình với.
 
Upvote 0
@ Ndu câu này bị lỗi bạn ạ. Bạn vui lòng kiểm tra lại giúp mình với.
Xin lổi... tôi chưa test trường hợp vùng dử liệu không liên tục
Vậy xin bạn cho biết vùng mà bạn muốn clear có chứa cái gì? Có thể clear hết được không?
Hoặc giã bạn gữi ví dụ lên thì càng tốt

@ Ndu mình đã gửi nguyên cả file tại bài trước
Bạn bỏ đoạn SpecialCells(2,23) thử xem
Tức chỉ còn:
PHP:
[F6:F1000].Offset(, 28).Resize(, 3).ClearContents
Sai hay thiếu chổ nào đó thì bạn cứ gia giãm Offset và Resize nhé
Chú ý:
Bạn viết .Resize(0,3) là sai à nha ---> bỏ luôn số 0
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn bỏ đoạn SpecialCells(2,23) thử xem
Tức chỉ còn:
PHP:
[F6:F1000].Offset(, 28).Resize(, 3).ClearContents
Sai hay thiếu chổ nào đó thì bạn cứ gia giãm Offset và Resize nhé
Chú ý:
Bạn viết .Resize(0,3) là sai à nha ---> bỏ luôn số 0

bỏ SpecialCells thì nó xoá sạch cả vùng đó sao?

----------------------------------------------
Xin lỗi có lẽ do mình nói chưa rõ: Mình muốn từ cột F dịch sang phải 28 cột và xóa dữ liệu ở 2 cột 28 và 29 thì viết như thế nào ?
mình đoán chỉ xoá khi cột F có số liệu

nếu đoán đúng thì bạn dùng đoạn code này xem thế nào
PHP:
Sub Macro2()
With [F6:F1000]
    .SpecialCells(4).EntireRow.Hidden = True
    .Offset(, 28).Resize(, 2).SpecialCells(12).ClearContents
    .EntireRow.Hidden = False
End With
End Sub
 
Upvote 0
@ Ndu: nếu bỏ SpecialCells(2,23) thì nó sẽ xóa cả cột đích trong khi đó Tôi chỉ muốn xóa những dòng mà cột điều kiện (F, G) có dữ liệu như kết quả bài đầu tôi gửi.
 
Lần chỉnh sửa cuối:
Upvote 0
@ Ndu: nếu bỏ SpecialCells(2,23) thì nó sẽ xóa cả cột đích trong khi đó Tôi chỉ muốn xóa những dòng mà cột điều kiện có dữ liệu.
Nhưng nếu bạn dùng SpecialCells(2,23) thì bạn lại không Resize được
Vậy chỉ còn mỗi cách chia ra từng phần mà làm
Cột F và G nhập chung thành 1
PHP:
[F6:G1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents

PHP:
[I6:I1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents
Bỏ luôn Resize
 
Upvote 0
Nhưng nếu bạn dùng SpecialCells(2,23) thì bạn lại không Resize được
Vậy chỉ còn mỗi cách chia ra từng phần mà làm
Cột F và G nhập chung thành 1
PHP:
[F6:G1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents

PHP:
[I6:I1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents
Bỏ luôn Resize

Phải chăng Offset(, ,.).Resize(, ,.) chỉ áp dụng được cho từng dòng và phải dùng vòng lặp để quét?
 
Upvote 0
Phải chăng Offset(, ,.).Resize(, ,.) chỉ áp dụng được cho từng dòng và phải dùng vòng lặp để quét?
Tức là mỗi 1 câu lệnh có những quy luật riêng của nó...
Như bạn thấy, Resize chỉ chấp nhận 1 vùng liên tục ---> Với 1 vùng dử liệu nằm cách biệt nhau thì nó không làm việc được ---> Thế thôi (Offset thì OK)
 
Upvote 0
Em mới bắt đầu tìm hiểu về VBA, em có đoạn code này không biết nó sử dụng làm gì, các đại ca chỉ dùm em với.
Mã:
Sub Macro1()
'
' Macro1 Macro
' Hoc Macro
'
' Keyboard Shortcut: Ctrl+y
'
    Application.Run "PERSONAL.XLS!Macro1"
    Application.Run "PERSONAL.XLS!Macro1"
    Range("J10").Select
    Application.Run "PERSONAL.XLS!Macro1"
    Range("K7").Select
    Application.WindowState = xlMinimized
    Range("F6:M12").Select
    ActiveCell.FormulaR1C1 = "gfg"
    Range("F6:M12").Select
    Range("F7").Activate
    ActiveCell.FormulaR1C1 = "hg"
    Range("F6:M12").Select
    Range("F8").Activate
    ActiveCell.FormulaR1C1 = "hg"
    Range("F6:M12").Select
    Range("F9").Activate
    ActiveCell.FormulaR1C1 = "hg"
    Range("F6:M12").Select
    Range("F10").Activate
    ActiveCell.FormulaR1C1 = "jh"
    Range("F6:M12").Select
    Range("F11").Activate
    ActiveCell.FormulaR1C1 = "k"
    Range("F6:M12").Select
    Range("F12").Activate
    ActiveCell.FormulaR1C1 = "jk"
    Range("F6:M12").Select
    Range("G6").Activate
    ActiveCell.FormulaR1C1 = "j"
    Range("F6:M12").Select
    Range("G7").Activate
    ActiveCell.FormulaR1C1 = "jk"
    Range("F6:M12").Select
    Range("G8").Activate
    ActiveCell.FormulaR1C1 = "jk"
    Range("F6:M12").Select
    Range("G9").Activate
    ActiveCell.FormulaR1C1 = "jk"
    Range("F6:M12").Select
    Range("G10").Activate
    ActiveCell.FormulaR1C1 = "j"
    Range("F6:M12").Select
    Range("G11").Activate
    ActiveCell.FormulaR1C1 = "kj"
    Range("F6:M12").Select
    Range("G12").Activate
    ActiveCell.FormulaR1C1 = "kj"
    Range("H6").Select
    ActiveCell.FormulaR1C1 = "kj"
    Range("H7").Select
    ActiveCell.FormulaR1C1 = "kj"
    Range("H8").Select
    ActiveCell.FormulaR1C1 = "jk"
    Range("H9").Select
    ActiveCell.FormulaR1C1 = "jk"
    Range("H10").Select
    ActiveCell.FormulaR1C1 = "jk"
    Range("H11").Select
    ActiveCell.FormulaR1C1 = "kj"
    Range("H12").Select
    ActiveCell.FormulaR1C1 = "kj"
    Range("H13").Select
    ActiveCell.FormulaR1C1 = "jk"
    Range("H14").Select
    ActiveCell.FormulaR1C1 = "jk"
    Range("H13").Select
    Selection.ClearContents
    Range("H14").Select
    Selection.ClearContents
    Range("H7").Select
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn nhấn vào nút "Đổi sang khung lớn". Rồi bạn kéo thanh trượt xuống -> Nhấn vào nút "Tải file từ máy" -> Rồi nạp file từ máy vào. Xong.
Thân.
 
Upvote 0
Hỏi về lệnh Call

Chào các bạn , khi thực hiện 1 sub ta dùng lệnh Call hoặc không .Tốc độ thấy như nhau .
Vậy 2 trường hợp này có gì khác nhau . Cảm ơn
 
Upvote 0
Call

Chào các bạn , khi thực hiện 1 sub ta dùng lệnh Call hoặc không .Tốc độ thấy như nhau .
Vậy 2 trường hợp này có gì khác nhau . Cảm ơn

Call Statement
Transfers control to a Sub procedure, Function procedure, or dynamic-link library (DLL) procedure.
Syntax
[Call] name [argumentlist]
The Call statement syntax has these parts:
PartDescriptionCallOptional; keyword. If specified, you must enclose argumentlist in parentheses. For example:
Call MyProc(0)
nameRequired. Name of the procedure to call.argumentlistOptional. Comma-delimited list of variables, arrays, or expressions to pass to the procedure. Components of argumentlist may include the keywords ByVal or ByRef to describe how the arguments are treated by the called procedure. However, ByVal and ByRef can be used with Call only when calling a DLL procedure. On the Macintosh, ByVal and ByRef can be used with Call when making a call to a Macintosh code resource.
Remarks
You are not required to use the Call keyword when calling a procedure. However, if you use the Call keyword to call a procedure that requires arguments, argumentlist must be enclosed in parentheses. If you omit the Call keyword, you also must omit the parentheses around argumentlist. If you use either Call syntax to call any intrinsic or user-defined function, the function's return value is discarded.
Không bắt buộc phải dùng từ khóa Call khi gọi một thủ tục, nếu dùng từ khóa Call mà có đối số thì các đối số này cần phải được bao đóng trong cặp ngoặc (). Nếu dùng Call với hàm thì giả trị trả lại của hàm bị hủy bỏ.

To pass a whole array to a procedure, use the array name followed by empty parentheses.
Example

This example illustrates how the Call statement is used to transfer control to a Sub procedure, an intrinsic function, and a dynamic-link library (DLL) procedure.DLLs are not used on the Macintosh.
' Call a Sub procedure.Call PrintToDebugWindow("Hello World") ' The above statement causes control to be passed to the following' Sub procedure.Sub PrintToDebugWindow(AnyString) Debug.Print AnyString ' Print to the Immediate window.End Sub' Call an intrinsic function. The return value of the function is' discarded.Call Shell(AppName, 1) ' AppName contains the path of the ' executable file.
 
Upvote 0
Nhờ giúp đỡ viết code VBA dùm!

Hi các huynh!

Tôi có 3 sheet (sheet 1, 2,3). Làm sao để thể hiện:

If sheet2.cells(10,3)=1 then
sheet3.cells(10,3)=1 & sheet3.cells(20,3)=sheet2.cells(20,3)*5
end if

P/S: 1 là lấy dữ liệu từ sheet1

Xin chân thành cảm ơn quý AE giúp dùm! Mong reply
 
Upvote 0
Bạn tham khảo cái ni xem sao!

PHP:
Option Explicit
Sub Sheet123()
 Dim Rng As Range
 With Sheet2
    If .[c10] = Sheet1.[c10] Then
        Sheet3.[c10] = .[c10]
        Sheet3.[c20] = .[c20] * 5
    End If
 End With
End Sub

Chúc vui!
 
Upvote 0
Chỉ đơn giản vậy thôi! Làm gì mà cao siêu chi cho mệt vậy bác.
PHP:
Sub chay()
If Sheet2.[C10] = Sheet1.[C10] Then
Sheet3.[C10] = Sheet1.[C10]
Sheet3.[C20] = Sheet2.[C20] * 5
End If
End Sub
Thân.
 
Upvote 0
Cảm ơn các huynh ChanhTQ@ và Po_Pikachu nhiều!

Và làm ơn cho tôi hỏi thêm: Dữ liệu và công thức ở sheet1 được bảo vệ; thì các cells ở sheet2 sheet3 muốn bảo vệ thì không thực hiện được, có cách nào giải quyết xin chỉ dùm!

Chân thành.
 
Upvote 0
Cảm ơn các huynh ChanhTQ@ và Po_Pikachu nhiều!
Và làm ơn cho tôi hỏi thêm: Dữ liệu và công thức ở sheet1 được bảo vệ; thì các cells ở sheet2 sheet3 muốn bảo vệ thì không thực hiện được, có cách nào giải quyết xin chỉ dùm!
Chân thành.
NguyenVanSon có đưa ra 1 cách, bạn thử tìm với từ khóa Passwords xem sao?
Mình nhớ quy trình là vầy: (Tất cả bằng VBA)
* Mở khóa các ô cần nhập ở Sheet2 & sheet3;
* Chép dữ liệu từ Sheet1 vô những ô cần thiết;
* Khóa các ô đã mở để trả về nguyên trạng;

(*) Fa lcaffê & chiêm ngưỡng thành quả của mình & mọi người! :-=
 
Upvote 0
Code VBA

Yêu cấu công việc của mình như sau dùng VBA
- Mở một bản vẽ CAD có sẵn--> Scale xuỗng tỉ lệ a/b trong đó: a là kích thước của đoạng thẳng tùy chọn ghi trong bản vẽ (có thể đo). b là kích thước nhập từ bàn phím.
- Lần lượt đo kích thước một số đoạn thẳng ---> tự động đưa giá trị sang một file Exel.
Nhờ các cao nhân chỉ giáo giúp cho !$@!!
KHông có ai giúp mình được vấn đề này à? hicc các cao nhân đâu hết rồi????!!!
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!

Điều này là không được bác ạ
Tên của 1 biến phải được định danh rõ ràng và xác định, không phụ thuộc vào 1 biến khác (Tức là không có chứa biến ở trong tên)

Thân!
 
Upvote 0
Nhờ giải thích đoạn code để tính Key đăng ký cho file excel (màu xanh)

Các Anh(Chị) có thể giải thích giúp tôi đoạn code màu xanh dưới đây được không?

Option Private Module
Public App As String
Private g_key As String

PHP:
Function pass()
        pass = "your password"
End Function
PHP:
Function appname()
       App = "sys32vb7"
End Function

PHP:
Function Protectit()
Dim x As Variant
If LCase(Left(Application.OperatingSystem, 3)) <> "mac" And LCase(Left(Application.Version, 3)) <> "8.0" Then
    For Each x In ActiveWorkbook.Sheets
        If x.Name = "Control" Or x.Name = "Invoice" Or x.Name = "Reports" Then
            x.ScrollArea = "scr" & x.Name
            x.Protect Password:=pass, DrawingObjects:=True, Contents:=True, Scenarios:=True
        End If
    Next
    ActiveWorkbook.Protect Password:=pass, Structure:=True
End If
End Function

PHP:
Function Unprotectit()
Dim x As Variant
ActiveWorkbook.Unprotect Password:=pass
For Each x In ActiveWorkbook.Sheets
    x.Unprotect Password:=pass
    x.ScrollArea = ""
Next
End Function

PHP:
Function UnProtectbook()
         ActiveWorkbook.Unprotect Password:=pass
End Function
PHP:
Function lockall()
Unprotectit
Dim x As Variant
Range("keyflag").Value = 1
For Each x In ActiveWorkbook.Sheets
    x.Protect Password:=pass, DrawingObjects:=True, Contents:=True, Scenarios:=True
Next
End Function

PHP:
Function unlockall()
Dim x As Variant
For Each x In ActiveWorkbook.Sheets
    x.EnableSelection = xlNoRestrictions
    x.Unprotect Password:=pass
Next
Range("keyflag").Value = 0
End Function
'-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
Function KeyGen()
g_key = "@#ft^+*(^%$#h7A=?(^d-_h.,\|{$U2+0(*&][Gs9/*5df@!%#:J`&..?\|t8eSP+"
End Function
-------------------------------------------
Function EnCrypt(strCryptThis)
Dim strChar, iKeyChar, iStringChar, i
KeyGen
For i = 1 To Len(strCryptThis)
iKeyChar = Asc(Mid(g_key, i, 1))
iStringChar = Asc(Mid(strCryptThis, i, 1))
iCryptChar = iKeyChar Xor iStringChar
strEncrypted = strEncrypted & Chr(iCryptChar)
Next
EnCrypt = strEncrypted
End Function
-------------------------------------------
Function DeCrypt(strEncrypted)
Dim strChar, iKeyChar, iStringChar, i
KeyGen
For i = 1 To Len(strEncrypted)
iKeyChar = (Asc(Mid(g_key, i, 1)))
iStringChar = Asc(Mid(strEncrypted, i, 1))
iDeCryptChar = iKeyChar Xor iStringChar
strDecrypted = strDecrypted & Chr(iDeCryptChar)
Next
DeCrypt = strDecrypted
End Function
-------------------------------------------
Function CreateCode(emailaddress)
Dim iStringChar, i
For i = 2 To Len(emailaddress)
iStringChar = Asc(Mid(LCase(emailaddress), i, 1))
iStringChar = iStringChar ^ 5.23975
If Left(iStringChar, 1) < 4 Then
strCode = strCode & Chr(48 + Right(iStringChar, 1)) & Chr(57 - Left(iStringChar, 1))
ElseIf Left(iStringChar, 1) > 7 Then
strCode = strCode & Chr(97 + Right(iStringChar, 1) + Left(iStringChar, 1) + 5)
Else
strCode = strCode & Chr(97 + Right(iStringChar, 1) + Left(iStringChar, 1) + 10)
End If
strCode = strCode & Chr(48 + Mid(iStringChar, 3, 1)) & Chr(97 + Mid(iStringChar, 5, 1) + Mid(iStringChar, 6, 1))
Next
CreateCode = strCode
End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Sao không chạy dòng lệnh màu đỏ

Mình có đoạn code tự record như sau. Bình thường vẫn chạy tốt nhưng không hiểu sao được một vài hôm thì lại bị hỏng. Nguyên nhân có lẽ là do đoạn code màu đỏ đã không được thực hiện. Các bác xem hộ tại sao nhé

Sub Mergging1()
'
' Mergging Macro
' Macro recorded 2/5/2009 by thuy.dinh
'
' Keyboard Shortcut: Ctrl+Shift+K
'
Range("B1").Select
ActiveCell.FormulaR1C1 = "=LEFT(R1C[-1],FIND(""X, 0, NO"",R1C[-1],1)+7)"
Range("B2").Select
ActiveCell.FormulaR1C1 = _
"=LEFT(RIGHT(R1C[-1],LEN(R1C[-1])-SUM(OFFSET(R1C[1],,,ROW(R[-1]C[1]),1))),FIND(""X, 0, NO"",RIGHT(R1C[-1],LEN(R1C[-1])-SUM(OFFSET(R1C[1],,,ROW(R[-1]C[1]),1))),1)+7)"
Range("C1").Select
ActiveCell.FormulaR1C1 = "=LEN(RC[-1])"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=LEN(RC[-1])"
Range("B2:C2").Select
Selection.AutoFill Destination:=Range("B2:C209"), Type:=xlFillDefault
Range("B2:C209").Select
ActiveWindow.SmallScroll Down:=-15
Range("B6").Select
Columns("B:B").EntireColumn.AutoFit
Cells.Select
Range("E10").Activate
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("B:B").Select
Selection.Replace What:=",", Replacement:=" ", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
ActiveWindow.SmallScroll Down:=-9
Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(28, 1), Array(53, 1), Array(80, 1), Array(112, 1), _
Array(138, 1), Array(172, 1), Array(197, 1), Array(225, 1), Array(252, 1), Array(278, 1), _
Array(325, 1), Array(350, 1), Array(376, 1)), TrailingMinusNumbers:=True
Range("B12").Select
Columns("B:B").EntireColumn.AutoFit
Columns("B:B").ColumnWidth = 17.57
Columns("E:E").ColumnWidth = 12
Columns("D:E").Select
Selection.Delete Shift:=xlToLeft
Columns("E:H").Select
Selection.Delete Shift:=xlToLeft
Selection.ColumnWidth = 9.86
Columns("F:I").Select
Selection.Delete Shift:=xlToLeft
Range("H4").Select
Columns("E:E").ColumnWidth = 12.43
Columns("A:A").ColumnWidth = 10
Range("B1:E50").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection.Font
.Name = "Tahoma"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("B1").Select
Columns("B:B").Select
Selection.Replace What:="#VALUE!", Replacement:="", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
Range("B1").Select
End Sub
 
Upvote 0
Mình có đoạn code tự record như sau. Bình thường vẫn chạy tốt nhưng không hiểu sao được một vài hôm thì lại bị hỏng. Nguyên nhân có lẽ là do đoạn code màu đỏ đã không được thực hiện. Các bác xem hộ tại sao nhé

Sub Mergging1()
'
' Mergging Macro
' Macro recorded 2/5/2009 by thuy.dinh
'
' Keyboard Shortcut: Ctrl+Shift+K
'
.....
Columns("B:B").Select
Selection.Replace What:=",", Replacement:=" ", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
......
End Sub

Đoạn code màu đỏ dùng để thay thế ký tự "," bằng ký tự " " có trong tất cả các chuỗi trong vùng B:B. Lỗi có thể do nhiều nguyên nhân.

Để có thể biết chính xác nguyên nhân thì bạn vui lòng đính kèm file theo nha. Có file mới biết đước là Bạn muốn làm gì, trong vùng B:B có dữ liệu gì và báo lỗi như thế nào. Nhiều khi nhìn code cũng chưa thật sự hiểu đúng nguyên nhân của vấn đề.
 
Upvote 0
Sửa code này giúp mình với

Mình có đoạn code như sau:

Sub khanh()
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(22, 1), Array(34, 1)), _
TrailingMinusNumbers:=True
End Sub

Code này chạy trên toàn bộ cột C. Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.

Các bác giúp với.
 
Upvote 0
Mình có đoạn code như sau:

Sub khanh()
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(22, 1), Array(34, 1)), _
TrailingMinusNumbers:=True
End Sub

Code này chạy trên toàn bộ cột C. Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.

Các bác giúp với.
Tôi nghĩ có lẽ chỉ cần vầy là được:
PHP:
Sub khanh()
  With Selection
    .TextToColumns .Cells(1, 1), 2
  End With
End Sub
Bạn thử xem! Nếu có trục trặc hãy đưa file lên nhé
 
Upvote 0
Chưa chặt lắm!

Tôi nghĩ có lẽ chỉ cần vầy là được:
PHP:
Sub khanh()
  With Selection
    .TextToColumns .Cells(1, 1), 2
  End With
End Sub
Bạn thử xem! Nếu có trục trặc hãy đưa file lên nhé

Ta phải khẳng định với nhau, rằng vùng đã chọn chỉ là 1 cột.
PHP:
 If Selection.Columns.Count=1 then .TextToColumns .Cells(1, 1), 2
:-=
 
Upvote 0
Mình có đoạn code như sau:

Sub khanh()
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(22, 1), Array(34, 1)), _
TrailingMinusNumbers:=True
End Sub

Code này chạy trên toàn bộ cột C. Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.

Các bác giúp với.
Theo em thì có thể viết như vầy.
PHP:
Sub thu()
Application.InputBox("Quet chon vung", Type:=8).Columns(1).TextToColumns Cells(1, 1), 2
End Sub
Thân.
 
Upvote 0
Theo em thì có thể viết như vầy.
PHP:
Sub thu()
Application.InputBox("Quet chon vung", Type:=8).Columns(1).TextToColumns Cells(1, 1), 2
End Sub
Thân.
Viết sao cũng được... nhưng vì tác giả có nói rằng:
Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.
i.
Ta phải khẳng định với nhau, rằng vùng đã chọn chỉ là 1 cột.
PHP:
 If Selection.Columns.Count=1 then .TextToColumns .Cells(1, 1), 2
Vậy em sửa lại
PHP:
Sub khanh()
  With Selection
    if .Columns.Count = 1 then .TextToColumns .Cells(1, 1), 2
  End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Không được rùi. Code này là mình tự record với lệnh "text to clumn" vì vậy khi chạy code của các bác chưa được theo ý muốn.
Đoạn text của mình sẽ như sau:
02/11/2008 08:14 AM <PRO> MYLIST

Sau khi chạy xong thì mỗi màu text kia sẽ phải chạy ra là một cột nghĩa là chỉ ra 4 cột thôi.
Chạy code của các bác xong thì lại ra 5 cột, cột thời gian nó bị chia ra làm hai

Các bác xem lại giúp nhé!
 
Upvote 0
Không được rùi. Code này là mình tự record với lệnh "text to clumn" vì vậy khi chạy code của các bác chưa được theo ý muốn.
Đoạn text của mình sẽ như sau:
02/11/2008 08:14 AM <PRO> MYLIST

Sau khi chạy xong thì mỗi màu text kia sẽ phải chạy ra là một cột nghĩa là chỉ ra 4 cột thôi.
Chạy code của các bác xong thì lại ra 5 cột, cột thời gian nó bị chia ra làm hai

Các bác xem lại giúp nhé!
Bạn cứ đưa file lên đi... nói không không thế thì chẳng biết đường nào mà lần (ví dụ ở trên tôi nhìn vào cũng chẳng đoán được nó là mấy cột)
 
Upvote 0
Hii, File của mình cũng chỉ có vậy thôi mà. Tất cả dữ liệu đều ở trong một cột, chính vì vậy mình mới muốn nó chia ra thành 4 cột. Mình gửi file đính kèm nhé!
 

File đính kèm

Upvote 0
Hii, File của mình cũng chỉ có vậy thôi mà. Tất cả dữ liệu đều ở trong một cột, chính vì vậy mình mới muốn nó chia ra thành 4 cột. Mình gửi file đính kèm nhé!
Chắc là vầy:
PHP:
Sub Tach()
 With Selection
   If .Columns.Count = 1 Then .TextToColumns .Cells(1, 1), xlFixedWidth, _
     FieldInfo:=Array(Array(0, 1), Array(10, 1), Array(21, 1), Array(33, 1))
  End With
End Sub
Bạn thử lại xem
 
Upvote 0
Lần này thì đúng rồi, thanks bạn!
 
Upvote 0
HI các huynh!

Mong các huynh chỉ giáo dùm: Trong Cell A1 nhập AaaaaaaaaR (trong đó R format superscript), khi copy paste trực tiếp thì R vẫn bảo toàn ở trạng thái là superscript; Còn khi tiểu đệ qua cell khác gõ: =A1 thì chữ R không còn ở trạng thái superscript nữa.
Mong các huynh cho giải pháp để Tđ giải quyết vđ của mình, chân thành cảm ơn!
 
Upvote 0
HI các huynh!

Mong các huynh chỉ giáo dùm: Trong Cell A1 nhập AaaaaaaaaR (trong đó R format superscript), khi copy paste trực tiếp thì R vẫn bảo toàn ở trạng thái là superscript; Còn khi tiểu đệ qua cell khác gõ: =A1 thì chữ R không còn ở trạng thái superscript nữa.
Mong các huynh cho giải pháp để Tđ giải quyết vđ của mình, chân thành cảm ơn!
Điều đó đương nhiên, vì công thức chỉ làm nhiệm vụ lấy kết quả, không can thiệp các vấn đề khác như Format ---> Muốn được việc bạn phải dùng cách khác (copy chẳng hạn)... Muốn tự động hơn cho công việc thì dùng macro vậy!
 
Upvote 0
HI ndu96081631,
Làm ơn giúp cái hàm macro xử lý vụ này cái!
Xin cảm ơn!
 
Upvote 0
Cách viết câu lệnh cho một biến quét nhiều vùng ?

Nhờ các bạn chỉ giúp cách viết câu lệnh cho một biến quét nhiều vùng ?

Ví dụ: để biến j quét trong một vùng từ cột 5 đến cột 20 ta viết J = 5 to 20
Tôi muốn cùng một biến J quét 2 vùng từ cột 5 đến cột 10 và từ cột 15 đến cột 20 thì viết như thế nào ?

Xin cảm ơn!
 
Upvote 0
Bạn tham khảo xem sao?!

Nhờ các bạn chỉ giúp cách viết câu lệnh cho một biến quét nhiều vùng ?
Ví dụ: để biến j quét trong một vùng từ cột 5 đến cột 20 ta viết J = 5 to 20
Tôi muốn cùng một biến J quét 2 vùng từ cột 5 đến cột 10 và từ cột 15 đến cột 20 thì viết như thế nào ?
PHP:
Option Explicit
Sub ColorRegions()
 Dim Clls As Range
 
 For Each Clls In Range(Cells(2, 5), Cells(45, 20))
    If Clls.Column < 11 Or Clls.Column > 15 Then _
        Clls.Interior.ColorIndex = 37 + ((Clls.Row + Clls.Column) Mod 2)
 Next Clls
End Sub

cách hai:
Mã:
Option Explicit
Sub Color2Regions()
 Dim Clls As Range
 
 For Each Clls In Union(Range("A2:F12"), Range("H12:K15"))
    Clls.Interior.ColorIndex = 39 - ((Clls.Row + Clls.Column) Mod 2)
 Next Clls
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
HI các huynh,
Làm ơn giúp cái hàm macro xử lý cái phần superscript với vì viết code copy paste thì phần superscript nó nhảy xuống luôn huhuhuh!
Xin cảm ơn!
 
Upvote 0
HI các huynh,
Làm ơn giúp cái hàm macro xử lý cái phần superscript với vì viết code copy paste thì phần superscript nó nhảy xuống luôn huhuhuh!
Xin cảm ơn!
Vậy kết luận cuối cùng là bạn muốn sao? Muốn giử nguyên Format của cell gốc hay bỏ Format
- Muốn giử nguyên thì copy\Paste bình thường
- Muốn bỏ Format, chỉ lấy value thì copy\paste special\value
Cuối cùng: đưa file lên cho nhanh gọn
 
Upvote 0
Hi các huynh!

Làm sao để gõ dấu "hỏi" và dấu"nặng" trong excel macro bằng font unicode!

Xin cảm ơn.
 
Upvote 0
Sửa Marco copy special value

Tại ô B1 tôi có công thức như sau:
=IF(A1="","",A1). Sau đó kéo xuống cho toàn bộ cột B1
Nghĩa là giá trị cột B luôn bằng cột A nếu ô A có giá trị.
Nếu copy toàn bộ cột B1 thành giá trị thì tôi có thể record một marco. Nhưng nếu chỉ copy những ô tại cột B mà có giá trị thì làm thế nào vậy, những ô bằng "" thì giữ nguyên công thức.

Nếu copy toàn bộ cột B1 thành giá trị thì sẽ có marco như này:
PHP:
Sub paste_special()
    Columns("B:B").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Range("A1").Select
End Sub

Các bác giúp viết lại code nhé!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn có thể dùng code này để làm việc này. Và khỏi cần phải copy-paste gì hết.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Target.Offset(, 1) = Target
End If
End Sub
Code được đặt trong Sheet nào muốn có tính năng này.
Thân.
 

File đính kèm

Upvote 0
Cám ơn Po_Pikachu nhưng cái này không đúng với ý của mình rùi.
Nếu làm theo cái này thì cột B1 luôn luôn bằng cột A1. Ý của mình là sau khi đã paste những ô có giá trị tại cột B thì sẽ cố định luôn những ô đó và những ô này không bị ảnh hưởng bởi cột A nữa, chỉ những ô nào không có giá trị tại cột B thì mới bị ảnh hưởng bởi cột A thôi.
Nếu làm như của bác thì chỉ cần dùng công thức [B1]=A1 là xong. Bác sửa lại giúp nhé, thanks!
 
Upvote 0
Vậy thì bổ sung tinh chất lần đầu vào. Nó chỉ chuyển dữ liệu từ cột A vào cột B nếu cột B chưa có dữ liệu thôi và sẽ không chuyển nếu đã có dữ liệu rồi.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Offset(, 1) = "" Then
Target.Offset(, 1) = Target
End If
End Sub
Thân.
 
Upvote 0
Hic, quên mất là file của mình lại không phải là cột A và cột B.
Bạn sửa lại giúp mình để chạy với cột D va cột F, nghĩa là cột F lấy giá trị từ cột D.
Thanks!
 
Upvote 0
À quên! Đây mới đúng!
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 And Target.Offset(, 2) = "" Then
Target.Offset(, 2) = Target
End If
End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Chưa đúng rồi, cột D và cột F mà bạn ơi.
Marco của bạn là cho cột D và cột E mà. Bạn sửa lại là cho cột D và cột F nhé!
 
Upvote 0
Bạn cho hỏi:
- Cột D của bạn là dử liệu nhập hay công thức ---> Nếu là công thức thì không dể ăn đâu nha
Cách hay nhất là bạn nên đưa file lên... đở mất công mọi người đoán sai
 
Upvote 0
Hii, mình cũng không rõ là cột đó là công thức hay gì nữa vì cột đó là do một chương trình tự tạo ra.
Nhưng mình thử với công thức của Po_Pikachu rôi, vẫn chạy được.
Cám ơn bạn đã quan tâm
 
Upvote 0
Thử với Sub này xem:
PHP:
Sub Test()
  With Range([D1], [D65536].End(xlUp))
    .Offset(, 2).Value = Evaluate("=If(" & .Address & "="""",""""," & .Address & " )")
  End With
End Sub
 
Upvote 0
Câu hỏi về VBA

Yêu cấu công việc của mình như sau dùng VBA
- Mở một bản vẽ CAD có sẵn--> Scale xuỗng tỉ lệ a/b trong đó: a là kích thước của đoạng thẳng tùy chọn ghi trong bản vẽ (có thể đo). b là kích thước nhập từ bàn phím.
- Lần lượt đo kích thước một số đoạn thẳng ---> tự động đưa giá trị sang một file Exel.
Nhờ các cao nhân chỉ giáo giúp cho !$@!!
KHông có ai giúp mình được vấn đề này à? hicc các cao nhân đâu hết rồi????!!!
Các Pro chịu thua với bai toán này rồi sao???!!!
 
Upvote 0
tạo shortcut

PHP:
Sub MakeShortcut()
    Dim WSH As Object
    Dim WSHShortcut As Object
    Dim strStationName As String
    Dim strPath As String
    Dim strDirectory As String
    Dim strMsg As String
    Set WSH = CreateObject("WScript.Shell")
    strStationName = Sheet1.Range("B25").Value
    strDirectory = "C:\$Workbook Path$ " & strStationName & ".xls"
    If strStationName = "" Then ' Checks to see if the user selected a name
         MsgBox "You Must Choose a Station Name from the Drop Down Box"
        Exit Sub
    End If
    If Not Len(Dir(strDirectory)) > 0 Then 'Checks to see if File Exists
        MsgBox "The $Workbook Name$ for the Selected Station Name does not Exist.  The Shortcut cannot be created.  Please Ask Someone for Help."
        Exit Sub
    End If
    strPath = WSH.SpecialFolders("Desktop") & "\" & "$Workbook Name$ " & strStationName & ".lnk"
    Set WSHShortcut = WSH.CreateShortcut(strPath)
    With WSHShortcut
        .TargetPath = "C:\$Workbook Path$ " & strStationName & ".xls"
        .Description = "$Workbook Name$ " & strStationName
        .IconLocation = "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE,1"
        .RelativePath = "C:\$Workbook Path$"
        .WorkingDirectory = "C:\$Workbook Path$"
        .Hotkey = ""
        .Save
    End With
    strMsg = "Success!  Look for the $Workbook Name$ " & strStationName & " Shortcut on your Desktop" & vbNewLine & _
    "This Workbook will now Close.  Thank You!"
    MsgBox strMsg
     ThisWorkbook.Close False
End Sub
Đoạn code trên dùng để tạo một shortcut cho file nhưng em làm không được vì thiếu cái Drop Down Box gì đó, các bác giúp em giải thích nó với, hoàn chỉnh cả chương trình được thì càng tốt
 
Lần chỉnh sửa cuối:
Upvote 0
tạo shortcut cho file

PHP:
Sub MakeShortcut2() 
    Dim WSH As Object 
    Dim WSHShortcut As Object 
    Dim strPath As String 
    Set WSH = CreateObject("WScript.Shell") 
     
    strPath = WSH.SpecialFolders("Desktop") & "\" & "notepad.lnk" 
    Set WSHShortcut = WSH.CreateShortcut(strPath) 
    With WSHShortcut 
        .TargetPath = Environ("WINDIR") & "\" & "notepad.exe" 
        .Description = "make shortcut to notepad" 
        .IconLocation = "c:\windows\system\shell32.dll,5" 
        .RelativePath = "c:\temp" 
        .WorkingDirectory = "c:\" 
        .Hotkey = "Ctrl+Alt+Q" 
        .Save 
    End With 
End Sub
đây cũng là đoạn code tạo shortcut nhưng em khong biet thực hiện như thế nào cho đúng nhờ các bác giải hộ.
 
Upvote 0
đây cũng là đoạn code tạo shortcut nhưng em khong biet thực hiện như thế nào cho đúng nhờ các bác giải hộ.
Bạn sưu tầm code ở đâu mà sai từa lưa vậy!
Sửa tạm code số 2 nhé:
Mã:
Sub MakeShortcut2()
    Dim WSH As Object
    Dim WSHShortcut As Object
    Dim strPath As String
    Set WSH = CreateObject("WScript.Shell")
     
    strPath = WSH.SpecialFolders("Desktop") & "\" & "notepad.lnk"
    Set WSHShortcut = WSH.CreateShortcut(strPath)
    With WSHShortcut
        .TargetPath = Environ("WINDIR") & "\" & "notepad.exe"
        .Description = "make shortcut to notepad"
        .IconLocation = "c:\windows\notepad.exe"
        .RelativePath = "c:temp"
        .WorkingDirectory = "c:"
        .Hotkey = "Ctrl+Alt+Q"
        .Save
    End With
End Sub
Còn code số 1, bạn cứ theo thông báo mà tìm
Ví dụ: Nó thông báo rằng:
You Must Choose a Station Name from the Drop Down Box
Mở code ra xem, thì ra nguyên nhân là do:
If strStationName = "" Then...
Vậy bạn phải xem strStationName nó là cái giống gì
???
Trong code, nó chính là Sheet1.Range("B25").Value
Vậy Cell B25 của bạn phải gõ vào tên file nào đó mà bạn muốn tạo shortcut
vân vân... và.. vân vân... Còn nhiều cái phải sửa lắm, chẳng hạn như ĐƯỜNG DẨN CHỨA FILE
Theo ý kiến riêng của tôi: Dùng 1 code nào đó vượt quá xa tầm hiểu biết thì tốt nhất đừng xài ---> Học lại từ CƠ BẢN sẽ tốt cho bạn hơn!
 
Upvote 0
Xin hỏi 1 vấn đề hơi đơn giản nhưng không biết là do code sai hay là em hiểu sai về code.
Trường hợp cụ thế như vầy:
Nếu bạn lấy True - False trong công thức (=True-False) thì kết quả là 1.
Nhưng trong VBA, cũng True - False ([biểu thức A=True]-[biểu thức B=False]) thì kết quả lại là -1.
Vậy xin hỏi vấn đề này giải thích ra sao vậy?
Xin chân thành cảm ơn.
(Em biết nó vẫn luôn ra như vậy, nhưng chỉ hỏi là tại sao lại có chuyện lạ kỳ như vậy? Đây có phải là lỗi của Microsoft không hay có điều gì khác ạ!)
 
Upvote 0
Xin hỏi 1 vấn đề hơi đơn giản nhưng không biết là do code sai hay là em hiểu sai về code.
Trường hợp cụ thế như vầy:
Nếu bạn lấy True - False trong công thức (=True-False) thì kết quả là 1.
Nhưng trong VBA, cũng True - False ([biểu thức A=True]-[biểu thức B=False]) thì kết quả lại là -1.
Vậy xin hỏi vấn đề này giải thích ra sao vậy?
Xin chân thành cảm ơn.
(Em biết nó vẫn luôn ra như vậy, nhưng chỉ hỏi là tại sao lại có chuyện lạ kỳ như vậy? Đây có phải là lỗi của Microsoft không hay có điều gì khác ạ!)
Vì đơn giản trong VBA, người ta xem TRUE = -1
Bạn vào Help mà xem!
 
Upvote 0
Ý em là sao nó không thống nhất nhỉ?
Em thường thấy là True=1; False=0 sao giờ lại =-1 vậy? Cái đó làm cho nhiều người không để ý thì sẽ dẫn đến kết quả sai ngoài ý muốn đó.
Mong mọi người chú ý khi viết code nha!
Thân.
 
Upvote 0
Theo tôi trong VBA thì FALSE = 0; còn TRUE <> 0, tuy nhiên True = -1 là giá trị mặc định.
 
Upvote 0
Ý em là sao nó không thống nhất nhỉ?
Em thường thấy là True=1; False=0 sao giờ lại =-1 vậy? Cái đó làm cho nhiều người không để ý thì sẽ dẫn đến kết quả sai ngoài ý muốn đó.
Mong mọi người chú ý khi viết code nha!
Thân.
Cái này là quy định của Micorsoft thôi... chắc chắn phải có nguyên nhân, nhưng là nguyên nhân gì thì mọi người vẫn... đang bàn...
 
Upvote 0
Em dùng code còn phát hiện 1 lỗi nữa. Đó là lúc AutoFilter bằng code thì có 1 trường hợp như sau:
Nếu định dạng trong Windows là "d/m/yyyy" và tất nhiên trong Excel vẫn hiểu định dạng này (tức là 31/12/2007 vẫn nằm bên phải, và hàm Month vẫn cho kết quả là 12).
Nhưng nếu ngày nhỏ hơn 12 (1,2,3,...,12) thì khi qua dòng lệnh:
PHP:
Sheet2.Range("B1:M" & HC).AutoFilter Field:=2, Criteria1:=">=" & [G5], Operator:=xlAnd, Criteria2:="<=" & [I5]
Với: [G5]=1/12/2007 và [I5]=10/12/2007
Thì xem lại trong Sheet2 không có dữ liệu. Mặt dù biết rằng vẫn có vùng thời gian này.
Xét đến tận cùng thì phát hiện trong Custom (AutoFilter) nó báo rằng 12/1/2007, 12/10/2007.
Vậy xin hỏi làm sao để có được 1/12/200710/12/2007.
Mọi người có thể tự làm thử. Điều này hình như là luôn đúng nữa rồi.
Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom