2012-07-21 53 views
6

Tôi có dữ liệu trong một bảng excel theo định dạng sau:VBA Chuyển đổi String để Ngày

 
ItemCode       DeliveryDate 
5456987        24.01.2009 
5456988           
5456989        12.24.2009 
5456990        12/24/2009 

tôi đã lưu trữ các giá trị của DeliveryDate trong một mảng. Tôi cần đưa ra quyết định về những điều cơ bản về ngày và sau đó in kết quả trong một trang tính mới. Vì vậy, tôi phải chuyển đổi các giá trị vào mảng:

Dim current as Date, highest as Date, result() as Date 
For Each itemDate in DeliveryDateArray 
    current = CDate(itemDate) 
    if current > highest then 
     highest = current 
    end if 
    ' some more operations an put dates into result array 
Next itemDate 
'After activating final sheet... 
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result) 

Thật không may, CDate() chức năng ném các lỗi:

Run-time error '13':

Type mismatch

Có một hàm trong VBA mà có thể:

  • phân tích cú pháp chuỗi có mọi định dạng ngày ngày và trả lại đối tượng ngày để làm việc.
  • trả lại đối tượng ngày trống, nếu chuỗi trống hoặc không đúng định dạng (để so sánh trong vòng lặp).

Edit:

Để sao chép các lỗi, chỉ cần chạy myDate = CDate("24.01.2009")

+0

Theo trang web này [http://www.example-code.com /vb/stringtodate.asp] bạn đã làm đúng ... Có lỗi gì? Trên hàng nào - hàng đầu tiên hoặc dòng thứ hai (chuỗi trống)? Bạn đã thử thay đổi định dạng chuỗi chưa? Bạn có thể muốn thay đổi định dạng về cách bạn phân tích cú pháp chuỗi ngày của mình ở đó. "24.01.2009" có thể không được công nhận nhưng "12/24/2009" có thể - cố gắng chỉ chuyển đổi ngày 24 tháng 12 năm 2009 và xem nó có hoạt động hay không. Nếu nó hoạt động, định dạng 24.01.2009 có thể không được chấp nhận. –

+0

Thử chuyển đổi ngày 24/12/2009 để xem nó có hoạt động hay không. Nếu nó hoạt động, thì định dạng dd.MM.yyyy có thể không thể truy cập được đối với CDate. Có thể có một cách để bạn chỉ định cách nó được định dạng sao cho nó có thể phân tích chính xác theo cách bạn muốn. Nếu định dạng dd.MM.yyyy là nguyên nhân gây ra sự cố, hãy thay đổi định dạng trước tiên như thay thế "." bằng dấu "/" và thử chuyển đổi lại. Hoặc định dạng nó sao cho nó trở thành MM/dd/yyyy và sau đó chuyển đổi nó. Tôi đoán tôi chỉ muốn biết nếu "12/24/2009" sẽ lỗi hay không. Kiểm tra trước và cho tôi biết. –

+0

@AnnB., Câu hỏi đầu tiên của tôi là; Có một chức năng VBA mà có thể phân tích chuỗi với định dạng ngày * bất kỳ * và trả về một đối tượng ngày để làm việc với? –

Trả lời

8

Hãy thử sử dụng Replace để xem nó có hiệu quả với bạn hay không. Các vấn đề như tôi thấy nó đã được đề cập một vài lần ở trên là chức năng CDate là nghẹt thở trên các giai đoạn. Bạn có thể sử dụng thay thế để thay đổi chúng thành dấu gạch chéo. Để trả lời câu hỏi của bạn về một hàm trong vba có thể phân tích bất kỳ định dạng ngày nào, không có bất kỳ tùy chọn nào của bạn có giới hạn. = "= DATEVALUE (RC [1])" dd FormulaR1C1

cột A sẽ mm/

Dim current as Date, highest as Date, result() as Date 
For Each itemDate in DeliveryDateArray 
    Dim tempDate As String 
    itemDate = IIf(Trim(itemDate) = "", "0", itemDate) 'Added per OP's request. 
    tempDate = Replace(itemDate, ".", "/") 
    current = Format(CDate(tempDate),"dd/mm/yyyy") 
    if current > highest then 
     highest = current 
    end if 
    ' some more operations an put dates into result array 
Next itemDate 
'After activating final sheet... 
Range("A1").Resize(UBound(result), 1).Value = Application.Transpose(result) 
+0

@ JasonWilliams Tôi sẽ thêm nó vào câu trả lời, bạn có chắc là bạn muốn sử dụng "0" nó mặc định là một Giờ (12:00:00 AM)) không phải là Ngày. –

0

Hình như nó có thể được ném các lỗi trên hàng dữ liệu rỗng, có bạn đã cố gắng để chỉ cần đảm bảo itemDate isn không có sản phẩm nào trước khi bạn chạy hàm CDate()? Tôi nghĩ rằng đây có thể là vấn đề của bạn.

+0

Không có trường hợp nào. Kiểm tra chỉnh sửa. –

+1

Ok. Điều đó sẽ hữu ích khi bạn đặt dữ liệu lên đó. –

+0

Và bạn đã kiểm tra định dạng cần thiết cho CDate(), điều này có thể hữu ích nếu bạn không có [chủ đề tương tự] (http://stackoverflow.com/questions/7481309/vba-issues-converting-string-to-date -using-format-or-cdate). Từ vẻ ngoài của nó, bạn có thể phải định dạng lại ngày bạn đang đi qua. –

0

tôi đã sử dụng mã này::

ws.Range ("A A")./yyyy

RC [1] là cột B, chuỗi TEXT, ví dụ: 01/30/12, KHÔNG PHẢI LÀ LOẠI NGÀY

+0

Điều này không thực sự trả lời câu hỏi. Họ đã cố gắng phân tích cú pháp 'dd.mm.yyyy' vốn không được xử lý bởi các hàm VB/VBA/Excel. – Deanna

Các vấn đề liên quan