2012-06-07 112 views
4

我們正在使用各種工具生成長的Excel工作表,這些工具必須在工作流程中進一步查看和使用。 某些單元對於包含的文本太小的問題。 因此,正在閱讀工作表的人和程序將看不到相同的數據。如何使用VBA檢測不適合Excel單元格的值?

當Excel無法正確調整行高時,這通常適用於包含自動換行文本的合併單元格。但是還有其他一些情況:例如,某些列的寬度已經明確設置,這對長值不夠。

|Group|Def1 |Subgroup|Definition| Id |Data |Comment | 
|-------------------------------------------------------| 
| G1 |  | G1-1 |Important |G1-1-1|... |   | 
|  |Long |  |about G1-1|G1-1-2|.....|........ | 
|  |text |-------------------------------------------| 
|  |about| G1-2 |Another |G1-2-1|... |   | 
|  |group|  |important |G1-2-2|... |long comme| 
|  |G1. |  |text about|G1-2-3|  |   | 
|-------------------------------------------------------| 

這裏,「定義」和「註釋」中的某些單元格不完全可見。 有沒有任何方法來編程找到這樣的單元格?

+0

我依稀記得@SiddharthRout(可能是其他人)最近發佈了一個類似問題的答案。希望那個人會在這裏發佈他們的解決方案。 – JimmyPena

回答

1

取消合併工作簿中的所有單元格,並使用 Thisworkbook.sheets(「名稱」)。行(指數).entirerow.autofit 與同爲列。 除了審美原因外,還有什麼用於保留合併的單元格? 只考慮「基本單元」的值(左上角)。

+0

謝謝。由此產生的表格被人類使用,因此美學原因不容忽視。儘可能避免合併是一個很好的建議。 – jmster

2

這裏是我以前用過的一招:

With Columns("B:B") 
    oldWidth = .ColumnWidth ' Save original width 

    .EntireColumn.AutoFit 
    fitWidth = .ColumnWidth ' Get width required to fit entire text 

    .ColumnWidth = oldWidth ' Restore original width 

    If oldWidth < fitWidth Then 
     ' Text is too wide for column. 
     ' Do stuff. 
    End If 
End With 

當然,這將適用於整列在同一時間。您仍然可以通過將單元格依次複製到虛擬列並在那裏執行測試來使用它。

但是對你來說可能更有用的是我對這個問題的早期回答:Split text across multiple rows according to column width。它描述了一種確定任何給定單元格中文本寬度的方法(並將其與單元格的實際寬度進行比較以確定文本是否適合)。

編輯響應您的評論:如果你的一些細胞是足夠高,能夠顯示2行以上的文字,那麼你可以使用類似的方法在我previous answer描述,首先使用.EntireRow.AutoFit確定的高度字體和.RowHeight來確定單元格中有多少條線條,然後使用上一個問題的方法確定文本是否適合該寬度的單元格中的線條數量。

+0

謝謝。即使每個值有足夠的垂直空間,AutoFit都會打開長字符串並擴展列寬。 在我的示例中,您的方法幾乎在每個單元格中都會出現假陽性。 – jmster

+0

什麼示例?謹慎與我們分享? –

+0

真實生活中的例子非常龐大,包含了客戶的數據,但我爲這個問題添加了一個簡單的例子。 – jmster

4

要檢測這些單元格(我不是在討論解決問題),可以使用Range對象的Text方法。

例如,Range("A1").Value可能是123456789,但如果它的格式設置爲Number且列不夠寬,則Range("A1").Text將爲「###」(或者在單元格中適合多個#符號)。

+0

我認爲文本只是在單元格包含字符串時返回值。它沒有檢測到任何東西。 但是,日期和數字的工作方式與您所描述的一樣,並且這可能很有用,謝謝。 – jmster

1

今天我遇到了同樣的問題。我試圖用這個方法來躲避它。也許,它可能對你有用。其編碼處理一米寬度合併方面:

'Sheet2 is just merely support tool no data sheet in ThisWorkbook 
With Sheet2.Range(target.Address) 
    target.Copy 
    .PasteSpecial xlPasteAll 
    .UnMerge 
    If .MergeArea.Count > 1 Then .UnMerge 
    .ColumnWidth = target.ColumnWidth 
    .Value = target.Value 
    .EntireRow.AutoFit 
    target.MergeArea.EntireRow.RowHeight = _ 
     1.05 * .RowHeight/target.MergeArea.Rows.Count 
    .ClearContents 
    .ClearFormats 
End With 

不幸的是,如果有幾列與合併單元格這樣的,也許他們的共同需要高度將彼此之間以及額外的代碼衝突將需要恢復和諧。看起來像一段有趣的代碼。 祝你覺得這有幫助。

相關問題