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:
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

  • Book1.xls
    20 KB · Đọc: 20
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

  • ViDu.xls
    22 KB · Đọc: 13
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