目前分類:程式設計 (3)

瀏覽方式: 標題列表 簡短摘要
Excel 讀取 CSV 檔案中數值字串被自動轉換的解決方法
Excel 在讀取 CSV(Comma Separated Values) 檔案時,由於 Excel 的自動轉換功能,導致原本是字串的數值欄位被強迫轉換成數字了。
例如字串 "00123" 會被 Excel 自動轉成數值 123

解決方法是在這個欄位的 CSV 檔中加上等號就可以了,也就是是"00123" 寫成="00123"

ps.這個方法是在這裡看到的,也可以參考這裡(有更多的說明)!

Grant 發表在 痞客邦 PIXNET 留言(0) 人氣()

VBA 函數 ROUND 的問題
我最近才發現 Microsoft Office VBA 裡的 Round 函數有問題!

下面是 Office 裡 Microsoft Visual Basic 的說明:

Round 函數
描述
傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果。
語法
Round(expression [,numdecimalplaces])
Round 函數語法有如下幾個單元:
單元 描述
expression 必要引數。要進行四捨五入運算的數值運算式。
numdecimalplaces 選擇性引數。數字值,表示進行四捨五入運算時,小數點右邊應保留的位元數。如果忽略,則 Round 函數傳回整數。

但其實是錯的!
這個函數傳回的結果其實是進位或捨去到最接近的偶數值!


Round(1.4) = 1
Round(1.5) = 2
Round(2.4) = 2
Round(2.5) = 2

如果在 VBA 中想將數值 X 四捨五入進位到整數只能這麼寫

WorksheetFunction.Round(X, 0)



Int(X + 0.5)

這樣算出來的結果才會正確!

Grant 發表在 痞客邦 PIXNET 留言(1) 人氣()

VBA 使用 CDO 寄送郵件
'使用CDO寄送郵件
'不必透過Outlook寄送
'必須設定引用項目「Microsoft CDO for Windows 2000 Library」

Option Explicit

'宣告變數及參數
Dim objCDO As CDO.Message
Public theRng As Range
Const myUserId = "yourID" '請修改成你的帳號
Const myPassword = "yourPSW" '請修改成你的帳號密碼
Const mySMTPServer = "smtp.gmail.com" '請修改成你的寄送郵件伺服器
Const mySMTPport = 465 '須修改成你的送件伺服器使用的PORT, Gmail使用的是465

'流程控制
Sub Main()
  Application.StatusBar = "Sending..." '狀態訊息顯示
  Set objCDO = New CDO.Message '創建新的物件
  ServerSetting '伺服器設置
  Set theRng = ActiveSheet.UsedRange '取的作用工作表使用範圍
  fillNsend '填充郵件各欄位資訊並寄送
  Set objCDO = Nothing '釋放物件
  Application.StatusBar = False '恢復狀態訊息
End Sub

'設置郵件伺服器參數
'這是用Gmail測試成功的參數, 請參閱 Email Server 的設置說明
Sub ServerSetting()
  With objCDO
    With .Configuration.Fields
      .Item(cdoSendUsingMethod) = cdoSendUsingPort
      .Item(cdoSendUserName) = myUserId
      .Item(cdoSendPassword) = myPassword
      .Item(cdoSMTPServer) = mySMTPServer
      .Item(cdoSMTPAuthenticate) = True
      .Item(cdoSMTPServerPort) = mySMTPport
      .Item(cdoSMTPUseSSL) = True
      .Update
    End With
  End With
End Sub

'填充欄位資訊後寄送
Sub fillNsend()
  With objCDO
    .From = """crdotlin""<" & myUserId & "@" & VBA.Mid(mySMTPServer, 6) & ">"
    .To = ActiveSheet.Range("a2").Text
    .Subject = "Test Test"
    .HTMLBody = RangetoHTML(theRng)
    '設定重要性
    '.Fields("urn:schemas:mailheader:importance") = 2
    '.Fields("urn:schemas:httpmail:importance") = 2
    .Fields(cdoImportance) = cdoHigh
    .Fields.Update
    .Send
  End With
End Sub

'測試
Sub TestSendSheet()
  Dim Sht As Worksheet
  '處理所有工作表
  For Each Sht In ThisWorkbook.Worksheets
    Sht.Activate '啟動為作用工作表
    '如果A2儲存格式郵件位址, 則將此工作表寄送到該信箱
    If ActiveSheet.Range("a2").Value Like "*@*" Then Main
  Next
End Sub

參考資料:
‧Microsoft Excel MVP 專家 Ron de Bruin
Working with Excel Workbooks and Worksheets in E-Mail 有很多範例
‧關於在Excel中使用CDO寄送郵件的專門網頁 Sending mail from Excel with CDO

Grant 發表在 痞客邦 PIXNET 留言(0) 人氣()

找更多相關文章與討論