- ベストアンサー
Excelで表に任意データを入れたい
- Excelで表に任意のデータを入力する方法について教えてください。
- シートAに30行分の名前データを綺麗に収める表を作成し、別のシートBから任意の名前データを選択してシートAの形式で印刷する方法について教えてください。
- マクロを使用せずに、Excelで選択したデータ件数に応じてシートAの表を複数枚に渡って印刷する方法について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
マクロを使ったやり方になりますが Altキー+f11キー → VBE画面が出てきますので 挿入 → ユーザーフォームと進んでください。 図のようにリストボックスとコマンドボタンを配置してください。 ユーザーフォームの作成が終わったらユーザーフォーム上で右クリック → コードの表示と進んで下記コードを貼り付けて下さい。 Private Sub UserForm_Initialize() Set WS01 = Worksheets("B") RETU = WS01.Cells(1, Columns.Count).End(xlToLeft).Column For n = 1 To RETU GYOU = WS01.Cells(Rows.Count, n).End(xlUp).Row For i = 1 To GYOU Mylist = WS01.Cells(i, n) With ListBox1 .AddItem Mylist .MultiSelect = fmMultiSelectMulti .ListStyle = fmListStyleOption End With Next i Next n End Sub Private Sub CommandButton1_Click() Cancel = True Set WS02 = Worksheets("A") For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) Then GYOU = WS02.Cells(Rows.Count, 1).End(xlUp).Row + 1 WS02.Cells(GYOU, 1).Value = ListBox1.List(i) End If If GYOU = 30 Then ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Range("A2:A30").ClearContents End If Next i If Range("A2") <> "" Then ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Range("A2:A30").ClearContents End If Unload Me End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub CommandButton3_Click() For i = 0 To ListBox1.ListCount - 1 ListBox1.Selected(i) = True Next i End Sub 最後に左上にあるThisWorkbookをダブルクリックして そこに下記コードを貼り付けて下さい。 Private Sub Workbook_BeforePrint(Cancel As Boolean) Set WS01 = Worksheets("A") WS01.Select Range("A2:A30").ClearContents If WS01.Range("A2") = "" Then Cancel = True UserForm1.Show End If End Sub 印刷を選択するとマクロが動くようになっています。 シートBは1行目から入力しているものとしています。 Worksheets("A")、Worksheets("B")ところは適宜変更して下さい。 30行目までいくか、すべて写し終わると印刷するようになっていますのでテスト段階ではプリンターの電源を切っておくなどして下さい。 個別に選択する場合リストにチェックを入れて下さい。ボタンの全て選択を押すとリスト全てを印刷します。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
エクセルに慣れていないのだろうが、質問の意図を十分表現できてない。 (1)シートAは罫線枠だけの(データ的には白紙の)シートのことを 言っているのか。30行分の罫線だけの表だよね。はっきり書くこと。 (2)シートBのA,B列には名前が入力済みということだね。 ーー (2)の選択をどうするかが構想できてない。 VBAならクリックしたセルの値をシートAの、順順に下の行へ加えていける。 しかし質問の書きぶりから、VBAなどやったこともないのでは。 (3)シートAは30行と決めているが、これが30行を超えると関数などでは 難しくなる。 こういう30行の罫線表を作る発想がおかしいので、30行を超えても そのままデータは下行に順にセットし、印刷する際に、改ページ線を手動で 入れたら仕舞いでは。 またタイトル行の指定で2ページ目以後もタイトルを出せる。 ーー もうひとつ難しいのは、シートBで名前を2列に入力すること。 出来れば1列の方がしやすい。 1列ならVBAを使わない場合、シートAに持ってゆくものをB列に1でも入力して、B列が1の行をシートAへ 、抜き出しすることが出来る。 しかしエクセルの関数で抜き出し問題は、式が長くなり、難しい関数の 組み合わせになる。回答例は,Googleででも「imogasi方式」で照会すれば、 私以外の回答でわかる。 「imogasi方式」は作業列を使うがまだやさしさの点でやさしいと思う。 ーーー 操作の方法で シートBのA列に 山田 今川 大道 木村 曽根 大村 米沢 佐藤 とあったとして 今川 木村 大村 米沢 をCTRLキーを押しながらクリックで選択し、コピーする シートAのA2に編集ー「形式を選択して貼り付け」 「空白セルを無視する」 で貼り付け でできるのではないか。
お礼
回答ありがとうございます。 申し訳ありません、質問に慎重になり過ぎて回答しにくい質問文になってしまいました; 1)そうです、シートAには罫線だけで作った形だけの表があります。 2)VBAの経験ですが、プログラミング自体には何の抵抗も無いのですが、VBA自体はちょっとフォーム作ってボタンクリックしてメッセージ出したくらいの経験しかありませんでしたので、VBAでどう書くのかというのが理解しきれておらず、消極的な書き方をしてしまいました・・・申し訳ありません。 3)タイトル行の指定、初めて知りました(汗) 今まで、毎ページタイトル行を作っていたのでビックリしました。 ただ、選択するデータ数が一定では無いのと、最後のページが1行のデータしかなくとも30行分の枠線は表示させておきたいので、タイトル行の指定では今回のはちょっと違うかなと感じました。 質問方法が曖昧で申し訳ありませんでした。 色々指摘してくださり、複数の可能性を提示してくださったのでたくさん勉強になりました。 ありがとうございます。
- nobu_suzuki1
- ベストアンサー率35% (25/70)
シートBの名前がA列やB列などの複数列に渡って入力されている理由がよくわかりませんが、それが一番ネックになってくるポイントになっています。 これが、すべてA列に入っていて尚且つその名前に重複が無ければマクロを使用することなく入力規則や関数での対応が可能と思われます。(この場合入力規則でシートAの名前欄をひとつづつ選択するもしくは、シートBに選択用フラグを立て、それを参照しながら名前欄に選択フラグの立っている名前のみ表示するという関数を入れるなどの工夫が必要ですが)
お礼
回答ありがとうございます。 データはとにかく選択出来れば良いといった感じに詰め込んでいましたので、複数列に渡ってしまいました。。 重複は無いのですが、データ量がとにかく多く、選択はクリックかドラッグだけで簡単にでき、PC操作が苦手な人でも手間の無い簡単な手順で印刷できる方法が良いと考えていました。 選択するのにも複数選択があったり10件程度しか選択しない場合や50件ほど選択する場合などもあるので、どうしたものかと。。。 入力規則、使ったことありませんでした>< 少し触ってみましたが、こんな機能がExcelにあったんですね! 今回のには入力規則はどう対応させればよいのかわからないので違う方法を考えましたが、次何か必要になった時には入力規則が使えそうなところが色々ありますので、参考になりました。 ありがとうございます。
No.1です。 印刷範囲の設定の注意 各シートには、1~30番までNo.欄を既成で設けておいても良いし、 VLOOKUP関数で、表示しても良いのですが、 A列にはVLOOKUP関数用に通し番号を付けておき、【全体名簿】で オートフィルタなどで選択した番号の検索値ようにして、 印刷範囲からは、除外します。 若干の錯誤が有るかとも、思いますが、試行の参考にしてください。 一旦【全体名簿】を作れば、 【1枚目】~【○枚目】までのシートに手を加えて、様々なシートに素早くまとめることが 出来ました。 マクロにはかないませんが、それなりに5~15分くらいで、必要な項目を載せた名簿を 作ることでは、出来ました。 OKWebでExcelファイルを交換する術が有れば、サンプルをお送りします。
お礼
2度の回答ありがとうございます。 私もNo1での内容を参考にして作ってみましたが、データ量が増えれば増えるほど手間も半端なくなるというのが難点でした・・・ 一回の印刷に5分となると、今回のは一日に何個もいろんなデータの選択方法で一覧を印刷する可能性があるので、コピペや打ち込みに比べれば早いですがやはり手間を省いたような感じにはできませんでした・・・ もう少し小規模の内容で作る時は、これを参考にさせて頂きたいと思います。 ありがとうございました!
(o^-’)bm 発想を変えて見ました。 まずデーターはA~Gの7列と仮定します。 A B C D E F G 【 シートA 】通しNo.、TMPNo.、名前、生年月日、住所、電話番号、備考を、30行(人)分 【全体名簿】通しNo.、TMPNo.、名前、生年月日、住所、電話番号、備考を、数100行(人)分 (1)まず、【シートB】を【全体名簿】とシート名を変えます。 (2)次に【 シートA 】の、(通しNo.)に合わせてVLOOKUP関数で【全体名簿】を【 シートA 】の各行に反映させるのです。 C添付画像の入力は、備考的に記述したので、実際にはセルにお合わせて打ち込んでください。) (3)次に、【 シートA 】全体に最初にVLOOKUP関数で反映させた行を全ての行にコピーします。 これで【全体名簿】で選択した行が【 シートA 】に反映させるように、調整=手直しをします。 (4)次に、【 シートA 】を(全体の行数)÷30行分だけシートをコピーで作り、【1枚目】~【○枚目】とシート名を変えます。 (シート数が10シートくらいになります。 (5)【1枚目】=1行目から30行目、【2枚目】31行から60行め、【3枚目】61行から90行目、… とシートの行をそれぞれ残して他は削除します。 (6)【1枚目】=1行目から30行目、【2枚目】31行から60行め、【3枚目】61行から90行目、… 各シートのA列に通し番号を30個ずつ入れます。 (7)【1枚目】シート名をクリックして{Shifut}キーを押しながら【(最後)枚目】をクリックして 【全体名簿】以外の全てのシートを選択して、同じ形式に各シートをアレンジします。 一列目には共通の項目{通しNo.、TMPNo.、名前、生年月日、住所、電話番号、備考}を入れます。 (8)A列の全体の通し番号を除いた、30番ずつのTMPNo.から備考、各シートの31行までを 印刷範囲設定します。 これでtasoh様の最初の【シートA】は、【1枚目】~【○枚目】までのシートに分解されて どこのシートでも、確認でき、印刷できます。 新たな人材は、【全体名簿】に加えれば良いのです。
お礼
回答ありがとうございます。 早速試してみましたが、想像しているよりも毎回の手間がかかりそうなので、今やろうとしていることで使用するのは難しいなと感じました・・・ あと書くのを忘れてしまっていましたが、実はとびとびでデータを選択する可能性もあり、使用する人は選択後ボタン一発(か二発)程度で印刷まで行ける手順にしたかったのです・・・(申し訳ありません。。) ですがこのやり方、他でも色々と使えそうなので参考にさせて頂きます! ありがとうございました。
お礼
回答ありがとうございます。 ソースコードまで載せて頂いてありがとうございます。 試してみました。 ですが、データ量が多く選択が大変でした。。。 やはりVBAをいじるしかないと覚悟し、参考にしながらも セルを選択してそれだけ印刷といった形のものを組んでみました↓ ----------- Sub PrintStart() Dim countItem As Integer Dim countLoop As Integer Dim r As Range Set r = Selection countItem = r.count '枚数を算出 If countItem < 1 Then countLoop = 0 ElseIf (countItem Mod 30) = 0 Then countLoop = countItem / 30 Else countLoop = countItem / 30 + 1 End If 'データの挿入と印刷 If countLoop > 0 Then Dim ans As Long ans = MsgBox(countLoop & "枚印刷します。" & newLine & "宜しいですか?", vbOKCancel, "確認") If ans = vbCancel Then GoTo ref End If Dim countRow As Integer countRow = 0 '選択物を一個ずつ挿入しながら印刷 For Each rItem In r Dim tmpR As Range Set tmpR = ThisWorkbook.Worksheets("シートA").Range("A" & (countRow + 3)) countRow = (countRow + 1) tmpR.Value = rItem.Text If ((countRow Mod 30) = 0) Then Dim s As Worksheet Set s = ThisWorkbook.Worksheets("シートA") 'テスト用にプレビュー s.PrintPreview ' s.PrintOut '初期化 For i = 0 To 30 ThisWorkbook.Worksheets("シートA").Range("A" & (i + 3)).Value = "" Next i countRow = 0 End If Next MsgBox ("印刷しました") Else MsgBox ("選択してください") End If ref: End Sub ----------- 印刷処理のあたりは、細かい部分を少し改良する必要がありそうですが、このような形でさっと選択してさっと印刷できるようになりました。 mar00さんのコードを見ていて、まだ理解しきれないところがあるので これを機会にVBAをきちんと勉強しようと思います。 何だか自己完結のような結果になってしまい申し訳ありません; 皆さんの回答で色々な可能性が見えてきてとても勉強になりました。 ありがとうございました。