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:
xin hỏi cách tạo code để chống move va copy làm như thế nào, xin hướng dẫn cụ thể vì tôi mới vào nghề excel. thanks...
 
Upvote 0
Xin hỏi về định dạng sau số thập phân

Chào anh, chị
Khi mình thực hiện phép nhân (*) trong VBA. Thì VBA tự đọng làm tròn số đàng sau số thập phân
VD: Giá trị trên sheets.cells(1,1)=0.23
thực hiện trong code:
sheets.cells(1,1) * 1000= 0 ??
Dù format hoặc chuyển dịnh dạng nhưng kết quả vẫn =0
Mong anh chị chỉ dùm lỗi ở đâu?

Chân thành cám ơn
 
Upvote 0
Chào anh, chị
Khi mình thực hiện phép nhân (*) trong VBA. Thì VBA tự đọng làm tròn số đàng sau số thập phân
VD: Giá trị trên sheets.cells(1,1)=0.23
thực hiện trong code:
sheets.cells(1,1) * 1000= 0 ??
Dù format hoặc chuyển dịnh dạng nhưng kết quả vẫn =0
Mong anh chị chỉ dùm lỗi ở đâu?

Chân thành cám ơn
Tôi thí nghiệm thấy đúng mà!
PHP:
Sub Test()
 [B1] = [A1] * 1000
End Sub
</b>
Với A1 = 0.23 thì B1 = 230
Có lẻ dử liệu của bạn đang sai chổ nào ấy chứ ---> Đưa lên xem thử
 
Upvote 0
Chắc có lẽ cách viết code có lỗi gì đó, Bạn xem giùm theo File đính kèm
http://www.zshare.net/download/57316693d8fec3de/
http://myfreefilehosting.com/f/fd51510eee_0.01MB

Cells(i, 3) = DateDiff("m", .Cells(1, 8), .Cells(1, 9))
Cells(1, 8) thì = Cells(1, 9)
==> DateDiff("m", .Cells(1, 8), .Cells(1, 9)) phải luôn =0
==> .Cells(1, 11) = Hsluong * tlBHXH * .Cells(i, 3) * .Cells(i, 4) đương nhiên cũng = 0 là đúng rồi còn gì
--------
Thêm nữa, trong code có nhiều chổ hơi khó hiểu, ví dụ:
1> Thứ nhất
Bạn định nghĩa:
Ma1 = WorksheetFunction.Match(.Cells(1, 8), rng, 1)
Ma2 = WorksheetFunction.Match(.Cells(1, 9), rng, 1)

Mà trong code lại có đoạn
If Ma1 = Ma2 Then
vậy cần gì vòng lập FOR ---> Vì đàng nào cũng chỉ xét có 1 vị trí ---> 2 Mã này bằng nhau khi Cells(1, 8) = Cells(1, 9)
2> Thứ hai:
Hsluong = .Cells(1, 10) = 0.33 ---> Vậy sao bạn lại khai báo biến Hsluong As Integer được chứ ---> Lý ra phải là Hsluong As Double (Integer là số nguyên cơ mà)
--------
Bạn hãy nói rõ bạn đang cần tính cái gì? Tính như thế nào? Chúng ta sẽ sửa lại code đúng ý đồ của bạn
(tôi nghĩ bài toán này không cần khai báo biến nhiều đến thế)
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bạn

Mình đang tạo thủ tục theo yêu cầu của bài này
hiện đã viết được sub tạm ưng ý nhưng muốn chuyển thanh UDF để tiện sử dụng nhưng không được.
Mong bạn có thể sửa dùm và sửa giúp mình thủ tục tại File đính kèm theo link dưới:

http://myfreefilehosting.com/f/f0fa46e729_0.01MB

Chân thành cám ơn.
Ai dà... file thì tải không được (báo lổi)... còn topic kia tôi có xem qua nhưng quả thật chưa hiểu gì lắm yêu cầu của bạn (có lẻ không phải chuyên ngành)
----> Nhờ các cao thủ khác giúp 1 tay với!
 
Lần chỉnh sửa cuối:
Upvote 0
Chuyển thủ tục sau thành UDF như thế nào?

Mã:
 Tinhnop1()
Dim i As Long, Ma1 As Long, Ma2 As Long
Dim rng As Range
Dim HSL As Double, TL As Double
With Sheets(1)
HSL = .Cells(1, 10) ' 
TL = .Cells(1, 11)
Set rng = .Range("A1:A" & [A65000].End(xlUp).Row) ' Vung luong toi thieu
rng.Offset(, 2).ClearContents
Ma1 = WorksheetFunction.Match(.Cells(1, 8), rng, 1) ' s.cells(1,8) cua Tu thang
Ma2 = WorksheetFunction.Match(.Cells(1, 9), rng, 1) ' S.cells(1,8) den thang
        If Ma1 = Ma2 Then
            .Cells(Ma1, 3) = DateDiff("m", .Cells(1, 8), .Cells(1, 9))
            .Cells(Ma1, 4) = .Cells(Ma1, 3) * HSL * TL * .Cells(Ma1, 2)
        Else
        'Sua Dk dau de cho dung voi thoi gian Tuthang
            .Cells(Ma1, 3) = DateDiff("m", .Cells(1, 8), .Cells(Ma1 + 1, 1))
            .Cells(Ma1, 4) = .Cells(Ma1, 3) * HSL * TL * .Cells(Ma1, 2)
 
        For i = Ma1 + 1 To Ma2
            'Chay vong lap tinh thang cua cac moc trong khoang ma1 - ma2
            .Cells(i, 3) = DateDiff("m", .Cells(i, 1), .Cells(i + 1, 1))
            .Cells(i, 4) = .Cells(i, 3) * HSL * TL * .Cells(i, 2)
        Next
            'Sua Dk cuoi de cho dung voi thoi gian Denthang
            .Cells(Ma2, 3) = DateDiff("m", .Cells(Ma2, 1), .Cells(1, 9))
            .Cells(Ma2, 4) = .Cells(Ma2, 3) * HSL * TL * .Cells(Ma2, 2)
        End If
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Upvote 0
Cám ơn sự nhiệt tình của các bác.
Thực sự là do up trực tiếp lên không được, nhờ các anh chi trên diễn đàn mình đã Upload được File
 

File đính kèm

  • UDF.rar
    39.7 KB · Đọc: 15
Lần chỉnh sửa cuối:
Upvote 0
Mọi người chỉ giáo giùm cách viết code trong excel và Word có khác nhau nhiều không. Mình có đoạn code tự record như sau:
Sub Macro1()
CommandBars("Stop Recording").Visible = False
Selection.TypeParagraph
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.HomeKey Unit:=wdLine
End Sub

Code này chỉ chạy trên file word hiện hành. Các bác có thể sửa giúp để marco có thể chạy trên tất cả các file word đang mở được không. Thanks nhiều!
 
Upvote 0
Mình muốn bảng tính tự động cố định cột và dòng tại P4 nên đã dùng
PHP:
Private Sub worksheet_selectionchange(ByVal Target As Range)
...
[P4].Select: ActiveWindow.FreezePanes = True
...
end sub
Nhưng ngoài tác dụng cố định cột và dòng thì chẳng còn làm được gì nữa vì con trỏ luôn nhảy về P4. Nhờ các bạn giúp mình sửa lại câu lệnh này. Thank !
 
Upvote 0
Nhưng ngoài tác dụng cố định cột và dòng thì chẳng còn làm được gì nữa vì con trỏ luôn nhảy về P4
Nó cứ nhảy về P4 là đúng rồi.

Cái việc freeze pane chỉ làm 1 lần cho 1 sheet trong 1 lần mở file, thậm chí để nguyên như vậy mà xài mãi mãi đến khi chán mới thôi. Bạn lại cho nó vào sự kiện selection_change (thay đổi ô chọn)! Thử hỏi bạn làm việc gì với excel mà cả ngày không thay đổi ô chọn (selection)?

Cứ mỗi lần bạn thay đổi ô chọn, code chạy 1 lần, trong code lại có câu lệnh [P4].Select thì anh Bill biết làm gì khác hơn là chạy về P4 ngồi?
 
Upvote 0
Vì một lý do là ngay trên đường freezepanes tôi dùng Calendar1 để nhập ngày tháng và dưới đường này có một dòng ẩn vì vậy Calendar1 bị co lại không sử dụng được nếu bỏ freezepanes thì OK.
Vì vậy tôi định dùng giải pháp khi Calendar1 được gọi ra thì cũng đồng thời freezepanes = false và sau khi Click Calendar1 thì freezepanes = True và sau đó di chuyển con trỏ đến ô khác thì freezepanes vẫn luôn = True
PHP:
Private Sub worksheet_selectionchange(ByVal Target As Range)
       With Target
            Calendar1.Visible = (Not Intersect([L2:AU2], Target) Is Nothing)
            Calendar1.Top = .Top: Calendar1.Left = .Offset(5, 1).Left
            Calendar1.Width = 130
            Calendar1.Height = 110
            ActiveWindow.FreezePanes = False
        End With
End sub
Private Sub Calendar1_Click()
        Selection.Value = Calendar1
        Calendar1.Visible = False
        [P4].Select: ActiveWindow.FreezePanes = True
  End With
End Sub
Tôi nghĩ nó luôn nhảy về P4 bởi tại P4.Select tôi đã thử bỏ .Select nhưng không bỏ được. Vì vậy tôi muốn hỏi:

1- Có câu lệnh nào khác [P4].Select: ActiveWindow.FreezePanes = True
(với ý tưởng con trỏ không nhảy về P4 nhưng vẫn thực hiện được freezepanes tại P4)

2- Có cách nào để Calendar1 xuất hiện cách [L2:AU2] khoảng 2 dòng (để nó nằm dưới đường FreezePanes).
Thank !
 
Upvote 0
Xin các bạn chỉ dùm tôi cách tạo phím tắt bằng một đoạn code
vd: Ctrl+Shift+M là "Merge and center"
Ctrl+Alt+F là "Fill color"
Cám ơn nhiều nhé
 
Upvote 0
Tôi chưa tìm ra cách bỏ cái [P4].Select, nhưng cũng chưa tìm ra cách thay thế để calendar không bị che khuất.
Vậy hãy dùng tạm bằng cách nới chiều cao dòng 2 hoặc dòng 3 lên cho đủ chiều cao của cái calendar
 
Upvote 0
Tôi chưa tìm ra cách bỏ cái [P4].Select, nhưng cũng chưa tìm ra cách thay thế để calendar không bị che khuất.
Vậy hãy dùng tạm bằng cách nới chiều cao dòng 2 hoặc dòng 3 lên cho đủ chiều cao của cái calendar

Thanks ptm0412 ! Tôi sẽ dùng tạm cách của bạn cho đến khi có một giải pháp mới. Mong rằng bạn sẽ nhanh chóng quay lại chủ đề này.
 
Upvote 0
Thanks ptm0412 ! Tôi sẽ dùng tạm cách của bạn cho đến khi có một giải pháp mới. Mong rằng bạn sẽ nhanh chóng quay lại chủ đề này.
Tôi nghĩ anh nên cho Freeze Panes mặc định tại P4 luôn (khỏi cho vào code)
Việc còn lại là chỉnh Calendar sao cho đỉnh của nó luôn nằm tại P4, tức nằm dưới đường vạch của Freeze Panes ---> Vậy là không bị che rồi
giờ tôi giã định rằng Freeze Panes đã được thiệt lập sẳn tại cell P4, ta sửa code lại thành:
PHP:
Private Sub worksheet_selectionchange(ByVal Target As Range)
  Dim ScrRng As Range
  With ActiveWindow
    Set ScrRng = ActiveSheet.Cells(.ScrollRow, .ScrollColumn)
  End With
  With Target
    Calendar1.Visible = (Not Intersect([L2:AU2], Target) Is Nothing)
    Calendar1.Top = ScrRng.Top: Calendar1.Left = ScrRng.Left
    Calendar1.Width = 130
    Calendar1.Height = 110
  End With
End Sub
PHP:
Private Sub Calendar1_Click()
  Selection.Value = Calendar1
  Calendar1.Visible = False
End Sub
Lưu ý: Nếu Freeze Panes chưa được thiết lập thì Calendar sẽ "nhảy" đến cell A1
Tham khảo về Freeze Panes tại bài này:
http://www.giaiphapexcel.com/forum/showthread.php?t=19651
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom