Lấy tổng thời gian của video đưa vào ô sheet excel theo thứ tự

Liên hệ QC

hoanhnnc

Thành viên chính thức
Tham gia
13/3/08
Bài viết
58
Được thích
0
Muốn cho video chạy hết thời gian đã lấy vào ô các anh chị có cách nào chỉ giáo với ạ
 
Lần chỉnh sửa cuối:
PHP:
Sub GetVideoLength()
    Const typeVideo = "MP4,WMV,..."
    Const MainFolderName = "C:\Users\Administrator\Desktop"      '<------ duong dan Folder chua cac video
    Dim objShell As Object, objFolder As Object, objFolderItem As Object
    Dim FSo As Object, oFolder As Object, oFile As Object, extFile As String
    Dim res As Variant, i As Long
    Set objShell = CreateObject("Shell.Application")
    Set FSo = CreateObject("scripting.FileSystemObject")
    
    Set oFolder = FSo.GetFolder(MainFolderName)
    Set objFolder = objShell.Namespace(oFolder.path)
    ReDim res(1 To oFolder.Files.Count, 1 To 2)
    
    For Each oFile In oFolder.Files
        extFile = FSo.GetExtensionName(oFile)
        If InStr(1, typeVideo, extFile, vbTextCompare) > 0 Then
            i = i + 1
            Set objFolderItem = objFolder.ParseName(oFile.Name)
            res(i, 1) = oFile.Name
            res(i, 2) = objFolder.GetDetailsOf(objFolderItem, 27)
        End If
    Next oFile
    Sheet1.Range("A2").Resize(100000, 2).ClearContents
    If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res
End Sub
 
Upvote 0
Nhiều files:
Set oShell = CreateObject("Shell.Application")
Set oDir = oShell.Namespace("c:\wherethehelltheyare")
For Each sFile In oDir.Items
Debug.Print oDir.GetDetailsOf(sFile, 27)
Next

1 file:
With CreateObject("Shell.Application").Namespace("c:\wherethehellitis")
MsgBox .GetDetailsOf(.Items.Item("filename"), 27)
End With
 
Upvote 0
Em tìm mãi mới thấy cái File Type.

PHP:
Sub GetVideoLength_2()
    Const typeVideo = "Video"
    Const pathFolder = "C:\Users\Administrator\Desktop"
    Dim oShell As Object, objFolder As Object, oFile As Object
    Dim res As Variant, i As Long
    Set oShell = CreateObject("Shell.Application")
    Set objFolder = oShell.Namespace(pathFolder)
    ReDim res(1 To objFolder.Items.Count, 1 To 2)
    For Each oFile In objFolder.Items
        If objFolder.GetDetailsOf(oFile, 9) = typeVideo Then
            i = i + 1
            res(i, 1) = oFile.Name
            res(i, 2) = objFolder.GetDetailsOf(oFile, 27)
        End If
    Next
    Sheet1.Range("A2").Resize(100000, 2).ClearContents
    If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res
End Sub
 
Upvote 0
Em tìm mãi mới thấy cái File Type.

PHP:
Sub GetVideoLength_2()
    Const typeVideo = "Video"
    Const pathFolder = "C:\Users\Administrator\Desktop"
    Dim oShell As Object, objFolder As Object, oFile As Object
    Dim res As Variant, i As Long
    Set oShell = CreateObject("Shell.Application")
    Set objFolder = oShell.Namespace(pathFolder)
    ReDim res(1 To objFolder.Items.Count, 1 To 2)
    For Each oFile In objFolder.Items
        If objFolder.GetDetailsOf(oFile, 9) = typeVideo Then
            i = i + 1
            res(i, 1) = oFile.Name
            res(i, 2) = objFolder.GetDetailsOf(oFile, 27)
        End If
    Next
    Sheet1.Range("A2").Resize(100000, 2).ClearContents
    If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res
End Sub
Cũng không hẳn như thế đâu. Trong thư mục của tôi chỉ có 1 video WMV. Trong thư mục thì cột Typ trả về "Windows Media Video File". Chạy code của bạn thì không có kết quả.

Nếu sửa thành
Mã:
Const typeVideo = "Windows Media Video File"
...
If objFolder.GetDetailsOf(oFile, 2) = typeVideo Then
Thì có kết quả.

Tất nhiên không thể cứng nhắc Const typeVideo = "Windows Media Video File" vì video có thể có nhiều typ.

Ngoài ra objFolder.GetDetailsOf(oFile, 27) trả về trên máy tôi kết quả "640 pikseli". Không quan trọng chuyện "pikseli" vì đó là tiếng Ba Lan. Nhưng rõ ràng 640 không là thời gian phim dài bao nhiêu. Mà chủ thớt hỏi về thời gian.
 
Upvote 0
Cũng không hẳn như thế đâu. Trong thư mục của tôi chỉ có 1 video WMV. Trong thư mục thì cột Typ trả về "Windows Media Video File". Chạy code của bạn thì không có kết quả.

Nếu sửa thành
Mã:
Const typeVideo = "Windows Media Video File"
...
If objFolder.GetDetailsOf(oFile, 2) = typeVideo Then
Thì có kết quả.

Tất nhiên không thể cứng nhắc Const typeVideo = "Windows Media Video File" vì video có thể có nhiều typ.

Ngoài ra objFolder.GetDetailsOf(oFile, 27) trả về trên máy tôi kết quả "640 pikseli". Không quan trọng chuyện "pikseli" vì đó là tiếng Ba Lan. Nhưng rõ ràng 640 không là thời gian phim dài bao nhiêu. Mà chủ thớt hỏi về thời gian.
Chắc do máy tính của anh, hoặc lý do gì đó em chịu.
Trước khi gửi đáp án em đã chạy thử với *.mp4, *.wmv và cho kết quả đúng.
 
Upvote 0
Chắc do máy tính của anh, hoặc lý do gì đó em chịu.
Trước khi gửi đáp án em đã chạy thử với *.mp4, *.wmv và cho kết quả đúng.
Tôi không nói sai hay đúng. Tôi nói là
Cũng không hẳn như thế đâu
Tức tùy theo system mà có thể khác nhau. Tôi dùng XP Home. Ý là nếu viết code mà muốn kết quả không phụ thuộc vào system thì không thể mặc định được là "Video".

Ngoài ra còn vụ 640? Với tham số 27 thì tôi nhận được 640. Trong khi đó nếu lấy thời gian thì phải có 00:01:34 cho tập tin WMV của tôi. Trên system của bạn thì 27 trả về thời gian? Nếu thế thì cũng lại phụ thuộc vào system.
 
Upvote 0
PHP:
Sub GetVideoLength()
    Const typeVideo = "MP4,WMV,..."
    Const MainFolderName = "C:\Users\Administrator\Desktop"      '<------ duong dan Folder chua cac video
    Dim objShell As Object, objFolder As Object, objFolderItem As Object
    Dim FSo As Object, oFolder As Object, oFile As Object, extFile As String
    Dim res As Variant, i As Long
    Set objShell = CreateObject("Shell.Application")
    Set FSo = CreateObject("scripting.FileSystemObject")
  
    Set oFolder = FSo.GetFolder(MainFolderName)
    Set objFolder = objShell.Namespace(oFolder.path)
    ReDim res(1 To oFolder.Files.Count, 1 To 2)
  
    For Each oFile In oFolder.Files
        extFile = FSo.GetExtensionName(oFile)
        If InStr(1, typeVideo, extFile, vbTextCompare) > 0 Then
            i = i + 1
            Set objFolderItem = objFolder.ParseName(oFile.Name)
            res(i, 1) = oFile.Name
            res(i, 2) = objFolder.GetDetailsOf(objFolderItem, 27)
        End If
    Next oFile
    Sheet1.Range("A2").Resize(100000, 2).ClearContents
    If i > 0 Then Sheet1.Range("A2").Resize(i, 2).Value = res
End Sub
Bạn giúp Giúp cho Chót:
 

File đính kèm

  • Main.xlsm
    55.6 KB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
Chắc do máy tính của anh, hoặc lý do gì đó em chịu.
Trước khi gửi đáp án em đã chạy thử với *.mp4, *.wmv và cho kết quả đúng.
Tôi đã kiểm tra trên 2 máy của tôi:
1. XP Home:
- GetDetailsOf(oFile, 9) trả về RỖNG
- objFolder.GetDetailsOf(oFile, 27) trả về 640 pikseli

2. Windows 8:
- GetDetailsOf(oFile, 9) trả về "Video"
- objFolder.GetDetailsOf(oFile, 27) trả về 00:01:34

Đây đúng như befaint đã viết.

Như thế trên XP Home của tôi có hơi khác. Có khi cũng không do XP mà do thư viện nào đó không mới như ở những system khác. Nhưng XP không còn được hỗ trợ nên muốn có mới cũng bó tay :D

Nếu trên Windows 7, 10 cũng như trên Windows 8 của tôi thì coi như 9 và 27 là các chỉ số tốt. Vì còn ai dùng XP ngoài batman1 đâu.
 
Upvote 0
Cái tham số thứ hai của Folder.GetDetailsOf tên thật là iColumn - tức là số enumerate của cái cột ta thấy trên Windows Explorer.
Rất tiếc, các cột của Explorer không hoàn toàn giống nhau cho các phiên bản khác nhau của Windows.
Và điều đáng tiếc thứ hai là MS không có tài liệu giải thích rõ chuyện này.
Tôi nghĩ WinXP thì bác phải thử luôn từ 0 đến 50+. Và có lẽ phải thử nhiều loại files để đúc kết ra kết quả.
(tôi nhớ mang máng hình như Win2000 chỉ có tới 30+ columns)
 
Upvote 0
Các bạn giúp đỡ với sao video chạy theo thời gian trên ô excel chạy xong nhảy sang sheet bên mình làm nó chạy lan xạ hết khổ ghê
 
Upvote 0
Cái tham số thứ hai của Folder.GetDetailsOf tên thật là iColumn - tức là số enumerate của cái cột ta thấy trên Windows Explorer.
Rất tiếc, các cột của Explorer không hoàn toàn giống nhau cho các phiên bản khác nhau của Windows.
Và điều đáng tiếc thứ hai là MS không có tài liệu giải thích rõ chuyện này.
Tôi nghĩ WinXP thì bác phải thử luôn từ 0 đến 50+. Và có lẽ phải thử nhiều loại files để đúc kết ra kết quả.
(tôi nhớ mang máng hình như Win2000 chỉ có tới 30+ columns)
Chả cần bác nói thì tôi cũng đã thử rồi. Chỉ số tính từ 0, và tôi thử từ 0 đến 60 cơ. Nhưng từ 29 trở đi tôi thấy hoặc rỗng hoặc chả có gì "quan trọng".
Tôi không nói là đã thử vì chả có nghĩa gì cả. Chả liên quan gì tới cái tôi trao đổi với befaint.

Thực ra không hẳn như bác nói. Trong Explorer thì thứ tự các cột có thể tự thay đổi tùy ý. Nhưng 0 luôn trả về tên tập tin. Code của befaint lấy tên từ oFile.Name nhưng cũng có thể lấy với chỉ số 0. Như thế thì thứ tự cột trong Explorer không phải là các chỉ số.
 
Upvote 0
... Như thế thì thứ tự cột trong Explorer không phải là các chỉ số.
Nó là cách đối tượng Folder dùng để tạo chỉ số cho các cột của nó. Các cột là một collection, và có một con toán enumerate để đặt chỉ số cho từng cột.
Cái thứ tự ta nhìn thấy trên Explorer là chỉ số ảo. Cái thứ tự ta nhìn thấy theo bảng chọn lựa properties của folder gần với số này hơn.
Cái phiên bản COM (nằm trong Shell32.dll) dùng cho Win2000 khác với Win7. Và cách enum của chúng hơi khác nhau.
 
Lần chỉnh sửa cuối:
Upvote 0
Nó là cách đối tượng Folder dùng để tạo chỉ số cho các cột của nó. Các cột là một collection, và có một con toán enumerate để đặt chỉ số cho từng cột.
Cái thứ tự ta nhìn thấy trên Explorer là chỉ số ảo. Cái thứ tự ta nhìn thấy theo bảng chọn lựa properties của folder gần với số này hơn.
Cái phiên bản COM (nằm trong Shell32.dll) dùng cho Win2000 khác với Win7. Và cách enum của chúng hơi khác nhau.
Thì ý tôi cũng chỉ là: ta cứ biết đấy là các chỉ số có định nghĩa. Thế thôi. Nhắc tới Explorer thì có thể lại gây hiểu lầm không đáng có.
 
Upvote 0
Trên Windows 8, 10 thì chỉ số 27 là thời gian phát nhạc và phim. Chỉ số 9 đúng là xác định kiểu nhưng dùng If objFolder.GetDetailsOf(oFile, 9) = "Video" Then thì chỉ chuẩn với system là phiên bản tiếng Anh. Vì tùy theo system với ngôn ngữ nào mà nó sẽ khác. Vd. với Windows tiếng Ba Lan thì objFolder.GetDetailsOf(oFile, 9) trả về "Wideo" nên điều kiện sẽ không thỏa.

- Windows phiên bản tiếng Anh: Image (vd. PNG), Text (vd. TXT), Document (vd. DOC), Audio (vd. WMA), Video (vd. MP4, WMV, WEBM)

- Windows phiên bản tiếng Ba Lan: Obraz, Tekst, Dokument, Audio, Wideo
 
Upvote 0
Để phát phim không cần phải chèn Windows Media Player vào sheet.

Mà muốn làm gì thì cũng phải mô tả. Đâu phải cứ tung tập tin lên là xong. Người khác phải kiểm tra, phân tích code để đoán ý? Tại sao người ta phải nhọc công như thế khi ai đó có thể tự nói ra?
 
Upvote 0
Thì ý tôi cũng chỉ là: ta cứ biết đấy là các chỉ số có định nghĩa. Thế thôi. Nhắc tới Explorer thì có thể lại gây hiểu lầm không đáng có.
Cái COM ấy nó cũng được Explorer sử dụng để lập các cột. Lúc ấy Windows cũng đang phát triển Visual Studio cho nên cái tên "columns" có thể lấy theo đối tượng GridView, chúng dùng chỉ số (enum theo C++) để xác định danh phận trong collection.
Đúng ra, MS phải cho thêm một dãy enum (vd. fldrFileName = 0, fldrSize = 1, fldrType = 2,...). Như vậy, người dùng khỏi phải bị vướng cho các phiên bản khác nhau. Có thể nó có, nhưng cái class ấy nó không trình ra (expose) thì mình chịu. (*)

...

- Windows phiên bản tiếng Anh: Image (vd. PNG), Text (vd. TXT), Document (vd. DOC), Audio (vd. WMA), Video (vd. MP4, WMV, WEBM)

- Windows phiên bản tiếng Ba Lan: Obraz, Tekst, Dokument, Audio, Wideo
Windows nó không cho cái dãy enum kia thì mình bắt buộc phải tự tạo lấy.

(*) Có thể bọn phát triển COM chúng có những class đặc biệt.
C++ có cái rất khó chịu là "Friend Class". Class A là "friend" của B thì nó có thể "xâm phạm đời tư" của B. Theo luật, B có thể giấu 1 số thuộc tính không cho thấy nhưng A có thể vào và phơi ra hết. Ông bà ta nói "tin bạn mất vợ, tin bợm mất bò" là vậy.
 
Upvote 0
Cái tham số thứ hai của Folder.GetDetailsOf tên thật là iColumn - tức là số enumerate của cái cột ta thấy trên Windows Explorer.
Không phải trên Windows Explorer đâu anh. Trên Windows Explorer thay đổi vị trí các cột đó thoải mái mà không ảnh hưởng tới iColumn.

Danh sách thì như hình (Windows 10)
1576808666152.png
Windows 2000 (chắc xp cũng giống) như link này: https://docs.microsoft.com/en-us/pr...ve/ee176615(v=technet.10)?redirectedfrom=MSDN

Em tìm cái 'Shell view' mà chưa ra.


1576808569645.png
 
Upvote 0
Không phải trên Windows Explorer đâu anh. Trên Windows Explorer thay đổi vị trí các cột đó thoải mái mà không ảnh hưởng tới iColumn.
...
.
Ở bài #14 tôi có nói:
Cái thứ tự ta nhìn thấy trên Explorer là chỉ số ảo. Cái thứ tự ta nhìn thấy theo bảng chọn lựa properties của folder gần với số này hơn.
"bảng chọn lựa properties" mà tôi đề cập ở đây chính là cái hình bạn đưa ra ở trên.

Và ở bài #11, tôi nói:
Cái tham số thứ hai của Folder.GetDetailsOf tên thật là iColumn - tức là số enumerate của cái cột ta thấy trên Windows Explorer.
Từ "cột ta thấy" chỉ là cách tôi minh hoạ cái tên iColumn.

Thú thật là do tôi không biết cách dịch từ "enumerate" cho nên mới gây hiểu lầm. Số enum này là số mã mà cái collection của các columns sử dụng để đặt id cho từng thành phần. Các số này là hằng, không thay đổi được như vị trí của columns hiển hiện trên Explorer.
Ví dụ, cái collection Columns có các phần tử { tên, kích cỡ, loại, ... } thì nó sẽ enum { 0, 1, 2, ... }; và Columns[1] = kích cỡ.
Lưu ý: collection khác với mảng.
- Với mảng, chỉ số là độ cách xa giữa phần tử và đầu mảng; phần tử đầu tiên cách đầu mảng 0, phần tử thứ hai cách 1...
- Với collection, con số truy cập chỉ là cái id của phần tử bên trong collection thôi; phần tử id 0 không nhất thiết phải nằm đầu tiên.
Trên thực tế, các phần tử của mảng nằm sát nhau; các phần tử của collection muốn nằm ở đâu cũng được.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom