none
字串相加跑出刪不掉的空白 RRS feed

  • 問題

  • 各位好

    請問各位大大

        Public ExcelBaseName As String = String.Empty       'Excel 檔名

        Public ExcelBasePath As String = String.Empty       'Excel 路徑

          ExcelBasePath  = "AAA"

           ExcelBaseName = "BBB"

          Dim Str As String = ExcelBasePath & ExcelBaseName

          得到的值為  "AAA                     BBB"  << 很奇怪 = .. =

    所以我只好用底下的方式解決

    >>       Str = ExcelBasePath.Trim & ExcelBaseName.Trim

    >>      Str = Str.Replace(vbNewLine, "")

    >>       Str = Str.Replace(" ", "")

    結果 這幾個方式都無法解決此問題 !!  @@

    請問各位先進 我該怎麼辦

    我可以使用中斷的方式 加到間看式

    刪除但無法透過程式的方式刪除空白

     

     

    2011年3月14日 下午 07:34

解答

  • 通常會出現這種不可控制的狀況時,應該是裡面不小心加了不可見字元,例如 vbTab / vbNewLine / vbLf / vbCr / BackSpace / ... 等。

    不確定的話,用 Encoding.GetBytes 輸出來,看看 Ascii 是多少。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Max197 2011年3月18日 下午 05:05
    2011年3月15日 下午 03:36

所有回覆

  •         Str = Str.Replace(vbTab, "")
    

    Path.Combine 方法 (String, String)

    http://msdn.microsoft.com/zh-tw/library/fyy7a5kt.aspx

    照您的程式,沒發生您寫的情形,可能是讀入路徑和檔名時,有不可見字元的空白...

    2011年3月14日 下午 11:33
  • I guess your Path and Name are collecting from other method, you can try to use LTrim and RTrim to make sure that there are no space in front or in end.

    ExcelBasePath = LTrim(RTrim(TestString1))
    ExcelBaseName = LTrim(RTrim(TestString2))
    Dim Str As String = ExcelBasePath & ExcelBaseName
    
    

    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    2011年3月15日 上午 04:10
  • 對耶 我是用工具箱裡面有一個OFD 的元件 來選擇一個檔案與路徑 等等來試試看 感謝兩位大大 :D

     

    不過這個空白很奇怪  沒辦法用

     

    ExcelBasePath = LTrim(RTrim(TestString1))
    ExcelBaseName = LTrim(RTrim(TestString2)) 

    Dim Str As String = ExcelBasePath & ExcelBaseName 

     

     

    >>       Str = ExcelBasePath.Trim & ExcelBaseName.Trim

    >>      Str = Str.Replace(vbNewLine, "")

     

    >>       Str = Str.Replace(" ", "")

    這幾種方式處理掉, 他不是已經為 String 了嗎?  

     

    這個很小弟很不解.

     

    2011年3月15日 下午 02:39
  • 通常會出現這種不可控制的狀況時,應該是裡面不小心加了不可見字元,例如 vbTab / vbNewLine / vbLf / vbCr / BackSpace / ... 等。

    不確定的話,用 Encoding.GetBytes 輸出來,看看 Ascii 是多少。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 Max197 2011年3月18日 下午 05:05
    2011年3月15日 下午 03:36
  • 通常會出現這種不可控制的狀況時,應該是裡面不小心加了不可見字元,例如 vbTab / vbNewLine / vbLf / vbCr / BackSpace / ... 等。

    不確定的話,用 Encoding.GetBytes 輸出來,看看 Ascii 是多少。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問心冷熱情熄法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

       各位大哥們您好:

     

           後來, 透過種種方式 Path.Combine Str.Replace(Tab 空白 等等)  都無效

           最後參考了 心冷大哥的建議用 getbytes 去看 發現是 0   所以,我就轉成 陣列把尾巴多出來 24個

           byte = 0 的 都刪掉後 就可以了 = =a  好奇怪阿 

     

          不過問題總算解決了  感謝各位大哥們 :D

     

     

     

    2011年3月18日 下午 05:05
  • 不過冒昧請教一下 底下是我的寫法,能否建議我怎麼寫才是正確又簡潔的寫法呢 感謝

      Dim Str As String = String.Empty
       '/////////////////////////////////這一段很奇怪總是會出現空白的字串////////////////////////////////////// 
       ExcelBasePath = ExcelBasePath.Trim : ExcelBaseName = ExcelBaseName.Trim
       Dim StrByte() As Byte = Encoding.Default.GetBytes(StrReverse(ExcelBasePath)), TranByte() As Byte = {}
       Dim nIDX As Integer = 0
       '把空白的數量抓出來
       For I As Integer = 0 To StrByte.Length - 1
        If StrByte(I) = 0 Then
         nIDX = I + 1
        Else
         Exit For
        End If
       Next I
       If nIDX <> 0 Then
        
        ReDim TranByte(StrByte.Length - nIDX - 1)
        Dim Nd As Integer = 0
        For I As Integer = nIDX To StrByte.Length - 1
         TranByte(Nd) = StrByte(I) : Nd += 1
        Next I
    
        '去除空白後 轉置 回原本的字串
        ExcelBasePath = StrReverse(System.Text.Encoding.Default.GetString(TranByte))
       End If
       '/////////////////////////////////這一段很奇怪總是會出現空白的字串////////////////////////////////////// 
    
    2011年3月18日 下午 07:33
  •       ExcelBasePath  = "AAA"

           ExcelBaseName = "BBB"
    ^^^^^^^^^^^^^^^^^^^^^^ 你的程式不是真的這樣取得這兩個字串的吧 ?

    後來你又寫了這一串

    ExcelBasePath = LTrim(RTrim(TestString1))
    ExcelBaseName = LTrim(RTrim(TestString2))

     

    真正的問題在, 你根本沒有告訴我們, TestString1 和 TestString2 是從哪生出來的 ? 所以你一直覺得很奇怪, 我也一直覺得很奇怪


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月20日 上午 09:40
    版主
  •  

       Bill 大大

    那個我的作法是這樣的請您查閱

    1.

     

     Private Sub butSelectFilePath_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butSelectFilePath.Click
     With FBD
      If .ShowDialog <> Windows.Forms.DialogResult.Cancel Then
      txtSaveFilePath.Text = .SelectedPath.Trim
      ExcelSavePath = .SelectedPath.Trim
      Else
      txtSaveFilePath.Text = "請選擇資料存放之路徑!!"
      End If
     End With
     End Sub
    

     

     

     

     Private Sub butSelectSourceExcel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butSelectSourceExcel.Click
     With OFD
      'Setting 
      .CheckFileExists = True
      .CheckPathExists = True
    
      'Initile
      .FileName = ""
      .Filter = "Office 2003 XLS|*.xls"
    
      'Start Show
      If .ShowDialog <> Windows.Forms.DialogResult.Cancel Then
      'Save Information
      txtExcelSource.Text = .FileName.Trim
      ExcelBaseName = .SafeFileName.Trim
      ExcelBasePath = .FileName.Substring(0, .FileName.Trim.Length - .SafeFileName.Trim.Length)
      Else
      txtExcelSource.Text = "請選則 Excel 底稿檔案!!"
      End If
    
     End With
     End Sub
    

     

    阿 不知道怎麼了 ExcelBasePath 後面總是會多了一長串 byte = 0 的東西

    用 Trim 這些都去不掉 所以後來 大哥請我看 byte 後我才又加上

     

    3. 去掉 byte = 0 的

    Dim Str As String = String.Empty

     '/////////////////////////////////這一段很奇怪總是會出現空白的字串////////////////////////////////////// 
     ExcelBasePath = ExcelBasePath.Trim : ExcelBaseName = ExcelBaseName.Trim
     Dim StrByte() As Byte = Encoding.Default.GetBytes(StrReverse(ExcelBasePath)), TranByte() As Byte = {}
     Dim nIDX As Integer = 0
     '把空白的數量抓出來
     For I As Integer = 0 To StrByte.Length - 1
     If StrByte(I) = 0 Then
     nIDX = I + 1
     Else
     Exit For
     End If
     Next I
     If nIDX <> 0 Then
     
     ReDim TranByte(StrByte.Length - nIDX - 1)
     Dim Nd As Integer = 0
     For I As Integer = nIDX To StrByte.Length - 1
     TranByte(Nd) = StrByte(I) : Nd += 1
     Next I
    
     '去除空白後 轉置 回原本的字串
     ExcelBasePath = StrReverse(System.Text.Encoding.Default.GetString(TranByte))
     End If
     '/////////////////////////////////這一段很奇怪總是會出現空白的字串////////////////////////////////////// 
    
    <br/>
    
    因為不去掉的話阿 每次
    
     If System.IO.Directory.Exists(ExcelBasePath) = False Then
    ShowMsg("路徑不存在請確認!! " & ExcelBasePath)
    Exit Sub End If<br/>
    都會是 Flase 就算 路徑真的存在。。。。。。。。。。。。。
    
    <br/>
    
    請您參閱
    

     

    最後就是 我剛開始學寫程式,我該怎麼把上面那一段 去掉 byte 0的程式碼 在精簡呢!

    這點要麻煩 大哥指點一下 謝謝。 :)

    2011年3月20日 下午 04:12
  • 我看了一下, 重點應該是出在那個BFD 或 OFD.

    先來做一個問題分割.

    (1) 你先用Execl去存一個新的檔案,(一定要用Excel, 不要用你的程式), 存成 abc.xls好了

    (2) 然後用你的程式, 按下[butSelectSourceExcel] 這個button來開啟 abc.xls

    (3) 如果這樣還是會出現空白, 那問題大概是出在OFD

    (4) 需要你提供的資料來了, BFD 和 OFD 是怎麼產生的 ? 他們由哪些類別而來 ? 如果可能的話, 有這兩個類別的內容嗎 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2011年3月21日 上午 03:42
    版主
  • Bill 大大

         您跟報告一下

         OpenFileDialog1          <<<<  這是我的 OFD

         FolderBrowserDialog1 >>>>  這是我的 FBD

     

         後來查出問題了. 問題在於  我有參考了一個元件 AxInterop.INIControl 7.0.0.0

         1.  使用者設定路徑後放入 ExcelBasePath 內 並透過 AxInterop.INIControl 7.0.0.0存檔至INI內 

     

         2. 程式啟動後透過 AxInterop.INIControl 7.0.0.0 讀回上一次使用者的紀錄並放入 ExcelBasePath 內

         3. 然後程式內部存取 ExcelBasePath 就發生這個問題了.... = =a

         所以 如果我改成 Regedit 登錄檔的方式的話, 就沒有這個問題了

         呼。真的不好意思呢!! 讓各位費心了

         PS:

               1. 我也有加入您撰寫的時間排程器 讓他每分鐘存取一次,實在是很方便 比起以前時間常常會跑掉很難處理。 感謝您 :D

               2. 這隻程式阿 我本來是用微軟網站抓的 VS2010 來撰寫, 主要動作是 抓資料庫的資料轉到Excel內,寫完了之後發現常常

                   存取Excel會出現什麼 「嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀」 所以我特別參考了其他前輩的文章

                   讀寫時一定把系統內所有的 Excel.exe關閉後才開啟連線

                   strConn = "provider=Microsoft.Jet.OLEDB.4.0;data source='" & ExcelBaseFullPath & "';Extended Properties='Excel 8.0;IMEX=2;HDR=NO;'"                      

                  結果還是一樣,後來 我就改一下專案檔後用 VB2008去開啟,執行後到現在都沒有出現一樣的問題。 = =a 

                  重點是用 Try 還攔不掉。 沒辦法作錯誤處理.

                  因為之前都是用 VB2008 開發都沒有這個問題轉成用VB2010才有這個問題 實在是很奇怪呢。

                  這個是我用VB2010所遇到的問題 順便報告一下,問題有順利解決了。  :D

              3. 最後是 我有把 VB2010 用 Debug 模式 開著一個晚上作資料紀錄的測試,結果 VB2010出現錯誤問要不要偵錯 但我的程式還在,

                  按下確定後 VB2010 就關閉了 後來去查閱紀錄的資料, 資料都還在說,就是我的程式沒有掛掉 但 VB2010掛掉了 卻也沒有影響到我的程式?

                  這個也是昨天測試的時候發生的一點小問題。

    2011年3月21日 上午 08:42
  • 我現在處理Excel, 如果沒啥特別的狀況都是用 NPOI, 你可以參考小朱的 [在 Server 端存取 Excel 檔案的利器:NPOI Library]

    至於你所提到VS2010的問題, 我可能需要找點時間測測看. 目前我沒法確定告訴你是怎麼發生的.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年3月21日 下午 02:35
    版主
  • 因為 C 這邊是用 Chr(0) 代表字串結束,所以 API 常常會傳回值會包含 Chr(0) ,設計給 VB 用的控制項應該要幫使用者處理掉 Chr(0) ,否則就應該是 bug 。

    API 那邊通常可透過

    新字串 = Left(原始字串, Instr(原始字串, Chr(0)) - 1)

    來處理,

    懶一點

    新字串 = Replace(原始字串, Chr(0), "")


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年3月21日 下午 02:43
  • 這個訊息:

    嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀

    建議你不要用那個 INIControl ,應該是那個 INIControl 的問題。

    如果你在不同的電腦跑你的專案,應該是 CPU DEP 的保護造成這個錯誤訊息。

    微軟的 Office 2007/2010 應該都避掉 DEP 了,.Net 基本上也都避掉 DEP 了,容易發生這個問題的,多半是 COM / 函數型 DLL 。

     

    這邊也有個存取 INI 的原始碼,因為不使用 Windows API ,不受 API 64 kb 限制,且是 VB.Net 原始碼,用在 VB.Net 應該是比弄個 COM 控制項穩多了。

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=17


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年3月21日 下午 02:48