こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel2007で行指定して数字を記号に変換

いつもお世話になり感謝します。

X列の1マス1マスに0~9の数字のいずれかが入ると、X列に入った0~9の値に反応して、そのX列の1マスを水平上にかつ、中心として、V列W列とY列Z列のセルに0~9の数字のいずれかが入ります。

更に、V列W列とY列Z列に入った数値を記号に変換して、その変換内容は
0が●で
1~9は×
になります。

マクロボタンを押すと
行指定ができるダイアログボックスが出て来て
行指定されたセルXに0~9の数字を0から1つずつ入れて
別sheetの、0の場合はB20にV列の値を、W列はC20、Y列はD20、Z列はE20にと変換内容に沿ってコピペしたいです。

Xに3が入るということは、別sheetの(B23:E23)に変換された記号が入ってる形であることが正解の形になります。

私の下手な質問がおおまかにご理解して頂けたと思いますので、ここから質問を綺麗にまとめます。

Asheet上にあるマクロボタンからBsheetのX列の行番号指定に始まり、その行番号指定したXセルに0~9が1つずつ入りますと、セルA20~A29に0~9と数字を付ってますので
V列はAsheetのB20から下に、W列はAsheetのC20から下に、Y列はAsheetのD20から下に、Z列はAsheetのE20から下に

マクロボタンで行指定する度に変換内容に沿って変換された記号が(B20:E20)~(B29:E29)にと一気にずらーっと入ってるのが希望なんです。

再度ご協力頂けたら嬉しいです。

投稿日時 - 2019-08-26 12:15:27

QNo.9649728

困ってます

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

>行指定されたセルXに0~9の数字を0から順に一回一回入れては出来上がったのをsheetBに、という形を希望してます。
了解です。拡張性等を考えていませんが、以下のコードでどうでしょうか?


Option Explicit

Sub SetConfig(ByRef InputSheet As Worksheet, ByRef OutputSheet As Worksheet, ByRef InputColumn As Integer, ByRef FunctionColumn() As Integer, ByRef OutputRow As Integer, ByRef OutputColumn() As Integer)
'各種設定値
 Set OutputSheet = Worksheets("ASheet") '値を出力するシート
 Set InputSheet = Worksheets("BSheet") '値を変換する関数が存在するシート
 InputColumn = 24 'X列
 ReDim FunctionColumn(1 To 4)
 FunctionColumn(1) = 22 'V列
 FunctionColumn(2) = 23 'W列
 FunctionColumn(3) = 25 'Y列
 FunctionColumn(4) = 26 'Z列
 OutputRow = 20
 ReDim OutputColumn(1 To 4)
 OutputColumn(1) = 2 'B列
 OutputColumn(2) = 3 'C列
 OutputColumn(3) = 4 'D列
 OutputColumn(4) = 5 'E列
End Sub


Sub ConvertValuetoString()
 Dim i As Integer, j As Integer, buf As String
 Dim InputSheet As Worksheet '値を変換する関数が存在するシート
 Dim OutputSheet As Worksheet '値を出力するシート
 Dim InputRow As Integer '取得した値を入力する行番号。InputBoxで受ける関係上、stringとする。
 Dim InputColumn As Integer '取得した値を入力する列番号
 Dim FunctionColumn() As Integer '取得した値を変換するセルの列番号
 Dim OutputRow As Integer '変換した値を出力する基点となる行番号。
 Dim OutputColumn() As Integer '変換した値を出力する列番号。
 Dim myStr As String

 '設定取得
 Call SetConfig(InputSheet, OutputSheet, InputColumn, FunctionColumn, OutputRow, OutputColumn)

 '行番号取得
 buf = InputBox("対象の行番号を入力して下さい。")
 If StrPtr(buf) = 0 Then 'キャンセルされた場合。
  Exit Sub
 ElseIf Not IsNumeric(buf) Then
  MsgBox ("入力された値は数字ではありません。")
  Exit Sub
 ElseIf CInt(buf) < 0 Then
  MsgBox ("行番号として0以下の値を指定する事はできません。")
  Exit Sub
 End If
 InputRow = CInt(buf)

 For i = 0 To 9
  '0~9の値をセルに入力。
  InputSheet.Cells(InputRow, InputColumn).Value = i
  '変換された値を記号に変換して転記。
  For j = 1 To 4
   If InputSheet.Cells(InputRow, FunctionColumn(j)).Value = 0 Then
    myStr = "●"
   Else
    myStr = "×"
   End If
   OutputSheet.Cells(OutputRow + i, OutputColumn(j)).Value = myStr
  Next j
 Next i
 '0~9を入力したセルの文字を削除。
 InputSheet.Cells(InputRow, InputColumn).ClearContents
End Sub

投稿日時 - 2019-08-31 04:14:39

お礼

こんばんはmathmi さん。いかがお過ごしでしょうか。台風がやっとさりましてこちらは一安心です(^-^)ゝ゛
コンパイルエラー修正候補でthen が指摘されました。
ElseIf Not IsNumeric(buf) Then
  MsgBox ("入力された値は数字ではありません。")
  Exit Sub
修正お願い致します。

投稿日時 - 2019-09-10 21:43:04

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

>中古で買ったノトパなんで色々入っててわかりませんが使ってるのはExcel2007
Open officeやLibraだと、ExcelではなくCalcの筈なんで、純正のMicrosoft Officeで間違いないみたいですね。
(となると、どうしてこんなに変な所でエラーが起こるのか……)


>やり方が分からないです
'(アポストロフィ)を付けると、それ以降をコメントアウトできます。コメントアウトした部分は実行されないので、当然エラーも起きません。
問題の箇所はエラートラップであり、入力値が正しいなら不要な箇所なので、エラーが起こるくらいならいっそ使わないという選択肢も取れる場所です。

コメントアウトしたい行を選択し「コメントブロック」ボタンを押すと、自動的にコメントアウトしてくれます。
「コメントブロック」ボタンがない場合は、ツールバーを右クリック→[編集]にチェックを付ければ、ボタンを含むバーが出る筈です。
逆にコメントアウトを外したい場合は、隣の「非コメントブロック」を押せば解除できます。
(添付画像参照)


>括弧の部分が赤文字になりThen が指摘されてる状態
エラーの内容は変わりませんでしたか。
新規ファイルに、該当のコードだけを、コピー&ペーストで貼り付けた状態で動かしてみても同様のエラーが発生するなら、正直お手上げです。
該当部分をコメントアウトor削除するのが一番早いでしょう。

投稿日時 - 2019-09-11 16:27:07

補足

緊急連絡です!!!意味がわかりました!そしてエラー行をコメントアウトしたらコンパイルに成功したのでやってみると

なんとも、感動的で美しく作動すること(ToT)メチャメチャ嬉しいです。mathmi さんありがとうございました。
少しずつ慣れていきますので今後ともよろしくお願いいたします。

投稿日時 - 2019-09-11 17:49:14

お礼

構文エラーになりますね。
コメントアウトってmathmi さんがソースに書いてくださったコメントを同じように書けるってこと何ですか?

投稿日時 - 2019-09-11 16:59:10

ANo.4

相変わらず、こちらで発生しないエラーが発生しますね。
原因が分からないので、どう修正していいものか見当もつきません。

自分のコードを丸コピーしていて、修正もコピーミスもないものとします。
「コンパイルエラー:修正候補:then」という事は、Ifに対応するThenが存在しない、という事だと思いますが、ちゃんとElseIfもThenも存在しますし……。
現状できる事と言えば
[ElseIf Not IsNumeric(buf) = True Then]
と、=Trueを付けてみて様子を見てみる、くらいでしょうか。
或いはいっそ、[If StrPtr(buf) = 0 Then]~[End If]までのエラートラップ部分をコメントアウトしてしまうか、ですね。


後、確認なのですが、使用ソフトはOffice Excelですよね? Libre OfficeとかOpen Officeとかじゃないですよね? バージョンは幾つでしょうか?

投稿日時 - 2019-09-11 09:57:40

お礼

ご返答ありがとうございます。[ElseIf Not IsNumeric(buf) = True Then]を書いてみたのですが括弧の部分が赤文字になりThen が指摘されてる状態になります。

>或いはいっそ、[If StrPtr(buf) = 0 Then]~[End If]までのエラートラップ部分をコメントアウトしてしまうか、ですね。
やり方が分からないです。_(^^;)ゞ

>後、確認なのですが、使用ソフトはOffice Excelですよね? Libre OfficeとかOpen Officeとかじゃないですよね? バージョンは幾つでしょうか?
私はあまり詳しくは無いので…確認の仕方はどうすればよろしいですか?
中古で買ったノトパなんで色々入っててわかりませんが使ってるのはExcel2007です。

投稿日時 - 2019-09-11 15:16:26

ANo.2

これが3度目の質問のようですが、回答がないならともかく「質問内容が分かりません」という回答が付いているのですから、再度質問する場合は質問文は修正するべきだと思います。
正直自分も、どんなコードが欲しいのか分かりません。


質問内容を確認します。

既に存在するもの
・X列のn行目(以下Xnと表記)に0~9のいずれかの値が入ると、それに対応してVn、Wn、Yn、Znの四つのセルに値が入力される。

新たに作成したいもの
・ダイアログボックスで行番号を入力する。これはシートAのボタンを押したら実行するようにする。
・入力された行番号(仮にnとする)に基づき、シートBのXnに0をXn+1に1を……Xn+9に9を入力する(合計10個のセルに入力する)。
・それに対応して、上記にあるように、Vn~Vn+9、Wn~Wn+9、Yn~Yn+9、Zn~Zn+9にも自動的に入力される。
・シートBのVnの値を変換してシートAのB20に、シートBのVn+1の値を変換してシートAのB21に……シートBのVn+9の値を変換してシートAのB29に入力する。
・同様にシートBのW列はシートAのC20:C29に、シートBのY列はシートAのD20:D29に、シートBのZ列はシートAのE20:E29に入力する。
・変換法則は、シートBの値が0の場合は●、1~9だった場合は×。

以上で合っていますか?
この場合、正直作成する意味がほぼないマクロではあるのですが。

投稿日時 - 2019-08-27 10:59:08

お礼

こんにちはmathmi さん。多分、mathmiさんが思われてる通りだとは思いますが、一つ気になった箇所があったのでその箇所を指定して、私の考えてる事を再度お伝えさせていただきます。
>入力された行番号(仮にnとする)に基づき、シートBのXnに0をXn+1に1を……Xn+9に9を入力する(合計10個のセルに入力する)。

行指定されたセルXに0~9の数字を0から順に一回一回入れては出来上がったのをsheetBに、という形を希望してます。

投稿日時 - 2019-08-30 17:06:42

ANo.1

何度か同じ質問で回答がなかったのだと思いますが、たぶんやりたいことがはっきりと見ている人に届かないのだと思います。
一例として
> X列の1マス1マスに0~9の数字のいずれかが
具体的に例をあげないと1マス1マスと書かれてもどこなのだろうとなります。
> 行指定されたセルX
セルXってどこ?とか
> セルA20~A29に0~9と数字を付ってますので
もともと入っている?おおまかな説明には出てきていません。
具体的な例をあげて説明したほうがわかると思いますよ。
ボタンを押して5行目を指定したら
X5に3が入ってあとどのセルに何が入るとかですね。
具体例を挙げて再度質問したら誰か回答してくれるかもですね。

投稿日時 - 2019-08-26 18:26:29

あなたにオススメの質問