Tìm hiểu về việc tạo note bằng vba

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

test1986

Thành viên mới
Tham gia
19/10/22
Bài viết
48
Được thích
11
Em tìm hiểu về note trong excel thông qua nhiều bài viết không đầy đủ thì biết được những câu lệnh như sau:
1/ Để tạo note cho ô thì:
Mã:
Range("D5").AddComment ("tao moi note")
Mã:
Cells(4, 4).AddComment "tao moi note"
2/ Để thay đổi nội dung note cho ô thì:
Mã:
Cells(4, 4).Comment.Text "thay thế nội dung note"
3/ Xóa note cho ô thì:
Mã:
Cells(4, 4).Comment.Delete
Hiện tại, em muốn tìm hiểu thêm về ba trường hợp sau nhưng không tìm thấy tài liệu nào hướng dẫn:
-Cập nhật thêm nội dung vào note của ô mà không làm mất nội dung trong note đang có ( như trường hợp 2/ là sẽ thay thế nội dung có ở trường hợp 1/)
-Tất cả những tài liệu em tìm được đều hướng dẫn dữ liệu nhập vào note đều ở dạng trực tiếp trong hai dấu "". Em muốn tìm hiểu chuyển dữ liệu từ textbox1.value trên userform vào note của ô.
- Hiển thị dữ liệu từ note của ô vào textbox1.value trên userform để người nhập file có thể xem được những lưu ý của người nhập file trước đó.
Mong mọi người có thể chia sẽ em tài liệu đầy đủ hơn để em có thể nguyên cứu thêm ạ.
Em xin cảm ơn ạ.
 
Bạn xem ví dụ của tôi dưới đây để làm cho vấn đề của bạn nhé

C#:
Function ReadComment(rng As Range)
    If Not rng.Comment Is Nothing Then
        ReadComment = rng.Comment.Text
    End If
End Function

Sub AddOrEditComment(rng As Range, ByVal Text As String, ByVal IsEdit As Boolean)
    If rng.Comment Is Nothing Then
        rng.AddComment Text
    Else
        If IsEdit Then
            rng.Comment.Text Text
        Else
            rng.Comment.Text rng.Comment.Text & vbNewLine & Text
        End If
    End If
End Sub

Sub TestComment()
    AddOrEditComment ActiveCell, "Nguyen Duy Tuan", False
    MsgBox ReadComment(ActiveCell)
End Sub
 
Upvote 0
Bạn xem ví dụ của tôi dưới đây để làm cho vấn đề của bạn nhé

C#:
Function ReadComment(rng As Range)
    If Not rng.Comment Is Nothing Then
        ReadComment = rng.Comment.Text
    End If
End Function

Sub AddOrEditComment(rng As Range, ByVal Text As String, ByVal IsEdit As Boolean)
    If rng.Comment Is Nothing Then
        rng.AddComment Text
    Else
        If IsEdit Then
            rng.Comment.Text Text
        Else
            rng.Comment.Text rng.Comment.Text & vbNewLine & Text
        End If
    End If
End Sub

Sub TestComment()
    AddOrEditComment ActiveCell, "Nguyen Duy Tuan", False
    MsgBox ReadComment(ActiveCell)
End Sub
Em cảm ơn anh @Nguyễn Duy Tuân rất nhiều, em đã có thể hiểu được cách thực hiện cho trường hợp 1/ và trường hợp 2/ thông qua ví dụ rất dễ hiểu của anh.
Hiện tại, em nghĩ là em chỉ cần nguyên cứu thêm về activecell nữa là file sẽ hoạt động tốt.
 
Upvote 0
Em cảm ơn anh @Nguyễn Duy Tuân rất nhiều, em đã có thể hiểu được cách thực hiện cho trường hợp 1/ và trường hợp 2/ thông qua ví dụ rất dễ hiểu của anh.
Hiện tại, em nghĩ là em chỉ cần nguyên cứu thêm về activecell nữa là file sẽ hoạt động tốt.

ActiveCell là ô đang được chọn. Còn chỉ định đến một địa chỉ nào đó bạn dùng Range("Địa chỉ ô"). Đọc Comment từ một ô lên TextBox1 thì bạn chỉ cần gán nó khi mở Userform.

C#:
Private Sub UserForm_Initialize()
    TextBox1.ControlTipText = ReadComment(Range("A1"))
End Sub
 
Upvote 0
ActiveCell là ô đang được chọn. Còn chỉ định đến một địa chỉ nào đó bạn dùng Range("Địa chỉ ô"). Đọc Comment từ một ô lên TextBox1 thì bạn chỉ cần gán nó khi mở Userform.

C#:
Private Sub UserForm_Initialize()
    TextBox1.ControlTipText = ReadComment(Range("A1"))
End Sub
Hiện tại, giá trị của hàng và cột của em đều là dữ liệu số.
Khi em áp dụng câu lệnh như bên dưới thì không báo lỗi nhưng vị trí ô ActiveCell lại không đúng
Mã:
ActiveCell.Offset(R, C).Activate  'R và C là số ví dụ là 6 và 4
Em đang loay hoay chưa biết làm sao để chỉ định Activecell bằng Range("") ( Range("Chữ & số"))
Anh có thể hướng dẫn em thêm về Activecell không ạ?
 
Upvote 0
Hiện tại, giá trị của hàng và cột của em đều là dữ liệu số.
Khi em áp dụng câu lệnh như bên dưới thì không báo lỗi nhưng vị trí ô ActiveCell lại không đúng
Mã:
ActiveCell.Offset(R, C).Activate  'R và C là số ví dụ là 6 và 4
Em đang loay hoay chưa biết làm sao để chỉ định Activecell bằng Range("") ( Range("Chữ & số"))
Anh có thể hướng dẫn em thêm về Activecell không ạ?

Tôi chưa hiễu ró ý bạn lắm, có vẻ bạn đang loay hay về việc xác định vị trí ô trên sheet. Có một cách khác để trỏ đến một ô trên sheet là Cells(tọa độ dòng, tọa độ cột) . Bạn thử xem đúng mục đích không?

ActiveSheets.Cells(4,2).Activate
Hoặc chỉ viết Cells(4,2).Activate
Hoặc khai báo biến trỏ đến sheet
Dim sh as Worksheet
Set sh = Thisworkbook.Sheets("Tên sheet")

TextBox1.ControlTipText := ReadComment(sh.Cells(4,2))
 
Upvote 0
Tôi chưa hiễu ró ý bạn lắm, có vẻ bạn đang loay hay về việc xác định vị trí ô trên sheet. Có một cách khác để trỏ đến một ô trên sheet là Cells(tọa độ dòng, tọa độ cột) . Bạn thử xem đúng mục đích không?

ActiveSheets.Cells(4,2).Activate
Hoặc chỉ viết Cells(4,2).Activate
Hoặc khai báo biến trỏ đến sheet
Dim sh as Worksheet
Set sh = Thisworkbook.Sheets("Tên sheet")

TextBox1.ControlTipText := ReadComment(sh.Cells(4,2))
Dạ cảm ơn anh, em đã áp dụng thành công với câu lệnh
Mã:
sht.Cells(R, C).Activate
Do em đọc tài liệu thấy nói xoay quanh 2 đối tượng là range("") và offset() ở đường link bên dưới nên em loay hoay mãi mà không áp dụng được ạ.
https://learn.microsoft.com/en-us/o...cells-and-ranges/working-with-the-active-cell
 
Upvote 0
Hiện tại, giá trị của hàng và cột của em đều là dữ liệu số.
Khi em áp dụng câu lệnh như bên dưới thì không báo lỗi nhưng vị trí ô ActiveCell lại không đúng
Mã:
ActiveCell.Offset(R, C).Activate  'R và C là số ví dụ là 6 và 4
Em đang loay hoay chưa biết làm sao để chỉ định Activecell bằng Range("") ( Range("Chữ & số"))
Anh có thể hướng dẫn em thêm về Activecell không ạ?
ActiveCell nghĩa là địa chỉ đang được chọn. Là tương ứng với cái được chọn trong hình bên dưới.
1732937756645.png
Còn .Offset(R, C) thì bạn dùng là .Offset(6, 4)
Áp dụng phải là
PHP:
ActiveCell.Offset(4, 6).Activate
Hoặc
PHP:
Range("A1").Offset(4, 6).Activate
lấy ô A1 làm chuẩn thay vì ActiveCell
 
Upvote 0
ActiveCell nghĩa là địa chỉ đang được chọn. Là tương ứng với cái được chọn trong hình bên dưới.
View attachment 305984
Còn .Offset(R, C) thì bạn dùng là .Offset(6, 4)
Áp dụng phải là
PHP:
ActiveCell.Offset(4, 6).Activate
Hoặc
PHP:
Range("A1").Offset(4, 6).Activate
lấy ô A1 làm chuẩn thay vì ActiveCell
Dạ em cũng đã thử nghiệm câu lệnh như bên dưới nhưng ô activecell không thay đổi (ví dụ trước khi thực hiện sub() thì Activecell là A1 thì sau khi thực hiện sub() vẫn là ô A1) và cũng không có nhận được một thông báo lỗi nào ạ.
Mã:
Dim R as Variant
Dim C as Variant
R = Me.cboMatHang.ListIndex + startRow
'MsgBox R
C = Me.cboBoPhan.ListIndex + startCol
'MsgBox C
ActiveCell.Offset(R, C).Activate

Dù hiện tại em đã áp dụng câu lệnh theo hướng dẫn nhiệt tình của anh @Nguyễn Duy Tuân và nhận được kết quả em mong muốn nhưng em vẫn đang thắc mắc là đoạn code trên của em sai ở đâu đó ạ.
Em cảm ơn
 
Upvote 0
Mã:
Dim R as Variant
Dim C as Variant
R = Me.cboMatHang.ListIndex + startRow
'MsgBox R
C = Me.cboBoPhan.ListIndex + startCol
'MsgBox C
ActiveCell.Offset(R, C).Activate

Dù hiện tại em đã áp dụng câu lệnh theo hướng dẫn nhiệt tình của anh @Nguyễn Duy Tuân và nhận được kết quả em mong muốn nhưng em vẫn đang thắc mắc là đoạn code trên của em sai ở đâu đó ạ.
Em cảm ơn
Bạn suy nghĩ như thế nào khi khai báo 2 biến R, C kiểu Variant?
 
Upvote 0
Bạn suy nghĩ như thế nào khi khai báo 2 biến R, C kiểu Variant?
Dạ ban đầu em chỉ khai báo kiểu Long
Mã:
Dim R as Long
Dim C as Long
R = Me.cboMatHang.ListIndex + startRow
'MsgBox R
C = Me.cboBoPhan.ListIndex + startCol
'MsgBox C
ActiveCell.Offset(R, C).Activate
Nhưng sau khi khai báo như vậy thì ô em cần vẫn không trở thành Activecell nên sau đó em mới thay Long bằng Variant để kiểm tra xem có phải em khai báo sai dẫn đến câu lệnh hoạt động không chính xác đó anh.
Vì em từng đọc trên diễn đàn có một bài viết nói về kiểu Variant là kiểu dữ liệu linh động nên em mới thử xem sao. Kết quả sau khi em thử thì câu lệnh vẫn không hoạt động chính xác như em mong muốn ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom