- ベストアンサー
誰かエクセル教えてください!!(初心者です)
sheet1にA1からA100まで連番が入っています。 B1からB100まで英単語が入っています。 C1からC100まで発音が入っています。 sheet2に2列5行で10個の単語カードを作りたいんです。これをフォームとします。 sheet1のA1からA100の任意の番号を入れたら sheet2のカードが印刷されるようにしたいです。 1~100と入れたら全部印刷されるようにもしたいです。単語は今後も増えていきます。 Sheet2の10個の単語カードは10個を超えたりシートを何枚も使うのではなく、年賀状作成ソフトのように1枚だけ(この場合10個ですが)にしたいです。 よろしくお願いします。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
文章だけだとごちゃごちゃして分かりにくそうなので、プログラムに注釈をつけてみました。 Sub 印刷() 'プログラム開始およびタイトルの指定 On Error GoTo err 'もしエラーが発生したらerr:のところへジャンプ a = Range("D1").Value 'aにD1セルの内容を代入 b = Range("D2").Value 'bにD2セルの内容を代入 y = 1 'yに一つ目の単語の行数を代入(この場合は1行目) x = 1 'xに一つ目の単語の列数を代入(この場合は1列目) For i = a To b 'iをaからbまで変化させながら(+1)、「Next」との間を繰り返し If y = 1 And x = 1 Then 'もしy=1かつx=1(シート2に最初の単語をコピーする前なら・・ Sheets(2).Range("A1:G9").ClearContents'シート2のA1:G9をクリア End If Range(Cells(i, 1), Cells(i, 3)).Copy 'i行目1列からi行目3列までをコピー Sheets(2).Cells(y, x).PasteSpecial Paste:=xlValues'2枚目のシートのy行x列に数値のみ貼り付け y = y + 2 '次の貼り付けのために行数を2増やす If (y = 11 And x = 5) Or (i = b) Then 'もしy=11かつx=5(10個コピーした)か、i=b(最後の単語をコピーした)ならば・・ Sheets(2).PrintOut Copies:=1 'シート2を印刷(1部)して、 y = 1 'y,xを1にする(印刷が終わったら、次の単語は左上に貼り付けるので) x = 1 End If If y = 11 Then 'もしy=11(1列目に5個単語を貼り付けた)ならば・・・ y = 1 'yは1行目にして、xは5列目(E列)にする x = 5 End If Next '上の「For」と組になって、繰り返しの範囲を表す err: End Sub 'プログラム終了 やっぱりごちゃごちゃしてますね。頑張って解読してください・・・。
その他の回答 (10)
- inte-nori
- ベストアンサー率48% (33/68)
ちなみに、元のデータが入っているシートが表示されている状態で、 1.「表示」>「ツールバー」>「フォーム」で、フォームツールバーを表示する。 2.ツールバーから「ボタン」を選んで、好きなところにボタンを作る。 3.「マクロの登録」ボックスの中の「印刷」を選択し、「OK」を押す。 4.適当なセルを選択して、ボタンが選択されている状態を解除する。 これで、ボタンを押すだけでプログラムが実行できるようになります。 ご参考までに。
- inte-nori
- ベストアンサー率48% (33/68)
それでは、プログラムの詳しい説明をしますね。 まず一行目の「Sub 印刷()」と、最後の「End Sub」は、プログラムの最初と最後を表す命令です。 また、同時にプログラム名も指定します。この場合「Sub」と「()」にはさまれた「印刷」がプログラム名になります。 「On Error Go To err」は、下のほうの「err:」と組になっていて「プログラムの実行中にエラーが発生したら「err:」のところへジャンプしろ」すなわち、エラーが出たら何もせずに終了させろ、という意味です。 この命令を書かないと、D1やD2に何も入力しなかった場合にエラーとなり、「Visual Basic Editor」の画面に勝手に切り替わってしまいます。 「a=・・」「b=・・」で、aとb、それぞれの変数に、D1セルの値とD2セルの値を代入しています。「Range("○○").Value」で、○○セルの値を表します。 仮にD1セルの値が2で、D2セルの値が12だった場合、aに2が代入され、bに12が代入されます。 「y=1」「x=1」で、シート2に貼り付けるときのセルの初期値を指定しています。一つ目の単語は、1行1列目にコピーするので、y,xともに1となります。 次の「For・・」は、下のほうの「Next」と組になっていて、その間を繰り返す、という命令です。 何回繰り返すかは、For文の中で指定しています。 具体的には、 1.iという変数にaを代入する。 2.「Next」のところまできたら、「For」のところへ戻り、iに1をプラスする。 3.これを、iがbの値になるまで繰り返す。 という形になります。 例えば、aが2でbが12だった場合、一回目にはiに2が入り、「Next」まで来たら「For」に戻ってiが3になります。 これをiが12になるまで繰り返すことになります。 次の「If y=1 And x=1 then」は2行下の「End If」と組になっています。 この場合は、もし「y=1」かつ「x=1」の場合に「Then」と「End If」の間にある命令を実行しろ、という意味です。 ここでは、y,xがともに1の場合、すなわちシート2の一つ目の単語をコピーするときに、印刷部分をクリアするようにしています。 「Sheets(2).Range("A1:G9").ClearContents」で、A1:G9の内容をクリアしろ、という意味になっています。 「Range(Cells(i, 1), Cells(i, 3)).Copy」は、コピーをする場所を指定しています。 Rangeという命令は今までにも出てきていますが、Range("A1")などという使い方のほかに、このようなCellsという命令を使う方法があります。 これはi行目の1列目からi行目の3列目までの範囲をコピーしろ、という意味になります。 Cellsを使用した場合は、"A1"のような文字ではなく、数字のみを使って範囲指定できる、というメリットがあります。 今回はiを変化させることによって単語を順番にコピーしていくので、この方が都合がいいわけです。 そして、次の「Sheets(2).Cells(y, x).PasteSpecial Paste:=xlValues」で、貼り付け先と、貼り付ける内容を指定しています。 これは2枚目のシートのy行目のx列に、数値のみ(書式等は含まない)を貼り付けろ、という意味です。「Paste:=xlValues」を後ろにつけることで「数値のみを貼り付ける」という意味になります。 「y=y+2」は、次に貼り付ける場所を2段下にずらすために、貼り付け先の行番号を表しているyの値に2を足しています。 次も「If・・」なので、上で説明したときと同様に、条件が満たされたら「Then」から「End If」までの命令を実行することになります。 ここでは印刷をしているのですが、印刷をするのは「ページが一杯になったとき」と「D2で指定した単語のコピーが終わったとき」ですね。 ここでは「yが11でxが5の場合、すなわち10個目の単語をコピー&貼り付けした直後」または「i=b、すなわち最後の単語をコピーした直後」に、シート2を印刷して、yとxを1にする、ということをしています。 10個目の単語は9行目にコピーしていますが、コピー後にy=y+2となっているので、yは11になっているわけです。 その次のIf文は、1行目が一杯になったとき、すなわち5個目の単語をコピーした後に、xの値(貼り付け先の列数)を5列目にする、ということをしています。5列目とはすなわちE列のことですね。 これによって、D列を空白にしてE列に2列目を貼り付けています。 そして、先ほど説明した「Next」によって「For」のところまで戻り、決められた回数だけ繰り返しをして終了となります。
- inte-nori
- ベストアンサー率48% (33/68)
すみません!前回のコードでは、書式もコピーしてしまっていました。下記のコードではどうでしょうか? Sub 印刷() On Error GoTo err a = Range("D1").Value b = Range("D2").Value y = 1 x = 1 For i = a To b If y = 1 And x = 1 Then Sheets(2).Range("A1:G9").ClearContents End If Range(Cells(i, 1), Cells(i, 3)).Copy Sheets(2).Cells(y, x).PasteSpecial Paste:=xlValues y = y + 2 If (y = 11 And x = 5) Or (i = b) Then Sheets(2).PrintOut Copies:=1 y = 1 x = 1 End If If y = 11 Then y = 1 x = 5 End If Next err: End Sub
お礼
本当にありがとうございます。完成できました。 今後、シート2のフォームを変更したい(空白セルを作る等)んですが、プログラムの意味が全く分かりませんので解説してくださると嬉しいです。 よろしくお願いします。
- inte-nori
- ベストアンサー率48% (33/68)
#1です。 とりあえず、補足の2については、下記のコードで出来るかと思います。 3については、プログラムを実行する前に、前もってシート2の書式を変えておくことで可能です。 Sub 印刷() On Error GoTo err a = Range("D1").Value b = Range("D2").Value y = 1 x = 1 For i = a To b If y = 1 And x = 1 Then Sheets(2).Range("A1:G9").ClearContents End If Range(Cells(i, 1), Cells(i, 3)).Copy Destination:= _ Sheets(2).Cells(y, x) y = y + 2 If (y = 11 And x = 5) Or (i = b) Then Sheets(2).PrintOut Copies:=1 y = 1 x = 1 End If If y = 11 Then y = 1 x = 5 End If Next err: End Sub 補足1の解説については、また後ほど回答しますね。
お礼
ご回答、ありがとうございます。補足2の問題については解決いたしました。 補足3なんですが、シート2の書式を変えるというのは具体的にどういうことですか?先にシート2のフォントサイズを大きくしていてもシート1の文字の大きさと同じになってしまいます。 よろしくお願いします。
- inte-nori
- ベストアンサー率48% (33/68)
#2&#3&#4です。たびたびすみません。 #1の方への補足を全然読んでいませんでした。 >**任意の番号は2セル用意してあって、12番という指定をしたら、12番の単語をフォームで印刷(残り9マスは空白)です。 だったんですね。前回のコードでは、どんな場合でも10個印刷してしまっていたので、コードを直してみました。D1,D2セルそれぞれに12を入れると、12番だけ印刷されると思います。 Sub 印刷() On Error GoTo err a = Range("D1").Value b = Range("D2").Value x = 1 y = 1 Sheets(2).Range("A1:G9").ClearContents For i = a To b Range(Cells(i, 1), Cells(i, 3)).Copy Destination:= _ Sheets(2).Cells(y, x) y = y + 2 If (y = 11 And x = 5) Or (i = b) Then Sheets(2).PrintOut Copies:=1 Sheets(2).Range("A1:G9").ClearContents y = 1 x = 1 End If If y = 11 Then y = 1 x = 5 End If Next err: End Sub 単語をひとつずつ、座標を変えながらコピーしていって、「ページが一杯になる」か「最終の単語をコピーした」のいずれかの条件で印刷をかけるようにしています。不明な点がありましたらご返答ください。
お礼
何度も返答ありがとうございます。分からない所がありますので教えてください。 1.プログラムの文法が全然わかりません。厚かましく申し訳ないですが、1つずつ解説してくださると嬉しいです。 2.sheet2に最後に印刷されたものを表示したいです。 このプログラムの場合消えてしまいます。 3.sheet2に印刷される文字の大きさをsheet1と異なる大きさで全て大きくしたい。(例フォントサイズ20)
- imogasi
- ベストアンサー率27% (4737/17070)
#1です。VBAによる回答例を上げます。 Sub test01() Dim a(2) Dim sh1 As Worksheet Dim sh2 As Worksheet '---- Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '----- d = sh1.Range("A2").CurrentRegion.Rows.Count ' MsgBox d sh2.Range(Cells(2, "B"), Cells(6, "G")).Clear p01: x = InputBox("番号指定From-To") b = Split(x, "-") ' ---指定番号チェック If UBound(b) = 1 Then '-ありの場合 If Val(b(0)) > Val(b(1)) Then MsgBox "From-To指定順序エラー" GoTo p01 Else a(0) = Val(b(0)): a(1) = Val(b(1)) End If Else a(0) = Val(b(0)): a(1) = Val(b(0)) End If MsgBox a(0) & "->" & a(1) '確認のため、削除可 '------開始番号行を探す For i = 2 To d If sh1.Cells(i, "A") = a(0) Then GoTo p02 Next i MsgBox "範囲指定エラー・データなし" GoTo p01 '-----開始番号見つかった p02: k = 2 'Sheet2の先頭行 For j = i To i + a(1) - a(0) Step 2 '------Sheet2の左列 sh2.Cells(k, "B") = sh1.Cells(j, "A") sh2.Cells(k, "C") = sh1.Cells(j, "B") sh2.Cells(k, "D") = sh1.Cells(j, "C") '------Sheet2の右列 If sh1.Cells(j + 1, "A") > a(1) Then GoTo p03 sh2.Cells(k, "E") = sh1.Cells(j + 1, "A") sh2.Cells(k, "F") = sh1.Cells(j + 1, "B") sh2.Cells(k, "G") = sh1.Cells(j + 1, "C") '-------Sheet2の印刷 p03: If k = 5 + 1 Then '5行を越えると印刷 sh2.Range(Cells(1, "A"), Cells(7, "H")).PrintOut sh2.Range(Cells(2, "B"), Cells(6, "G")).Clear k = 2 Else k = k + 1 End If Next j '---終了後残り分データ印刷 sh2.Range(Cells(1, "A"), Cells(7, "H")).PrintOut End Sub Sheet1のA1:CXXXにデータがあるとします Sheet2のB2:G6が単語帳の単語セット範囲です。Sheet2の第1行、A列、H列はご自由に文言を セット可。 列幅、行高、文字色・文字字体・サイズや罫線、罫線色 等はご自由に手動でセットしてください。 小数例でテスト済みだが、テスト不十分かも。 VBAとして、私のレベルで難易度「中」で、易しくはない。 1.「ツール」>「マクロ」>「Visual Basic Editor」をクリックして開きます。 2.VBEエディタのメニュの「挿入」>「標準モジュール」をクリックし、右側に表示された、一番大きいウィンドウに上記のコードをコピーし貼り付けます。 今まで印刷したことがある単語かどうかに一切係わり無く、何番から何番まで印刷するか指定も操作者任せです。 #2、3のご回答と見た目非常に違いますが、別人が作ると、異なるものになる実例に成ってしまいました。
お礼
ありがとうございました。imogasiさんのおっしゃる通りに したら、無事完成しました。本当に助かりました。また、分からないことがありましたらお尋ねするかもしれませんが、その際はよろしくお願いします。
- inte-nori
- ベストアンサー率48% (33/68)
#2&3です。一箇所間違えてました。 下記のコードの On err GoTo err の部分を、 On Error GoTo err に変えてください。すみません。
- inte-nori
- ベストアンサー率48% (33/68)
#2です。下記のコードで、希望通りになるのではないかと思います。 プリンタがない環境なので、実際に試せないのが不安ですが・・。 Sub 印刷() On err GoTo err a = Range("D1").Value b = Range("D2").Value For i = a To b Step 10 Range(Cells(i, 1), Cells(i, 3)).Copy Destination:= _ Sheets(2).Cells(1, 1) Range(Cells(i + 1, 1), Cells(i + 1, 3)).Copy Destination:= _ Sheets(2).Cells(3, 1) Range(Cells(i + 2, 1), Cells(i + 2, 3)).Copy Destination:= _ Sheets(2).Cells(5, 1) Range(Cells(i + 3, 1), Cells(i + 3, 3)).Copy Destination:= _ Sheets(2).Cells(7, 1) Range(Cells(i + 4, 1), Cells(i + 4, 3)).Copy Destination:= _ Sheets(2).Cells(9, 1) Range(Cells(i + 5, 1), Cells(i + 5, 3)).Copy Destination:= _ Sheets(2).Cells(1, 5) Range(Cells(i + 6, 1), Cells(i + 6, 3)).Copy Destination:= _ Sheets(2).Cells(3, 5) Range(Cells(i + 7, 1), Cells(i + 7, 3)).Copy Destination:= _ Sheets(2).Cells(5, 5) Range(Cells(i + 8, 1), Cells(i + 8, 3)).Copy Destination:= _ Sheets(2).Cells(7, 5) Range(Cells(i + 9, 1), Cells(i + 9, 3)).Copy Destination:= _ Sheets(2).Cells(9, 5) Sheets(2).PrintOut Copies:=1 Next err: End Sub ちなみに仕組みを説明すると、まずa,bという変数にそれぞれD1,D2のセルの内容を代入し、次にiという変数をaからbまで、10個飛ばしで増やしながら、「For」と「Next」の間を繰り返します。(1~20なら、全体を2回繰り返すことになります。)そして、下記の式で2枚目のシートに数値をコピーします。 Range(Cells(i, 1), Cells(i, 3)).Copy Destination:= _ Sheets(2).Cells(1, 1) これは、i行目の1列目からi行目の3列目までを、2枚目のシートの1行目の1列目にコピーする、という意味です。(1行目の5列目にコピーするときは、最後の(1,1)が(1,5)になります。) この部分をよく見ていただくと、改造の仕方もわかってくるかと思います。前回は、行に隙間がなかったため、まとめてコピーすることが出来たので、プログラムを短くすることが出来たわけです。 上記と同様に10組のセルをコピーして、最後のPrintOutで印刷しています。 本当はもっとスマートなプログラムに出来ると思うのですが、わかりにくくなると思ってやめました。 ちなみに最初の方の「On err…」と最後の方の「err:」はエラーが発生したとき(D1やD2に数値が入っていないとき)に、プログラムが途中で止まらないようにする命令です。 うまく動くといいんですが・・。
- inte-nori
- ベストアンサー率48% (33/68)
ちょっと複雑になってしまいますが、VBAという機能を使うことによって可能です。 1.「ツール」>「マクロ」>「Visual Basic Editor」を開きます。 2.「挿入」>「標準モジュール」を実行し、右側に表示されたウィンドウに下記のコードを貼り付けます。 Sub 印刷() On err GoTo err a = Range("D1").Value b = Range("D2").Value For i = a To b Step 10 Range(Cells(i, 1), Cells(i + 4, 3)).Copy Destination:= _ Sheets(2).Cells(1, 1) Range(Cells(i + 5, 1), Cells(i + 9, 3)).Copy Destination:= _ Sheets(2).Cells(1, 4) Sheets(2).PrintOut Copies:=1 Next err: End Sub 3.画面下のタスクバーでエクセルの画面に戻します。 4.D1に始めの行番号、D2に終わりの行番号を入力しておきます。 5.「ツール」>「マクロ」>「マクロ」を実行し、「印刷」を選択して[実行]を押します。 こんな感じでいかがでしょうか?
お礼
本当にありがとうございます。非常に助かりました。 分からない所が2つあるので教えていただきたいです。 1:印刷するsheet2のD列を空白にして後のを右に1列ず つ、ずらしたいです。 2:印刷するsheet2の2行目、4行目、6行目、8行目、 10行目を空白にしたいです。 これらは、プログラムのどの部分になるのか教えてください。お願いします。
- imogasi
- ベストアンサー率27% (4737/17070)
ざっと読んだとところ、「初心者です」おっしゃる人が出来る問題ではないかもしれない。プログラム(VBA)というものを使わないと出来ない(複雑になり過ぎる)かも知れない。良いですか。ビジネスでは似たような問題 は良くあるパターンかなと思いますが。 またはワードとの連携の「差しこみ印刷」応用問題のような気もする。 それはともあれ、質問を読んで、答えてくださる方用にも、補足質問・確認させてください。 >sheet1にA1からA100まで連番が入っています。 B1からB100まで英単語が入っています。 C1からC100まで発音が入っています。 100行以下のときにも印刷はしたいし、100行以上の時もあって、今後増加があるということですね。54番を印刷して、54番を抹消して印刷など、抹消なんてあるのかな。 >sheet2に2列5行で10個の単語カードを作りたいんです。これをフォームとします。 2列は英単語と発音の2列ですか。すると5行で5単語分しか出来ないですね。単語だけで2列×5行で10単語ですか。発音記号は入れないのですか。 >10単語単位として、100個なら10フォーム必要だし、105単語でも11フォーム必要ですね。 フォームの位置関係は上下とかですか。 プログラムで処理する時は10単語分1フォームに単語をセットし、印刷し、同じフォームに次の10単語をセットし印刷するのが常道なので、どうなのかなと思うのです。 >単語は今後も増えていきます。 あるとき105単語印刷するとして、13単語増やした時 は増やした13単語だけフォームを使って、10単語越えるので、2枚印刷するのですか。 >sheet1のA1からA100の任意の番号を入れたら 任意の番号は2セル用意してあって、12番という指定をしたら、12番の単語をフォームで印刷(残り9マスは空白)ですか、また何々から何々までと言うFROM-TO の番号を入れると、その範囲の番号の単語を印刷即ちフォームにセットせよと言うことですか。 >Sheet2の10個の単語カードは10個を超えたりシートを何枚も使うのではなく >年賀状作成ソフトのように1枚だけ(この場合10個ですが)にしたいです。 この2つの意味が良く伝わらない。 10単語のフォームが、上から下へ、例えば67個の単語の場合、Sheet2に7セットべたべた現れるのではないと言うことですか。 「年賀状作成ソフトのように」とは1フォームで中身の単語が次々入れ替わって、入れ替わる前に印刷したいと言うことですか。 それらは専門のソフトを作るからこそ出きるのです。エクセルの不得手事項です。 それに手作業でシコシコやる方法は質問してないでしょう。残るエクセルでの方法は関数式を利用する、VBAを作る、ウイザード、アドイン、フリーソフトを探すしかありませんが、関数式では原理的に印刷指令は掛けられませんからね、期待してはだめですよ。
補足
わかりずらい質問の仕方ですいません。 >sheet1にA1からA100まで連番が入っています。 B1からB100まで英単語が入っています。 C1からC100まで発音が入っています。 100行以下のときにも印刷はしたいし、100行以上の時もあって、今後増加があるということですね。54番を印刷して、54番を抹消して印刷など、抹消なんてあるのかな。 **抹消は無いです。 >sheet2に2列5行で10個の単語カードを作りたいんです。これをフォームとします。 2列は英単語と発音の2列ですか。すると5行で5単語分しか出来ないですね。単語だけで2列×5行で10単語ですか。発音記号は入れないのですか。 **単語だけで2列×5行で10単語でそれぞれのカード に発音も入れます。 >10単語単位として、100個なら10フォーム必要だし、105単語でも11フォーム必要ですね。 フォームの位置関係は上下とかですか。 プログラムで処理する時は10単語分1フォームに単語をセットし、印刷し、同じフォームに次の10単語をセットし印刷するのが常道なので、どうなのかなと思うのです。 **10単語分1フォームに単語をセットし、印刷し、同じフォームに次の10単語をセットし印刷したいです。 >単語は今後も増えていきます。 あるとき105単語印刷するとして、13単語増やした時 は増やした13単語だけフォームを使って、10単語越えるので、2枚印刷するのですか。 **単語数が10の倍数になったときに印刷しますので、考慮しなくても良いです。 >sheet1のA1からA100の任意の番号を入れたら 任意の番号は2セル用意してあって、12番という指定をしたら、12番の単語をフォームで印刷(残り9マスは空白)ですか、また何々から何々までと言うFROM-TO の番号を入れると、その範囲の番号の単語を印刷即ちフォームにセットせよと言うことですか。 **任意の番号は2セル用意してあって、12番という指定をしたら、12番の単語をフォームで印刷(残り9マスは空白)です。何々から何々までと言うFROM-TO の番号を入れると、その範囲の番号の単語を印刷即ちフォームにセットせよと言うことです。 >Sheet2の10個の単語カードは10個を超えたりシートを何枚も使うのではなく >年賀状作成ソフトのように1枚だけ(この場合10個ですが)にしたいです。 10単語のフォームが、上から下へ、例えば67個の単語の場合、Sheet2に7セットべたべた現れるのではないと言うことです。 「年賀状作成ソフトのように」とは1フォームで中身の単語が次々入れ替わって、印刷したいと言うことです。 よろしくお願いします。
お礼
本当に本当にありがとうございました。親切、丁寧、迅速に対応していただき感謝しています。 これから勉強したいと思います。分からないことがあったら新規で質問欄に質問すると思いますが、時間に余裕がありましたらよろしくお願いします。