Board logo

標題: [發問] 指定儲存格文字轉大寫 [打印本頁]

作者: PJChen    時間: 2012-4-6 00:12     標題: 指定儲存格文字轉大寫

工作上常需要用到將英文字全部轉大寫或第一個字轉成大寫,我知道函數中可以做到,但不知使用巨集是否也能寫出這樣的效果?
我的需求如下,請高人指點!
a) 程式與需要轉大寫的文件是分開的
b) 分成二個按鈕全部轉大寫/第一個字轉成大寫(功能分開)
c) 在任一開啟的Excel文件的任何以滑鼠點選指定儲存格(單一或圈選的範圍例:a5/b10/c8:c12)
d)按下"轉換鈕"後,在指定儲存格將字體轉成大寫/第一個字大寫,當然未選定的儲存格不能轉換
e)因為開啟的可能是任何的文件,不知在寫程式的時候寫得出來嗎?
f)或者如果寫程式一定要指定檔名(我不清楚是否如此),就在檔案中指定一個檔名的位置(F1),不知是否可行?
[attach]10315[/attach]
作者: GBKEE    時間: 2012-4-6 08:51

回復 1# PJChen
兩按鍵 的共同程式碼
  1. Option Explicit
  2. Sub Ex()
  3.     Dim E As Range, Rng As Range
  4.     If TypeName(Selection) <> "Range" Then Exit Sub '不是Range(儲存格)不往下執行程式
  5.     If Selection.Count = 1 And Selection(1) = "" Then Exit Sub  '選擇1儲存格且為空白時不往下執行程式
  6.     For Each E In Selection.SpecialCells(xlCellTypeConstants)
  7.         If InStr(Shapes(Application.Caller).OLEFormat.Object.Caption, "全部大寫") Then
  8.             E.Value = UCase(E)                          '全部轉換為大寫
  9.         Else
  10.             E.Value = UCase(Mid(E, 1, 1)) & LCase(Mid(E, 2))  '轉換第1個字元為大寫
  11.             '**: Mid(E, 1, 1)-> 從第1個字元起讀入一個字元的字串
  12.             '**" Mid(E, 2) -> 從第2個字元起讀入全部的字串
  13.         End If
  14.     Next
  15. End Sub
複製代碼

作者: PJChen    時間: 2012-4-6 11:38

回復 2# GBKEE
請問:
我將這個程式執行時,無論在原巨集檔案中或另一個測試"Test"檔中,都不能執行,請幫我看看問題出在哪?
另外這個程式
1) 二個按鈕功能分開(全部轉大寫/第一個字轉成大寫)是否能分開執行?(因為執行結果目前看不出來)
2) 可針對任何開啟的Excel文件執行 全部轉大寫/第一個字轉成大寫 功能嗎?
[attach]10318[/attach]
作者: hugh0620    時間: 2012-4-6 13:44

引用G大大的寫法~ 自己改一改就好了~
  1. Sub uppera() '全部大寫
  2.     Dim E As Range, Rng As Range
  3.     If TypeName(Selection) <> "Range" Then Exit Sub '不是Range(儲存格)不往下執行程式
  4.     If Selection.Count = 1 And Selection(1) = "" Then Exit Sub  '選擇1儲存格且為空白時不往下執行程式
  5.     For Each E In Selection.SpecialCells(xlCellTypeConstants)

  6.             E.Value = UCase(E)                          '全部轉換為大寫

  7.             '**: Mid(E, 1, 1)-> 從第1個字元起讀入一個字元的字串
  8.             '**" Mid(E, 2) -> 從第2個字元起讀入全部的字串

  9.     Next
  10. End Sub
  11. Sub upperaf()  '第一個字大寫


  12.     Dim E As Range, Rng As Range
  13.     If TypeName(Selection) <> "Range" Then Exit Sub '不是Range(儲存格)不往下執行程式
  14.     If Selection.Count = 1 And Selection(1) = "" Then Exit Sub  '選擇1儲存格且為空白時不往下執行程式
  15.     For Each E In Selection.SpecialCells(xlCellTypeConstants)

  16.             E.Value = UCase(Mid(E, 1, 1)) & LCase(Mid(E, 2))  '轉換第1個字元為大寫
  17.             '**: Mid(E, 1, 1)-> 從第1個字元起讀入一個字元的字串
  18.             '**" Mid(E, 2) -> 從第2個字元起讀入全部的字串

  19.     Next
  20. End Sub
複製代碼
回復 3# PJChen
作者: hugh0620    時間: 2012-4-6 14:14

回復 3# PJChen

再引用G大大的寫法~ 自己改一下~
程式設計前要先分析一下想要的結果是什麼~ 再怎麼來寫~
依您需要的東西~
按下任一個按鈕時~ 不管是開新檔或是執行該檔內的內容~ 就進行字的大寫調整
因此用一個IF 來判斷~ 是要執行該檔案還是執行新開的檔案
所以加了一個打開EXCEL的指令,判斷是不是要開檔案,
來完成最後的結果~
  1. Sub uppera() '全部大寫
  2. patch = Application.GetOpenFilename("Microsoft Excel 活頁簿 (*.xls), *.xls")
  3. If patch = False Then
  4.     Dim E As Range, Rng As Range
  5.     If TypeName(Selection) <> "Range" Then Exit Sub '不是Range(儲存格)不往下執行程式
  6.     If Selection.Count = 1 And Selection(1) = "" Then Exit Sub  '選擇1儲存格且為空白時不往下執行程式
  7.     For Each E In Selection.SpecialCells(xlCellTypeConstants)
  8.             E.Value = UCase(E)                          '全部轉換為大寫
  9.             '**: Mid(E, 1, 1)-> 從第1個字元起讀入一個字元的字串
  10.             '**" Mid(E, 2) -> 從第2個字元起讀入全部的字串
  11.     Next
  12. Else
  13.     With Workbooks.Open(patch)
  14.         For Each E In .Sheets("工作表1").Range("A:C")
  15.           E.Value = UCase(E)
  16.         Next
  17.     End With
  18. End If

  19. End Sub
  20. Sub upperaf()  '第一個字大寫
  21. patch = Application.GetOpenFilename("Microsoft Excel 活頁簿 (*.xls), *.xls")
  22. If patch = False Then
  23.     Dim E As Range, Rng As Range
  24.     If TypeName(Selection) <> "Range" Then Exit Sub '不是Range(儲存格)不往下執行程式
  25.     If Selection.Count = 1 And Selection(1) = "" Then Exit Sub  '選擇1儲存格且為空白時不往下執行程式
  26.     For Each E In Selection.SpecialCells(xlCellTypeConstants)
  27.             E.Value = UCase(Mid(E, 1, 1)) & LCase(Mid(E, 2))  '轉換第1個字元為大寫                          '全部轉換為大寫
  28.             '**: Mid(E, 1, 1)-> 從第1個字元起讀入一個字元的字串
  29.             '**" Mid(E, 2) -> 從第2個字元起讀入全部的字串
  30.     Next
  31. Else
  32.     With Workbooks.Open(patch)
  33.         For Each E In .Sheets("工作表1").Range("A:C")
  34.           E.Value = UCase(Mid(E, 1, 1)) & LCase(Mid(E, 2))  '轉換第1個字元為大寫
  35.         Next
  36.     End With
  37. End If

  38. End Sub
複製代碼

作者: PJChen    時間: 2012-4-7 01:26

回復 5# hugh0620
您好,
您修改的第一篇可以轉換文字,但僅限於同一sheet中的文字.
第二篇我修了(*.xlsx),因為我想要二種檔案類型都可以用,但無論我改成 (*.xlsx), *.xls" 或  (*.xls), *.xlsx",當我按轉換鈕時並不會二種類型都出現,而且每次按轉換鈕excel就會當掉,
如果我一直不去理它,其實excel也不用重開,但它並不會轉換.
patch = Application.GetOpenFilename("Microsoft Excel 活頁簿 (*.xlsx), *.xls")

另外請教一個存檔問題,以下存為.xlsx時一切都沒有問題,但若存成.xls時,存檔時沒問題,但要打開存檔後的文件就會出現錯誤訊息,可否幫我看一下問題所在?
ActiveWorkbook.SaveAs "D:\" & [Q5] & " vs " & [C6] & "_PO#" & [V7] & "_" & [C16] & " booking to " & [C19] & ".xlsx"
[attach]10327[/attach]
作者: Hsieh    時間: 2012-4-7 09:56

回復 6# PJChen

你的問題我個人認為是因為你的巨集存放位置,與資料檔案是分開的檔案
由於2007版本以後,含有巨集的活頁簿,與一般活頁簿檔案格式不同,
所以,你在操作時被視為2個Application在執行(這是個人猜測,不一定正確)
要解決這種衝突,唯有將巨集存成增益集,然後加載增益集後,所有的活頁簿就可以共同使用該程式碼
將檔案解縮到系統預設增益集存放區
然後依照動畫加載使用試試

[attach]10331[/attach]

   [attach]10332[/attach]
作者: PJChen    時間: 2012-4-7 12:16

回復 7# Hsieh

版大,
您的建議很不錯,但由於我從來沒有用過增益集的功能,完全不了解,您的操作有點快,我看不清楚,可能要自己研究一下.
我另一個存檔的問題不知是否有人可以解答?
作者: Hsieh    時間: 2012-4-7 12:46

回復 8# PJChen

概念相同,只是你要固定存檔位置,那麼增益集
   就沒有太大意義
作者: PJChen    時間: 2012-4-7 14:20

回復 9# Hsieh
版大,
我問的另一個存檔問題,跟大小寫轉換是完全不相同的, 是我其它的巨集程式我摘錄下來的,
它存為.xlsx時一切都沒有問題,但若存成.xls時,存檔時沒問題,但要打開存檔後的文件就會出現錯誤訊息,因為我不知道問題所在?
出現的錯誤訊息就是前面所上傳的jpg圖片的訊息,想請教是否有人能為我解答.
ActiveWorkbook.SaveAs "D:\" & [Q5] & " vs " & [C6] & "_PO#" & [V7] & "_" & [C16] & " booking to " & [C19] & ".xlsx"




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)