• ベストアンサー

excel2003の入力を省力化したい

写真のように A,C,E列に記号 B,D,F列に文字が入っています。 そこで、A~F列に何かしら入力した場合、 G列、H列には、それぞれ A-C-E、B-D-Fを ハイフンで連結した文字を、自動で表示させたいです。 ただし、A~F列の値を消した場合、G列とH列の値もクリア させたいです。 どうか、VBAの記述を教えていただけないでしょうか? できれば、早くて、負荷の少ない記述が助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! すでに回答は出ていますが、参考程度で・・・ Sheetモジュールです。 A~F列に空白セルが一つでもあればG・H列は表示しないようにしています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long If Intersect(Target, Range("A:F")) Is Nothing Then Exit Sub i = Target.Row If i > 1 Then If WorksheetFunction.CountBlank(Cells(i, "A").Resize(, 6)) = 0 Then With Cells(i, "G") .NumberFormatLocal = "@" .Value = Cells(i, "A") & "-" & Cells(i, "C") & "-" & Cells(i, "E") .Offset(, 1) = Cells(i, "B") & "-" & Cells(i, "D") & "-" & Cells(i, "F") End With Else Cells(i, "G").Resize(, 2).ClearContents End If End If End Sub こんな感じではどうでしょうか?m(_ _)m

puyopa
質問者

お礼

回答ありがとうございました。 とても合理的で、素晴らしい記述だと思います。 大変勉強になりました。使わせていただきます。

その他の回答 (2)

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

VBA的には該当シートのシートモジュールに以下のような感じでよろしいかと思います。 Private Sub Worksheet_Change(ByVal Target As Range) Dim C As Range For Each C In Target If Not Intersect(C, Range("A:A,C:C,E:E")) Is Nothing Then Application.EnableEvents = False If Cells(C.Row, "A").Value = "" And Cells(C.Row, "C").Value = "" And Cells(C.Row, "E").Value = "" Then Cells(C.Row, "G").ClearContents Else Cells(C.Row, "G").Value = Cells(C.Row, "A") & "-" & Cells(C.Row, "C") & "-" & Cells(C.Row, "E") End If Application.EnableEvents = True ElseIf Not Intersect(C, Range("B:B,D:D,F:F")) Is Nothing Then Application.EnableEvents = False If Cells(C.Row, "B").Value = "" And Cells(C.Row, "D").Value = "" And Cells(C.Row, "F").Value = "" Then Cells(C.Row, "H").ClearContents Else Cells(C.Row, "H").Value = Cells(C.Row, "B") & "-" & Cells(C.Row, "D") & "-" & Cells(C.Row, "F") End If Application.EnableEvents = True End If Next C End Sub

puyopa
質問者

お礼

回答ありがとうございます。 私がやろうとしていた、イメージに近い記述でした。 勉強になりました。

noname#203218
noname#203218
回答No.1

関数で対応可能ですのでマクロでなくても良いのではないのでしょうか。 G2式=IF(COUNTIF(A2:F2,"")=0,A2&"-"&C2&"-"&E2,"") H2式=IF(COUNTIF(A2:F2,"")=0,B2&"-"&D2&"-"&F2,"") 下方にフィルコピー 0から始まる数値はテキストで入力されてるものとしています。 数字1桁だけ入力し、セルの表示型式で先頭に0を表示させているのでしたら、違う関数になります。 例えば数値が2桁限定であれば下記で可能です。2桁3桁が混在すると処理できません。 G2式=IF(COUNTIF(A2:F2,"")=0,RIGHT("0"&A2,2)&"-"&RIGHT("0"&C2,2)&"-"&RIGHT("0"&E2,2),"")

puyopa
質問者

お礼

回答ありがとうございます。仰せられる通り全て文字列です。 説明不足ですみません。 関数でのやりかたは、分かるのですが、行が増えてファイルを重くしたくない。 他のユーザーに関数を操作あせたくない、等の理由でvbaを希望します。

関連するQ&A

専門家に質問してみよう