[HỎI] Hàm hoặc phương thức đo độ dài của chuỗi trong VBA. (1 người xem)

Liên hệ QC

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

harrybotboy

Thành viên mới
Tham gia
17/6/13
Bài viết
13
Được thích
4
Nghề nghiệp
Sinh viên
Anh chị nào biết hàm hoặc phương thức nào trong VBA đo độ dài của chuỗi ký tự không ạ. Em thấy trong VSTO có
Mã:
ToString().Length
, mà VBA không có cái này.
 
Anh chị nào biết hàm hoặc phương thức nào trong VBA đo độ dài của chuỗi ký tự không ạ. Em thấy trong VSTO có
Mã:
ToString().Length
, mà VBA không có cái này.

Bạn làm thế này nhé: Alt + F11 --> F2 --> trong Combobox mà hiện thời có <All Libraries> bạn chọn VBA --> ở phần dưới bên phải có ListBox. Bạn hãy đọc xem VBA có những gì nhé.

Tôi thấy rất nhiều người muốn học VBA bằng cách đốt cháy giai đoạn. Có nhiều người cũng "bắt chước" viết code dựa theo code có sẵn hoặc copy về dùng nhưng lại đi hỏi: Public là thế nào, khác Private chỗ nào?

Muốn học VBA thì trước hết phải có căn bản: có những kiểu dữ liệu nào, cách khai báo biến, hàm và sub là gì, cấu trúc của chúng thế nào, có những cấu trúc dữ liệu nào, có những cấu trúc ngôn ngữ nào (vd. FOR, Do ... Loop, IF, Select, ...) v...v

Học mà không đọc help thì hơi lạ. Có quyển sách "help" trong nhà mà cứ chạy đi đâu đó hỏi tùm lum thì hơi khó hiểu.
 
Lần chỉnh sửa cuối:
Upvote 0
Anh chị nào biết hàm hoặc phương thức nào trong VBA đo độ dài của chuỗi ký tự không ạ. Em thấy trong VSTO có
Mã:
ToString().Length
, mà VBA không có cái này.

VSTO tức lả Visual Studio? Cái suite này có hàng nửa tá ngôn ngữ. Hầu hết các ngôn ngữ trong đấy chạy trên nền tảng .NET

Đem câu ấy ra hỏi là bạn dùng VSTO mà chả có một căn bản gì về lập trình hướng đối tượng (LTHĐT).

Hai ngôn ngữ căn bản trong VSTO là C# và VB.NET đều là loại ngôn ngữ HĐT. Tất cả các đối tượng trong dot NET đều có cái giao diện (Interface) để áp dụng hàm ToString(). Hàm này trả về một đối tượng thuộc class String. Class String có thuộc tính Length cho biết dộ dài sử dụng của chuỗi. 99% các dịch vụ làm việc trên String đều dựa vào các hàm và thuộc tính public của class String. (theo định nghĩa LTHĐT, toán tử cũng là hàm)

VBA căn bản từ BASIC. Tuy nó có sử dụng class và object nhưng không phải là ngôn ngữ HĐT. String trong VBA là một kiểu căn bản chứ không phải là một class.

Cũng như hầu hết các ngôn ngữ cấu trúc, để làm việc với string, hệ thống VBA có cho đày đủ hàm và toán tử rất hữ dụng (trong lập trình cấu trúc, toán tử không phải là hàm). Số hàm này làm việc với BASIC tự thuở nào vẫn hữu hiệu và không hề thấy thiếu sót.

Tóm lại, để tim độ dài của string, trong VBA người ta gọi hàm LEN (thuộc về thư viện của string).
 
Upvote 0
Em mới tìm hiểu VBA, đang mày mò viết code về đồng hồ bấm giờ mà search google chỉ mới tìm được đoạn mã chương trình này viết bằng C#, nên em muốn chuyển nó sang VBA xem thế nào. Ai ngờ trong đấy có addin Visual studio tools for office nên em thử tìm hiểu sơ sơ luôn, đúng là cái này phải biết về lập trình hướng đối tượng thật, em mới chỉ biết sơ cái này bữa học về JavaScript thôi.

Tiện đây cho em hỏi em viết đoạn code này về đồng hồ bấm giờ mà chưa chạy được, nhờ các anh chị góp ý cho em.

Mã:
Dim iMin As Integer
Dim igiay As Integer
Dim ims As Integer
Sub runtimeGiay_tick()
    iMin = 0
    igiay = 0
    ims = 0
    Do
        igiay = igiay + 1
        If igiay = 60 Then
            igiay = 0
            Do
                iMin = iMin + 1
                If VBA.Strings.Len(VBA.Conversion.CStr(iMin)) = 1 Then
                    Range("A3").Value = "0" & iMin
                Else
                    Range("A3").Value = iMin
                End If
            Loop
        End If
    Loop
End Sub
Sub runtimeMS_tick()
    Do
        ims = ims + 1
        Range("C3").Value = ims
        If ims = 100 Then
            ims = 0
    Loop
End Sub
 
Upvote 0
Em mới tìm hiểu VBA, đang mày mò viết code về đồng hồ bấm giờ mà search google chỉ mới tìm được đoạn mã chương trình này viết bằng C#, nên em muốn chuyển nó sang VBA xem thế nào. Ai ngờ trong đấy có addin Visual studio tools for office nên em thử tìm hiểu sơ sơ luôn, đúng là cái này phải biết về lập trình hướng đối tượng thật, em mới chỉ biết sơ cái này bữa học về JavaScript thôi.

Tiện đây cho em hỏi em viết đoạn code này về đồng hồ bấm giờ mà chưa chạy được, nhờ các anh chị góp ý cho em.

Thì bạn cứ mô tả muốn "bấm giờ" thế nào là được rồi, khỏi cần đưa code lên đây
 
Upvote 0
C# và VB.NET cùng một nền tảng nên có thể dịch thẳng 99% code qua lại với nhau.

VBA thì hoàn toàn không liên hệ gì với C# cho nên rất hiếm khi dịch trực tiếp được. Thường thường thì phải viết code lại. Có khi còn phải đổi cả giải thuật.

Vấn đề của bạn đâu phải là hàm tính độ dài chuỗi. Đáng lẽ bạn phải hỏi trong VBA có cách nào tính được 1 tick như trong class DateTime của .NET hay không. Theo độ hiểu biết của tôi thì hình như thư viện VBA căn bản chỉ tính đến 1 phần trăm giây; muốn tính dưới 1 phần trăm giây thì phải gọi hàm kernel. Tuy nhiên độ hiểu biết của tôi thư viện của VBA chỉ có hạn.

Nói riêng về code trên:
Code tính độ dài chuỗi trên của bạn rườm rà quá sức. Thực ra nó chỉ có mục đích thêm 0 vào trước chuỗi nếu con số nhỏ hơn 10. Có đến nửa tá cách làm gọn hơn.
 
Upvote 0
Em mới tìm hiểu VBA, đang mày mò viết code về đồng hồ bấm giờ mà search google chỉ mới tìm được đoạn mã chương trình này viết bằng C#, nên em muốn chuyển nó sang VBA xem thế nào. Ai ngờ trong đấy có addin Visual studio tools for office nên em thử tìm hiểu sơ sơ luôn, đúng là cái này phải biết về lập trình hướng đối tượng thật, em mới chỉ biết sơ cái này bữa học về JavaScript thôi.

Tiện đây cho em hỏi em viết đoạn code này về đồng hồ bấm giờ mà chưa chạy được, nhờ các anh chị góp ý cho em.

Mã:
Dim iMin As Integer
Dim igiay As Integer
Dim ims As Integer
Sub runtimeGiay_tick()
    iMin = 0
    igiay = 0
    ims = 0
    Do
        igiay = igiay + 1
        If igiay = 60 Then
            igiay = 0
            Do
                iMin = iMin + 1
                If VBA.Strings.Len(VBA.Conversion.CStr(iMin)) = 1 Then
                    Range("A3").Value = "0" & iMin
                Else
                    Range("A3").Value = iMin
                End If
            Loop
        End If
    Loop
End Sub
Sub runtimeMS_tick()
    Do
        ims = ims + 1
        Range("C3").Value = ims
        If ims = 100 Then
            ims = 0
    Loop
End Sub

Tôi chưa cần biết bạn định làm gì, và code có làm cái mà bạn định hay không. Nhưng tôi đã viết rồi. Nếu bạn muốn viết code thì trước hết hãy có cái căn bản đã. Bạn viết cấu trúc Do ... Loop như thế là chưa được. Bạn định thực hiện vòng lặp tới ngày tận thế chăng? Cấu trúc IF cũng sai. Học gì cũng phải có căn bản của căn bản đã. Muốn học bơi thì cũng phải biết trước cách khua chân múa tay đã. Chả nhẽ cứ nhẩy xuống nước rồi tính sau, rồi mới hỏi ai đó vung tay đạp chân thế nào?
 
Upvote 0
RE: Vòng lặp vô tận
Tôi đoán có lẽ code nguyên bản (bằng C#, Java hay C gì đó) có dịch vụ hàm ngắt (interrupt service routine). Khi người sử dụng làm một hành động gì đó (như nhấn phím space chẳng hạn) thì dịch vụ ngắt sẽ ngưng chương trình.

Tuy nhiên đọc thấy chủ thớt dịch code mạnh bạo quá cho nên tôi không dám hỏi vào. Chỉ có thể gợi ý là có những truonwgf hợp chương trình dựa vào kernel và platform để làm việc, nếu đổi platform thì phải thiết kế lại hoàn toàn.
 
Upvote 0
Em đã sửa lại code chương trình "ĐỒNG HỒ BẤM GIỜ", với thời gian giới hạn là 1 phút như sau. Nhưng em chưa làm sao để chương trình hiển thị được dạng "00:07:08" mà nó chỉ hiện là "00:7:8". Mong mọi người góp ý cho em:

Chương trình này có các ô:

Phút: Giây: % giây = A3:B3:C3

A3: Hiển thị số phút trôi qua
B3: Hiển thị số giây trôi qua
C3: Hiển thị số phần trăm giây trôi qua

Mã:
Option Explicit
Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
Sub bam_gio()
    'khai bao bien:
    'ims: 1/100 giay
    'igiay: 1 giay
    'imin: 1 phut
    Dim ims, igiay, imin As Integer
    Dim temp, t1, t2
    'Gan gia tri vao cho bien
    ims = 0
    igiay = 0
    imin = 0
    t1 = GetTickCount
    'Vong lap imin
    Do
        Range("a3").Value = imin
        Range("b3").Value = igiay
        Range("c3").Value = ims
        
        'Gan gia tri cho bien tam thoi temp
        temp = GetTickCount
        'Vong lap ims, miligiay
        Do While ims <= 100
            ims = Fix((GetTickCount - temp) / 10) + 1
            If Len(CStr(ims)) = 1 Then
                Range("c3").Value = "0" & ims
            Else
                Range("c3").Value = ims
            End If
        Loop
        'Thoat vong lap % giay neu % giay da dat den gia tri 100
        'Tuc la luc nay giay se tang them 1 gia tri
        ims = 0
        igiay = igiay + 1 'Tang them 1 gia tri cua giay
        If igiay = 60 Then 'Neu du 60 giay thi se tang them 1 gia tri cua phut
            igiay = 0
            imin = imin + 1 'tang them 1 gia tri cua phut
        End If
     Loop Until imin = 1 'Thuc hien vong lap cho toi 1 phut
     t2 = GetTickCount
     MsgBox (t2 - t1) / 1000, vbInformation, "So giay da thuc hien la: "
End Sub

http://www.flickr.com/photos/24931909@N06/10704216833/lightbox/
 

File đính kèm

  • Thuat toan.jpg
    Thuat toan.jpg
    7.2 KB · Đọc: 50
Lần chỉnh sửa cuối:
Upvote 0
Bạn tham khảo cái này, sử dụng API, chắc bạn cũng đã biết về lập trình nên việc sửa cho phù hợp là vô cùng đơn giản.
Mã:
Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Const nIDEvent = 9999
Sub StartTimer()
    StopTimer
    SetTimer Application.hWnd, nIDEvent, 0.1, AddressOf TimeProc
End Sub
Sub StopTimer()
    KillTimer Application.hWnd, nIDEvent
End Sub
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
[a1] = [a1] + 1
End Function

(Chạy Code bằng việc chạy Sub StartTimer, thời gian tính băng mili giây)
 
Upvote 0
Em đã sửa lại code chương trình "ĐỒNG HỒ BẤM GIỜ", với thời gian giới hạn là 1 phút như sau. Nhưng em chưa làm sao để chương trình hiển thị được dạng "00:07:08" mà nó chỉ hiện là "00:7:8". Mong mọi người góp ý cho em:

Cái này làm bằng tay cũng được:
- Quét chọn A3:C3, bấm Ctrl + ! để mở hộp Custom Format
- Trong tab Number, chọn mục Custom và gõ vào khung Type: 00
Xong

Capture.JPG
 
Upvote 0
Bạn tham khảo cái này, sử dụng API, chắc bạn cũng đã biết về lập trình nên việc sửa cho phù hợp là vô cùng đơn giản.
Mã:
Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
Const nIDEvent = 9999
Sub StartTimer()
    StopTimer
    SetTimer Application.hWnd, nIDEvent, [COLOR=#ff0000][B]0.1[/B][/COLOR], AddressOf TimeProc
End Sub
Sub StopTimer()
    KillTimer Application.hWnd, nIDEvent
End Sub
Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
[a1] = [a1] + 1
End Function

(Chạy Code bằng việc chạy Sub StartTimer, thời gian tính băng mili giây)
Ủa! Ở đâu ra cái vụ 0.1 vậy ta?
 
Upvote 0
Thầy ơi để 0.1 chạy cho nó "tít" :D
Cú pháp hàm:
Mã:
Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, [COLOR=#ff0000]ByVal uElapse As Long[/COLOR], ByVal lpTimerFunc As Long) As Long
Của người ta là biến Long rõ ràng thế thì làm gì có cái vụ 0.1 ở đây chứ
Theo Help thì:
uElapseL Specifies the time-out value, in milliseconds.
Vậy nó phải là biến Long, giá trị nhỏ nhất = 1 tương đương với 1/1000 giây
 
Upvote 0
Web KT

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

Back
Top Bottom