電子書籍の厳選無料作品が豊富!

Excelで見積書兼製造指示書を作成しています。
今までは別のフォーマットでしたが、内容がほぼ同様のものなので、
ドロップダウンで主題(「見積書」と「製造指示書」)を変更できるようにしています。
(見積書作成時には条件付き書式で、入力必須項目のセルに目印として背景色がつくように
設定しています)

ただし、この見積書フォーマットは別のプログラムへの入力指示のためのもので、
見積書には品名などに入力文字数制限があります。
そのため、見積書は英数カナ文字は半角で作成します。
(別プログラム入力時に、入力文字数制限を気にすることなくコピペ出来るようにしたいです)

製造指示書は、このフォーマットで完結のため入力文字数制限はなく、
英数カナ文字は全角となります。

ドロップダウンで主題を変更すると、特定の場所の英数カナ文字が、全角または半角へ変換
できるような仕組みはありますでしょうか。
(はじめが全角、半角どちらでも構いません)
ご教示宜しくお願いいたします。

フォーマットを分けて、一方の特定の場所を全角で打っても、別シートのもう一方は
関数などで半角に変換される、というようなこともできそうですが、その方法は避けます。
入力者が私ではなく、別の人間であること、そのため複数フォーマットがあれば入力時に
多少の混乱が生じること、そもそもこれらのフォーマットを統一しようという取り組みを
行っている最中のため、またふたつに分けるのは方針に反していること、などの理由があります。

A 回答 (3件)

#1の回答者です。


◯フォーマットを統一しよう

というのは、
一般的には、ふつうはWordの領域の質問ですが、「全角英数文字を半角に、半角カナを全角にする」というところに落ち着くと先読みしてつくってあります。
そうすると、Excel ではとてもややこしい問題になると同時に、半角カタカナを全角にする時に、失敗が起こるのです。半角カタカナは、文字変換関数は、必ず、まとめてあげない正しく変換されないのです。

半角->全角
 sCharPattern = StrConv("[!-/A-Zヲァ-ン゛゜\d]+", vbNarrow)

 sCharPattern = StrConv("[ヲァ-ン゛゜]+", vbNarrow)
とすれば、カタカナだけの対象になります。

逆に
全角->半角 でカタカナを抜くのでしたら、
 dCharPattern = "[A-Za-z0-9]+"
とすればよいです。

ちなみに、Wordの方法
http://office-qa.com/Word/wd146.htm
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
さらにご回答いただき、本当に感謝です。
ありがとうございました。

お礼日時:2017/10/19 06:32

とりあえず、こんなところから勉強を始めたら良いと思います。



Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Dim p As Variant
If Target.Address <> "$B$1" Then Exit Sub
If Target.Value = "見積書" Then
p = vbWide
Else
p = vbNarrow
End If
For Each r In Range("A1,A4")
r.Value = StrConv(r.Value, p)
Next r
End Sub
「Excel 英数カナ文字 全角半角一発変」の回答画像2
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
なんとか試行錯誤を繰り返し、解決できました!
ありがとうございました。

お礼日時:2017/10/19 06:32

数ヶ月前、同じような質問がありましたが、それ以上に難しい点があります。



Excelでは、[英数カナ文字] 全角ー半角 全部統一というのは少し無理があります。

通常は、数字は半角、英字は半角、カタカナは全角などという一般的な基準がありますが、それを無視してということになってしまいます。

>ドロップダウンで主題を変更すると、特定の場所の英数カナ文字が、全角または半角へ変換できるような仕組み

フォームコントロールのドロップダウンをシートに貼り付けて、コントロールの入力範囲を適当に決めて、

半角
全角
にしてください。必ず半角を上にしてください。

>フォーマットを統一しよう
ということで、後でも変えられるように、正規表現で書かれています。
たぶん、何かの支障が発生した時に、私はサポートできないと思いますので、注意点を書いておきます。

 sCharPattern = StrConv("[!-/A-Zヲァ-ン゛゜\d]+", vbNarrow)
 dCharPattern = "[A-Za-zァ-ン0-9]+"

sは、single 半角、dは、double 全角のイニシャルです。
[ ] 内に書き加えれば、かなり込み入った内容でも、半角・全角は変えられます。
Wordのコード表なども役に経ちます。ただ、今ははっきりしませんが、この並びが、UNICODE並びのことがありますので、その点を考慮しておいたほうがよいでしょう。


'//
Sub ドロップ1_Change()
 Dim dps As Object
 Dim i As Long
 Dim lst As Variant
 Set dps = ActiveSheet.DropDowns(1)
 i = dps.Value
 '半角-1, 全角-2
 With Range(dps.ListFillRange)
  .Offset(, 1).ClearContents
  .Cells(i, 2).Value = "◎"
 End With
 Call WorksheetChange_Db_Sn(i)
End Sub
Sub WorksheetChange_Db_Sn(ByVal iflg As Long)
 Dim Rng As Range
 Dim flg As Boolean
 Dim sCharPattern As String
 Dim dCharPattern As String
 Dim RegEx As Object
 Dim Ms, m
 Dim buf As String
 Dim myPattern As String
 Set RegEx = CreateObject("VBScript.RegExp")
 sCharPattern = StrConv("[!-/A-Zヲァ-ン゛゜\d]+", vbNarrow) '半角
 dCharPattern = "[A-Za-zァ-ン0-9]+" '全角
 myPattern = IIf(iflg - 1, sCharPattern, dCharPattern)
 With RegEx
  .Global = True: .IgnoreCase = True: .MultiLine = True
  .Pattern = "(" & myPattern & ")"
 End With
 With ActiveSheet
  On Error Resume Next
  Set Rng = .UsedRange.SpecialCells(xlCellTypeConstants, 23)
  If Err.Number() <> 0 Then
   flg = True
  ElseIf Application.CountA(Rng) < 5 Then '4文字以下は検索しない
   flg = True
  Else
  End If
  If flg Then
   MsgBox "現在のシートには対象になる文字列は見つかりません", vbExclamation
   Exit Sub
  End If
  On Error GoTo 0
  For Each c In Rng
   buf = ""
   buf = c.Value
   On Error Resume Next
   Set Ms = Nothing
   Set Ms = RegEx.Execute(buf)
   On Error GoTo 0
   If Not Ms Is Nothing Then
    If Ms.Count > 0 Then
     For Each n In Ms
      If iflg - 1 = 0 Then
       n_a = StrConv(n, vbNarrow)
      Else
       n_a = StrConv(n, vbWide)
      End If
      buf = Replace(buf, n, n_a, , 1)
     Next
    End If
    If IsNumeric(StrConv(buf, vbNarrow)) Then
     If iflg = 2 Then
      c.Value = "'" & buf '数字が半角に戻るのを防ぐ
     ElseIf iflg = 1 Then
      c.Value = CDbl(buf)
     End If
    Else
     c.Value = buf
    End If
   End If
  Next
  
 End With
End Sub
「Excel 英数カナ文字 全角半角一発変」の回答画像1
    • good
    • 0
この回答へのお礼

お礼が遅くなり大変申し訳ございません。
なんとか試行錯誤を繰り返し、解決することができました!
ありがとうございました。

お礼日時:2017/10/19 06:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報