住所録に分類をつけて、その分類毎に別のシートへコピー又は、移動を自動的にさせたいのですが、なにか良い方法がありましたら教えて下さい。まだ初心者ですが、エクセルVBAでも構いません。宜しくお願い致します。
例) 氏名 ・・ 会社名 ・・役職 ・・住所 ・・・ 分類
○○○○ ・ -なし- ・ なし ・ あああああ ・ 1 → シート2へ
×××× ・ いいいい ・ 社長 ・ えええええ ・ 2 → シート3へ
-な し- ・ ええええ ・ なし ・ おおおおお ・ 3 → シート4へ
※分割後、別シートのハガキフォームへリンクするしくみを作成中です。
上記の様に、パターンがいろいろあって、その分類毎にハガキフォームを用意して、それぞれをリンクさせようとしています。リンクの方法は、HLOOKUPを使用しています。
フォームへの宛名表示は、VBAでレコードNO指定のセル+1のプログラムを組み、これを、ボタンにマクロを登録して次のデータへ進む様に作成しています。
住所録は、登録するデータが多い為、入力の楽なエクセルで一覧(1シート)にしています。
市販のソフトやフリーソフトでは、なかなか対応出来るのがなく、ワードの差込印刷も試しましたが、1枚づつの調整が面倒でしたので、簡単なものを作成しようと思い頑張っていますが、今のところ、これしか思い付かないのですが、もっと良い方法があったらそれも教えて下さい。
説明が、下手ですみません。宜しくお願い致します。
No.5ベストアンサー
- 回答日時:
できるまで頑張りましょう。
●まず、分類が10まであったら、シートはSheet11まで必要です。(シート数は分類数+1です)
●それに、Sheet1の1行目は表題で、空白セルはなく連続して入力されていて、そのどこかに「分類」という表題があることを前提にしています。
●マクロを動かして、開始、終了入力には半角数値で入力してください。
●標準モジュールを挿入されていれば、先頭行に「Option Explicit」と入力して動かしてみて下さい。スペルミスがあるかもしれません。
いままでに作成したシートをコピーして別名で保存して下さい。そのコピーしたシートを使用しましょう。
1.VBE画面で挿入→標準モジュールで標準モジュールを挿入します。既に標準モジュールがあって入力されていれば削除かコメント行にして下さい。
※コメント行にするには、表示→ツールバー→編集をチェック。出てきたツールバーの「手」の右のアイコンがコメントブロックです。既に入力した行を選んで(反転させて)コメントブロックのアイコンを押します。行頭に「'」が付いてコメントになります。
2.標準モジュールの先頭行に「Option Explicit」がなかったら「Option Explicit」を入力します。
3.ANO.#4のマクロ部分を選んでコピーして下さい。
Public Sub から End Sub までです。
4.これを標準モジュールに貼り付けます。
※文章から判断して、マクロを入力されたと思いますので、スペルミスをなくすために貼り付けてください。マクロの行を見て、「xxx」と「End xxx」、「For xxxx」と「Next」に挟まれた行を選択してTABキーを押していくと見やすくなります。(インデントをつける)okwebからメールが届いていれば、そちらを貼り付ければ見やすくなると思います。
5.Excelシートに戻って、ツール→マクロ→マクロで「BunruiSheetPrint」を選んで実行します。
6.開始行と終了行を半角数値で入力してください。
うまくいきますように。
うまく動いたら
Dim rw → Dim rw As Long '行カウンタ
Dim br → Dim br As Integer '各データの分類
Dim ws → Dim ws As Worksheet '印刷をするシート
に修正して下さい。今のままでも動きますが、ここはこう書くべきでした。
>やっぱり、初心者では無理ですか?
そんなことはないと思います。最初はみんな初心者ですし。ruru-Kさんもこれだけ考えていれば上達しているはずです。基本を身に付けること(本とかで)と考えることでどんどん上達していくはずです。多分もう少しで動きます。(私の方に間違いがなければ?)頑張って下さい。
nishi6さん!! うごきました!! ありがとうございます。感動の一瞬でした!
これから、いろんな機能等をつけて暑中見舞いに間に合うように完成させます。
HLOOLUPを使わずに、シートに飛ばせば!? と言うアドバイスを頂いたおかげでVBAの事も少しずつ分かってきました。なんだか自信がでてきました。やれば出来る! とはいっても、まだ理解できているわけではありません。もっと勉強していきたいと思います。本当にありがとうございました。
で・・・ソフトとして使い易いように、いろいろ考えているのですが、いきなり問題が出来ました。それは、各分類のシート(はがきのフォーム)を表示させて、1枚ずつ体裁を確認しながら印刷させる事も出来るようにしたい。ということです。
「(次の宛名→印刷)を繰り返していく」のように・・・
1回の質問でいろいろ聞くのも、なんだか申し訳なくなってきましたので、一旦締め切ります。この後すぐ、「 分類に分けられたシートの表示 」と言うタイトルで質問をさせていただきますので、宜しくお願い致します。
No.4
- 回答日時:
紛らわしい表現を使ったかもしれません。
すいませんでした。「+」を使って・・・とういのは、1行目にあるデータをレイアウトの中に配置するだけという意味で使いました。私自身、別のセルにデータを入れる場合、「=」を余り使わないのでこういう表現をしてしまいました。(F10にA1のデータを入れる場合、F10には+A1としています。)さて、ご質問の件ですが、下記VBAを作ってみました。前提としては、各分類のシートで印刷ができれば動くと思います。今は画面表示PrintPreviewにしてあります。PrintOutにすれば印刷できるはずです。簡単な範囲指定・入力チェックも入れておきました。処理自体はだいぶ単純化されたと思いますがどうでしょうか?何か不具合が合ったら補足してください。
Public Sub BunruiSheetPrint()
Dim ws1 As Worksheet 'Sheet1
Set ws1 = Worksheets("Sheet1")
Dim BunruiCol As Integer '分類が入力された列(A列からのカウント)
Dim columnMax As Integer '列数(データ項目数)
Dim cl As Integer '列データ用カウンタ
'分類の列位置、データ列数を調べる
With ws1
With .Range("A1")
While .Offset(0, cl) <> "" And BunruiCol = 0
If .Offset(0, cl) = "分類" Then
BunruiCol = cl
End If
cl = cl + 1
Wend
End With
columnMax = .UsedRange.Columns.Count
End With
Dim dmy As String '入力用ワーク文字
Dim startRow As Long '開始行
Dim lastRow As Long '最終行
'印刷開始から最終行を入力(このあたりは処理例です。)
dmy = InputBox("印刷開始行を入力します")
If dmy <> "" Then startRow = Val(dmy)
dmy = InputBox("印刷最終行を入力します")
If dmy <> "" Then lastRow = Val(dmy)
'開始<=最終 ? (これもチェック例です)
If Not (startRow <= lastRow) Then
MsgBox "エラー", vbOKOnly, "誤入力": Exit Sub
End If
'
'各シートに飛ばす(Sheet2から。Sheetは連番)
Dim rw '行カウンタ
Dim br '各データの分類
Dim ws '印刷をするシート
Application.ScreenUpdating = False 'シート表示を固定
With ws1.Range("A1")
For rw = startRow To lastRow '指定した範囲を印刷
br = .Offset(rw, BunruiCol) + 1 'シート番号を求める
Set ws = Worksheets("Sheet" & br) 'シートを決定
For cl = 0 To columnMax '1行分目的のシートに書く
ws.Range("A1").Offset(0, cl) = .Offset(rw, cl)
Next
ws.Activate
'PrintPreview を PrintOut に変えれば印刷を実行
ActiveSheet.PrintPreview
Next
End With
Application.ScreenUpdating = True 'シート表示の固定解除
ws1.Activate 'Sheet1を表示
End Sub
この回答への補足
nishi6さん、回答ありがとうございます。
すみません理解できません! とりあえず、VBAを打ち込んでみましたが、うまくいきません。エラーで、デバックをクリックすると 「br = .offset(rw,BunruiCol)+1'シート番号を求める」 のところの行に網掛けが出ます。なぜでしょうか?
やっぱり、初心者では無理ですか? 何度もお尋ねして申し訳ございませんが、もし、初心者でも出来る範囲でしたら、もう少し詳しく教えていただけませんでしょうか? 私も、もっと勉強してみますので、宜しくお願い致します。
No.3
- 回答日時:
>よろしかったら送り込みの方法を教えていただけませんでしょうか?
しばらくお待ち下さい。
この回答への補足
承知致しました。待ちます。
とりあえず、私もいろいろ試してみます。試してはいますが、今のところエラーばかりで、全く前に進んでいません。宜しくお願い致します。
No.2
- 回答日時:
>移動を自動的にさせたいのですが
に対して、下記のVBAを書いてみました。参考にして下さい。詳細が分からないので条件があります。
1.データはSheet1にある
2.Sheet1の1行目は表題になっており(A1から)、全ての列に入力されていて、どこかに「分類」という表題がある。
3.「分類」列は全てのデータについて入力されていて1からシート数-1以下である。
注1)転記するシートには2行目から書いています。
注2)分類が増えたらシートを増やします。VBAは修正不要です。
注3)データの増減、修正がある場合、Sheet2以降はデータをクリアする必要があります。
(これがあるためこの方法には抵抗があります。初期化すればいいんですが)
Public Sub Sheet2Sheet()
Dim BunruiCol As Integer '分類が入力された列(A列からのカウント)
Dim columnMax As Integer '列数(データ項目数)
Dim rowMax As Integer '行数(データ数)
Dim cl, rw As Integer 'カウンタ
Dim wRw(255) As Integer '各シートで書いた行番号(2行目からスタート)
'分類の列位置、データ列数・行数を調べる
With Worksheets("Sheet1")
With .Range("A1")
While .Offset(0, cl) <> "" And BunruiCol = 0
If .Offset(0, cl) = "分類" Then
BunruiCol = cl
End If
cl = cl + 1
Wend
End With
columnMax = .UsedRange.Columns.Count
rowMax = .UsedRange.Rows.Count - 1
End With
'各シートに転記
Dim br '各データの分類
With Worksheets("Sheet1").Range("A1")
For rw = 1 To rowMax
br = .Offset(rw, BunruiCol) + 1
For cl = 0 To columnMax
Worksheets("Sheet" & br).Range("A1").Offset(wRw(br) + 1, cl) = .Offset(rw, cl)
Next
wRw(br) = wRw(br) + 1
Next
End With
End Sub
>もっと良い方法があったらそれも教えて下さい。
に対して、私なりの感想ですが(やるとしたらこうします)
(1)分類数に対応するハガキフォームを先に作ってしまいます。各シートは1分類としSheet2から作ります。1行目(A1から)にデータを適当に入力しておき、それを「+」を使ってレイアウトに編集していきます。肝心なのはここをいかにシンプルに作るか、分類が増えた場合も考え簡単に対応できるようにしておきます。
(2)できたハガキフォームの印刷範囲をシート単位で決定します。
(3)後は、上記VBAのように各シートに移動させるわけすが、該当シートに1件単位に書き込み(1行目に)→そのシートをアクティブに→印刷 を繰り返していきます。VBAは当然、シート数が増えても手を入れなくていい作りにします。(上記VBAもそうです)
(4)印刷時は全件印刷や指定印刷が必要でしょうからその機能を付加します。
ざっと書きましたが、印刷はExcelに任せ、1件を該当シートに送ってやれば、1シート1分類、1データとなりリンクもHLOOKUPも不要な気がします。
長々と書いてしまいました。がんばってください。
この回答への補足
大変参考になる回答をありがとうございます。
早速、試してみましたところ、うまくいきました。が・・・
ご意見いただきました通り、1件を該当するシートへ送る方法で進めたいと思います。
その内容について詳しく知りたいのですが、現在、ハガキのフォームはできました。ただ、1行目にデータを適当に入力しておき、「+」でレイアウトに編集?と言う部分が良く分かりませんでした。(とりあえずフォームは出来てますが・・・)ここまでは何とかうまくいってますが、そのフォームにそれぞれの該当データを、HLOOKUPを使用せずに送り込む作業をしているのですが、なかなかうまくいきません。私の単なる知識不足でしょうが・・・
VBAに関して、初心者なものですみません!よろしかったら送り込みの方法を教えていただけませんでしょうか?よろしくお願い致します。
No.1
- 回答日時:
ruru-kさんこんにちは。
見たところ、ずいぶんややこしいなぁと思いましたが、私も似たようなことをやっています(笑)。私の場合、各シートごとに色々なフォーマットを作ったら半端じゃないファイル容量になったので、データだけ1つのシートにまとめて、マクロで、値のみを各シートに貼り付けていくというものです。各シートには参照式や関数などがあって、値が貼り付けられると同時に、計算結果が表示される仕組みです。おおかた、同様の内容ではないでしょうか・・・。
さて、やはりVBAを使った方がよさそうです。そしてポイントになると思われるステートメントを2つを述べます。
まず、”分類”のフィールドに入力された数値をキーとして、各シートに配分されるようですが、"For ~ Next"ステートメントと、"Select Case ~ End Select"ステートメントを使ってはいかがでしょう。例えば列Eの値を1行目から順々に調べていくパターンだと・・・。
Sub test()
'---5列目の最下段を取得
n = Range(Cells(ActiveSheet.Rows.Count, 5).End(xlUp).Address).Row + 1
'---5列目の値ごとに処理を分岐
For i = 1 To n
Select Case Cells(i, 5).Value
Case 1: MsgBox "シート2へコピーするマクロ"
Case 2: MsgBox "シート3へコピーするマクロ"
Case 3: MsgBox "シート4へコピーするマクロ"
Case Else
End Select
Next i
End Sub
なんてコード例が考えられます。
ハンドラとして記入したMsgBoxの所には実際のマクロやマクロ名(サブルーチンの場合)を入れてください。"シート?へコピーするマクロ"なる部分は、自動記録なんかで作成できるでしょうし、CopyやPasteなどをキーワードにヘルプで調べてください。
この回答への補足
TTakさん ありがとうございます。
はやりややこしいことなんですね!VBAについて初心者なのでなかなか思うようにいきません。参考にさせていただきながら思考錯誤しています。少しずつですが分かってはきているのですが、1歩進んでは、3歩下がり、ってかんじです。とりあえず完成させたいので頑張ります。なにかヒントがあったらまたお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) シートが違う2枚のエクセルシートにある数値を別シートにコピーしたい(VBA?) 8 2022/03/31 12:24
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- Excel(エクセル) エクセルのマクロで複数シートを両面印刷するには? 2 2022/12/08 23:23
- Excel(エクセル) 【エクセル」 特定のセルで条件抽出した列を、別シートに上から詰めて表示したい。 8 2022/04/08 16:00
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 11:27
- Excel(エクセル) エクセル表作成についてお分かりになる方教えて下さい。 10項目程度のエクセルデーターを一件、一件、デ 9 2022/05/28 14:53
- Excel(エクセル) エクセル バーコード作成で他のシートを参照するには? 2 2023/05/03 16:57
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのVlookup関数の制限について
-
文字の色も参照 VLOOKUP
-
エクセルの保護で、列の表示や...
-
Excelでの並べ替えを全シートま...
-
Excel の複数シートの列幅を同...
-
Excel VBA ピボットテーブルに...
-
VBAで繰り返しコピーしながら下...
-
エクセル マクロ 標準モジュー...
-
【エクセル】1列のデータを交...
-
スプレッドシートでindexとIMPO...
-
エクセルで、チェックボックス...
-
エクセルのブック分割マクロを...
-
Excelのセルの色を変えた行(す...
-
オートフィルタ使用時にCOUNTIF...
-
エクセルの列の限界は255列以上...
-
【マクロ】あいうえお順のシー...
-
エクセルVBAで、ある文字を含ん...
-
エクセルの横に並んでいるもの...
-
ユーザーフォームのデータをそ...
-
【VBA】シート名と見出しが一致...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelのVlookup関数の制限について
-
文字の色も参照 VLOOKUP
-
エクセルの保護で、列の表示や...
-
Excel の複数シートの列幅を同...
-
Excelでの並べ替えを全シートま...
-
エクセル マクロ 標準モジュー...
-
VBAで繰り返しコピーしながら下...
-
エクセルの列の限界は255列以上...
-
【条件付き書式】countifsで複...
-
Excel VBA ピボットテーブルに...
-
エクセルで、チェックボックス...
-
SUMPRODUCTにて別シートのデー...
-
スプレッドシートでindexとIMPO...
-
VLOOKアップ関数の結果の...
-
【VBA】ピボットテーブルを既存...
-
【VBA】複数のシートの指定した...
-
Excelのセルの色を変えた行(す...
-
Excelに自動で行の増減をしたい...
-
エクセルで横並びの複数データ...
-
【エクセル】1列のデータを交...
おすすめ情報