住所録に分類をつけて、その分類毎に別のシートへコピー又は、移動を自動的にさせたいのですが、なにか良い方法がありましたら教えて下さい。まだ初心者ですが、エクセルVBAでも構いません。宜しくお願い致します。

例) 氏名 ・・ 会社名 ・・役職 ・・住所 ・・・ 分類
○○○○ ・ -なし- ・ なし ・ あああああ ・ 1 → シート2へ
×××× ・ いいいい ・ 社長 ・ えええええ ・ 2 → シート3へ
-な し- ・ ええええ ・ なし ・ おおおおお ・ 3 → シート4へ

※分割後、別シートのハガキフォームへリンクするしくみを作成中です。
上記の様に、パターンがいろいろあって、その分類毎にハガキフォームを用意して、それぞれをリンクさせようとしています。リンクの方法は、HLOOKUPを使用しています。
フォームへの宛名表示は、VBAでレコードNO指定のセル+1のプログラムを組み、これを、ボタンにマクロを登録して次のデータへ進む様に作成しています。
住所録は、登録するデータが多い為、入力の楽なエクセルで一覧(1シート)にしています。

市販のソフトやフリーソフトでは、なかなか対応出来るのがなく、ワードの差込印刷も試しましたが、1枚づつの調整が面倒でしたので、簡単なものを作成しようと思い頑張っていますが、今のところ、これしか思い付かないのですが、もっと良い方法があったらそれも教えて下さい。

説明が、下手ですみません。宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (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さんもこれだけ考えていれば上達しているはずです。基本を身に付けること(本とかで)と考えることでどんどん上達していくはずです。多分もう少しで動きます。(私の方に間違いがなければ?)頑張って下さい。
    • good
    • 1
この回答へのお礼

nishi6さん!! うごきました!! ありがとうございます。感動の一瞬でした!

これから、いろんな機能等をつけて暑中見舞いに間に合うように完成させます。
HLOOLUPを使わずに、シートに飛ばせば!? と言うアドバイスを頂いたおかげでVBAの事も少しずつ分かってきました。なんだか自信がでてきました。やれば出来る! とはいっても、まだ理解できているわけではありません。もっと勉強していきたいと思います。本当にありがとうございました。

で・・・ソフトとして使い易いように、いろいろ考えているのですが、いきなり問題が出来ました。それは、各分類のシート(はがきのフォーム)を表示させて、1枚ずつ体裁を確認しながら印刷させる事も出来るようにしたい。ということです。
「(次の宛名→印刷)を繰り返していく」のように・・・

1回の質問でいろいろ聞くのも、なんだか申し訳なくなってきましたので、一旦締め切ります。この後すぐ、「 分類に分けられたシートの表示 」と言うタイトルで質問をさせていただきますので、宜しくお願い致します。

お礼日時:2001/05/03 07:46

紛らわしい表現を使ったかもしれません。

すいませんでした。「+」を使って・・・とういのは、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'シート番号を求める」 のところの行に網掛けが出ます。なぜでしょうか?

やっぱり、初心者では無理ですか? 何度もお尋ねして申し訳ございませんが、もし、初心者でも出来る範囲でしたら、もう少し詳しく教えていただけませんでしょうか? 私も、もっと勉強してみますので、宜しくお願い致します。

補足日時:2001/05/01 16:09
    • good
    • 1

>よろしかったら送り込みの方法を教えていただけませんでしょうか?


しばらくお待ち下さい。

この回答への補足

承知致しました。待ちます。
とりあえず、私もいろいろ試してみます。試してはいますが、今のところエラーばかりで、全く前に進んでいません。宜しくお願い致します。

補足日時:2001/04/27 18:03
    • good
    • 0

>移動を自動的にさせたいのですが


に対して、下記の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に関して、初心者なものですみません!よろしかったら送り込みの方法を教えていただけませんでしょうか?よろしくお願い致します。

補足日時:2001/04/25 18:17
    • good
    • 0

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歩下がり、ってかんじです。とりあえず完成させたいので頑張ります。なにかヒントがあったらまたお願いします。

補足日時:2001/04/25 18:36
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルの1シートを項目別に別シートへ分ける方法

エクセル2010で1シートのデータを項目別に別シートへ自動的に分割する方法で困っています。
検索するとマクロを使うと書いていますが、マクロはほとんど使ったことが無いのもあって、わかりませんでした。

シート1
A列(日付8ケタ+商品番号6ケタ) B列(売上額)
20130515000004           300
20130515000006           100
20130518000004           300
20130519000001           500
20130519000004           300
・・・                   ・・・
をA列の日付部分上8ケタを使って日別にシートを分け、
シート名をuriage20130515(uriageと日付8ケタ)という名前にしシート名+CSV形式で保存したいです。

シート2 シート名:uriage20130515
A列         B列
20130515000004 300
20130515000006 100

シート3 シート名:uriage20130518
A列         B列
20130518000004 300

シート4 シート名:uriage20130519
A列         B列
20130519000001 500
20130519000004 300

このように自動で別シートに分割した上で、シート名CSV形式で保存まで自動でできるとありがたいです。

自動化できるならシートを分割するマクロ、シート名でCSV保存するマクロが一つのマクロになっていても、分かれていてもOKです。

このようなことはできますか?

よろしくお願いします。

エクセル2010で1シートのデータを項目別に別シートへ自動的に分割する方法で困っています。
検索するとマクロを使うと書いていますが、マクロはほとんど使ったことが無いのもあって、わかりませんでした。

シート1
A列(日付8ケタ+商品番号6ケタ) B列(売上額)
20130515000004           300
20130515000006           100
20130518000004           300
20130519000001           500
20130519000004           300
・・・           ...続きを読む

Aベストアンサー

手順:
元データのブックを一度保存して開き直す
ALT+F11を押す
現れた画面で挿入メニューから標準モジュールを挿入する
現れたシートに下記をコピー貼り付ける

sub macro1()
 dim myPath as string
 dim myFile as string
 dim h as range
 dim s as string
 dim w as worksheet

 mypath = thisworkbook.path & "\"
 on error resume next
 kill mypath & "*.csv"
 application.displayalerts = false
 for each w in worksheets
  if w.name <> activesheet.name then w.delete
 next
 application.displayalerts = true
 on error goto errhandle

 for each h in range("A1:A" & range("A65536").end(xlup).row)
 if isnumeric(h.value) then
  s = left(h.value, 8)

 ’CSVに書き出し
  open mypath & "uriage" & s & ".csv" for append as #1
  print #1, h.value & "," & h.offset(0,1).value
  close #1

 ’シートに書き出し
  h.entirerow.copy worksheets(s).range("A65536").end(xlup).offset(1)

 end if
 next

 for each w in worksheets
  w.columns("A:B").autofit
 next
 exit sub

errhandle:
 worksheets.add after:=worksheets(worksheets.count)
 activesheet.name = s
 range("A1:B1") = array("date", "value")
 resume
end sub


ファイルメニューから終了してエクセルに戻る
ALT+F8を押しマクロを実行すると,CSVを書き出す。



#「CSVを書き出す」のが目的で「別シートに振り分ける」こと自体に目的はないと思いましたが,まぁご相談なのでシートに書き出しも追加しました。。。と思って書き足してったら無駄に長いマクロになっちゃいました。あんまりイミなかったです。

手順:
元データのブックを一度保存して開き直す
ALT+F11を押す
現れた画面で挿入メニューから標準モジュールを挿入する
現れたシートに下記をコピー貼り付ける

sub macro1()
 dim myPath as string
 dim myFile as string
 dim h as range
 dim s as string
 dim w as worksheet

 mypath = thisworkbook.path & "\"
 on error resume next
 kill mypath & "*.csv"
 application.displayalerts = false
 for each w in worksheets
  if w.name <> activesheet.name then w.delete
 next
 a...続きを読む

Qエクセル入力で項目別にシートに振り分ける方法を教えてください!

エクセルでの入力の時に
シート1では全ての営業所をひとまとめにして入力
シート2以降では営業所別にシートに振り分ける方法がわかりません。

シート1(入力するシート)
1 営業所名  支出金額  項目
2 群馬支部  11980  雑費
3 長野支部  12080  交通費
4 群馬支部  19800  接待交際費
5 新潟支部  19800  接待交際費

シート2(群馬支部)
1 営業所名 支出金額 項目
2 群馬支部 11980 雑費
4 群馬支部 19800 接待交際費

入力する場所はシート1のみで
シート2、3は営業部ごとの項目になっていて
シート1に入力すると自動で各シートに
振り分けられるようにしたいのです。

これを解決できる方法とは、どのような方法があり
そしてどうやれば出来るのでしょうか?

お時間あるときにご返答頂けると嬉しいです。
どうぞよろしくお願い致します。

Aベストアンサー

関数のみで行う場合です。

シート1(入力するシート)
 A  B       C       D
1 No. 営業所名  支出金額  項目
2 1 群馬支部   11980    雑費
3 2 長野支部   12080    交通費
4 3 群馬支部   19800    接待交際費
5 4 新潟支部   19800    接待交際費

VLOOKUP関数で処理するのでA列にNo.を入れてください。
ちなみにA2以降のA列に
  =ROW()-MATCH("No.",A:A,0)
と入れると並べ替えをしても行番号が変わりません。

シート2(群馬支部)
  A B        C      D       E
1   営業所名 データ数 総データ数
2   群馬支部   2      4
3 
4                           行番号
5 No. 営業所名 支出金額 項目       0
6  1  群馬支部  11980   雑費       1
7  2  群馬支部  19800   接待交際費  3
8  3                          #N/A

各セルに次の関数を入れます。
B2:営業所名
   ここをリスト化すると1枚のシートで全営業所が計算できます。
C2:=COUNTIF(Sheet1!B:B,A2)
   群馬支部のデータ数を求める
D2:=MAX(Sheet1!A:A) or =COUNTA(Sheet1!B:B)-1
   総データ数を求める
D5:0
D6:=MATCH($A$2,INDIRECT("Sheet1!$B$"&TEXT(E5+2,"0")&":B"&TEXT($C$2+1,"0")),0)+E5
   非常に面倒な式ですが、シート1における営業所名の出現行を
   MATCH関数で出しています。単純に組むと一番始めしか出て来な
   いので次の行では前行で見つけたシート1での出現行の次から
   検査する必要があります。
   そのためINDIRECT関数で可変する範囲を設定しています。
A6:連番(シート1と同じ)
B6:=IF(ISERROR($E6),"",VLOOKUP($E6,Sheet1!$A:$D,2,FALSE))
   VLOOKUP関数で必要データを取り出します。
   データがなくなるとE列の行番号がエラーになるので、そこは
   表示しない(空白)ためのif文を加えてあります。
   後は必要行コピーすれば完成です。

 

関数のみで行う場合です。

シート1(入力するシート)
 A  B       C       D
1 No. 営業所名  支出金額  項目
2 1 群馬支部   11980    雑費
3 2 長野支部   12080    交通費
4 3 群馬支部   19800    接待交際費
5 4 新潟支部   19800    接待交際費

VLOOKUP関数で処理するのでA列にNo.を入れてください。
ちなみにA2以降のA列に
  =ROW()-MATCH("No.",A:A,0)
と入れると並べ替えをしても行番号が変わりません。

シート2(...続きを読む

Qエクセルで打ち込んだ数字を自動で別シートに表示したい

エクセルでセルに打ち込んだ数字を自動で別シートに表示できる方法があれば、教えてください。

例えば、シート1のC1に5を打ち込んだら、シート2のD2にシート1で打ち込んだ5が自動で表示される。

また1列すべてを自動で表示させる場合、一つのセルの時と違いがありましたら教えてください。よろしくお願いします。

Aベストアンサー

こんばんは。
入力したセルの値を合計とかでなくて、
純粋に別のシートに自動的に表示したいのであれば、
以下の方法があります。

1.1つのセルだけの場合
例)シート1のC1に5を打ち込んだら、
  シート2のD2にシート1で打ち込んだ5が自動で表示される

⇒シート2のD2のセルをアクティブにして「=」を入力
 した後、シート1のC1をクリックする。
 そうするとD2のセルに「=Sheet1!C1」と表示され、値が自動的に
 表示されるようになります。

2.1列全てコピーしたい場合。
  コピー&リンク貼り付けを使うと便利です。

例)例)シート1のC1~C5に何かを入力したら、
  シート2のD2~D7にシート1で打ち込んだものが自動で表示される

  シート1にあるコピー元のセルを範囲選択して、
  シート2のD2の上で「右クリック」⇒「形式を選択して貼り付け」
  をクリックします。

  そして出てきた小さな画面の左下にある「リンク貼り付け」という
  ボタンをクリックすると完成です。
  試してみてください。。

  念のためにリンク貼り付けを図解しているURLを載せておきます。
  参考にしてみてくださいね。。
  http://www.geocities.jp/office_inoue/excel/eq21.htm

こんばんは。
入力したセルの値を合計とかでなくて、
純粋に別のシートに自動的に表示したいのであれば、
以下の方法があります。

1.1つのセルだけの場合
例)シート1のC1に5を打ち込んだら、
  シート2のD2にシート1で打ち込んだ5が自動で表示される

⇒シート2のD2のセルをアクティブにして「=」を入力
 した後、シート1のC1をクリックする。
 そうするとD2のセルに「=Sheet1!C1」と表示され、値が自動的に
 表示されるようになります。

2.1列全てコピーしたい場合。
  コ...続きを読む

Qエクセルでキーワードによるデータ分類をしたい

実現したいのは、エクセルのシート1にあるデータを分類し、そのデータの横にキーワードを表示(明記)。

・キーワードはシート2にある単語を使用することが決まっている

キーワードは大中小項目に分かれていて、イメージ/例としては下記の通り

大項目(3つ)
・野菜 
・果物 
・肉  

中項目(30ぐらい)
・パプリカ、ピーマン、じゃがいも、にんじん、キャベツ
・バナナ、りんご、みかん、
・豚、牛、鶏 etc.

小項目(100ぐらい)
・黄、赤、オレンジ、緑...
・甘い、すっぱい、甘酸っぱい...
・肩、胸、挽き、バラ...

・シート1には様々なデータがあるのですが、それがシート2のキーワードのどれと関連しているのかが知りたく、まずは、大項目でデータを分類し、その大項目に関連する中項目に分類し、更に関連する小項目に分類したい

・最終的には全項目見えても、小項目だけでも構わない

このような場合、どのような関数?VB?を使用すれば
簡単にキーワードを表示・選択して記入していけるでしょうか。
お知恵を拝借したく宜しくお願いします。
何かよいHPでもあれば併せて教えてください。

実現したいのは、エクセルのシート1にあるデータを分類し、そのデータの横にキーワードを表示(明記)。

・キーワードはシート2にある単語を使用することが決まっている

キーワードは大中小項目に分かれていて、イメージ/例としては下記の通り

大項目(3つ)
・野菜 
・果物 
・肉  

中項目(30ぐらい)
・パプリカ、ピーマン、じゃがいも、にんじん、キャベツ
・バナナ、りんご、みかん、
・豚、牛、鶏 etc.

小項目(100ぐらい)
・黄、赤、オレンジ、緑...
・甘い、すっぱい、甘酸っ...続きを読む

Aベストアンサー

選択なら「データ」「入力規則」で入力値の種類を「リスト」にすれば簡単です。
例の場合大項目と中項目、大項目と小項目は区分けがわかりますが
中項目と小項目では1対1にはなりませんよね。
大中・大小でいいなら下記の方法が使えます。
http://www2.odn.ne.jp/excel/
入力規則の5.縦横可変範囲の名前定義でリスト

参考URL:http://www2.odn.ne.jp/excel/

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

Qエクセルで複数の条件を抽出し自動的に別シートに反映する方法を教えてください。

こんばんは。教えてください。

元データ(sheet1)を更新するたび
2つの条件にあったデータを
別シートに自動的に抽出したいので
適した関数がありましたら教えてください。



◇シート1◇ ※元データ
 A      B     C     D     F
1 氏名 役職 部署 年齢 移動時期     
2 山田 社員 開発 45  未調整
3 田中 社員 人事 42  4/1~
4 鈴木 派遣 企画 30  
5 高橋 役員 人事 50  未調整
6 坂野 社員 企画 33  未調整  
7 井上 派遣 企画 29  未調整

◇シート2◇ ※部署が人事で移動時期が未調整の人のみ抽出
 A      B     C     D    F
1 氏名 役職 部署 年齢 移動時期 
2 高橋 役員 人事 50  未調整


補足
・元データ(シート1)はこれからもデータを追加するので
 その度、シート2、シート3もそれぞれ自動で反映されるようにした いです。

・マクロ、VBAは知識がないので
 関数で作成したいです。

・できるだけエラー(#N/Aなど)表示されないようにしたいです。

説明が不十分で伝わりにくいかと思いますが
よろしくお願いします。

こんばんは。教えてください。

元データ(sheet1)を更新するたび
2つの条件にあったデータを
別シートに自動的に抽出したいので
適した関数がありましたら教えてください。



◇シート1◇ ※元データ
 A      B     C     D     F
1 氏名 役職 部署 年齢 移動時期     
2 山田 社員 開発 45  未調整
3 田中 社員 人事 42  4/1~
4 鈴木 派遣 企画 30  
5 高橋 役員 人事 50  未調整
6 坂野 社員 企画 33  未調整  
7 ...続きを読む

Aベストアンサー

> 部署を"人事"と"企画"の両方で抽出する条件を追加する

おはようございます、merlionXXです。
Operator:=xlOr, Criteria2:="=企画" と、OR条件で"企画"を加えれば可能です。
一応、各コードの動きに解説もつけておきました。(解説は’でコメントアウトしてますのでこのまま貼り付けてもOKです。)

Private Sub Worksheet_Activate() 'このシートがアクティブになったら自動実行
With Sheets("Sheet1") 'Sheet1対して
.AutoFilterMode = False 'オートフィルタ終了(あればエラーになるため)
.Range("A1:E1").AutoFilter 'A1:E1にオートフィルタ設定
.Range("A1:E1").AutoFilter Field:=3, Criteria1:="=人事", Operator:=xlOr, Criteria2:="=企画" '左から3つ目のフィルタを"人事"と"企画"のOR条件で抽出
.Range("A1:E1").AutoFilter Field:=5, Criteria1:="未調整" '左から5つ目のフィルタを"未調整"で抽出
.Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Range("A1") 'A1から最終セル範囲の可視セルをこのシートのA1以降に貼り付け
.AutoFilterMode = False 'オートフィルタ終了
End With 'Sheet1に対する記述おわり
End Sub

> 部署を"人事"と"企画"の両方で抽出する条件を追加する

おはようございます、merlionXXです。
Operator:=xlOr, Criteria2:="=企画" と、OR条件で"企画"を加えれば可能です。
一応、各コードの動きに解説もつけておきました。(解説は’でコメントアウトしてますのでこのまま貼り付けてもOKです。)

Private Sub Worksheet_Activate() 'このシートがアクティブになったら自動実行
With Sheets("Sheet1") 'Sheet1対して
.AutoFilterMode = False 'オートフィルタ終了(あればエラーになるた...続きを読む

Qエクセルの1シートの内容を複数のシートに分割したい。

前任者から引き継いだエクセルのファイルを見やすくしたいと思っています。

1ページにつき1つの表が作られているのですが、一枚のシートのページ数が膨大で、とても見にくいのです。ページ毎に(一つの表毎に)違うシートにしたいのですが、地道にコピー&ペーストをしなければならないでしょうか。

一発でバチッとページ毎にシートにできる方法はありますか?

windowsXP, Excel 2002を使用しています。

Aベストアンサー

失礼しました。間違いがありました。

再度以下のモジュールで試してください。
ちなみに、 入力データがカラム120まであって、これを30カラムずつ分解するとしたら、
wCOLUMN = 30 '1ページのカラム列数
wSHEET = 4 '1ページのカラム分解数
になります。すみません。

Sub PAGE_分割()
Dim sLine As Integer
Dim eLine As Integer
Dim wPAGE As Integer
Dim wLINE As Integer
Dim wCOLUMN As Integer
Dim wSHEET As Integer
Dim sCOL As Integer
Dim eCOL As Integer
Dim DataSht As String
Dim wSHEETCnt As Integer
'
wSHEETCnt = 0
wPAGE = 10 'ページ数
wLINE = 50 '1ページの行数
wCOLUMN = 30 '1ページのカラム列数
wSHEET = 4 '1ページのカラム分解数
DataSht = "DATA" 'データのシート名
'ROW
For wRow = 1 To wPAGE
If wRow = 1 Then
sLine = 1
sCOL = 1
Else
sLine = eLine + 1
sCOL = eCOL + 1
End If
eLine = wRow * wLINE
'COLUMN
For wCOL = 1 To wSHEET
If wCOL = 1 Then
sCOL = 1
Else
sCOL = eCOL + 1
End If
eCOL = wCOL * wCOLUMN

Sheets.Add after:=Sheets(Sheets.Count) 'シートを生成
wSHEETCnt = wSHEETCnt + 1
ActiveSheet.Name = "PAGE" & wSHEETCnt 'シート名を付ける
'ページ単位でデータをコピー
Sheets(DataSht).Range(Sheets(DataSht).Cells(sLine, sCOL), Sheets(DataSht).Cells(eLine, eCOL)).Copy _
Destination:=Sheets("PAGE" & wSHEETCnt).Range("A1")
Next
Next
End Sub

失礼しました。間違いがありました。

再度以下のモジュールで試してください。
ちなみに、 入力データがカラム120まであって、これを30カラムずつ分解するとしたら、
wCOLUMN = 30 '1ページのカラム列数
wSHEET = 4 '1ページのカラム分解数
になります。すみません。

Sub PAGE_分割()
Dim sLine As Integer
Dim eLine As Integer
Dim wPAGE As Integer
Dim wLINE As Integer
Dim wCOLUMN As Integer
Dim wSHEET As Integer
Dim sCOL As Integer
Dim eCOL As Integer
Dim DataSht As String
...続きを読む

Qエクセルのグループ名ごとに別シートを作成するマクロについて

普段VBAを全く使わない初心者で申し訳ありません。
年度初めに作成したいものがあります。

下のシートのようなものがあり、これをグループ「ア」だけで名前と住所が入ったシート、「イ」だけで名前と住所が入ったシートを新規作成していくプログラムを教えていただきたいです。
なお、グループ名は10グループ程になる予定です。

よろしくお願いいたします。

Aベストアンサー

こんな感じでどうでしょう。元データのシート名は、Sheet1としています。

Sub sample()
Dim ws As Worksheet
Dim I As Long
'元シートをコピーし作業用シートを作成。グループでソート&重複を削除する。
Sheets("Sheet1").Copy After:=Sheets(1)
Set ws = ActiveSheet
With ws.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("C:C"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A:C")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ws.Range("A:C").RemoveDuplicates Columns:=3, Header:=xlYes
'グループ毎のシート生成。
For I = 2 To ws.UsedRange.Rows.Count
If ws.Cells(I, 3) = "" Then Exit For
Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)
With ActiveSheet
.Range("A:C").AutoFilter Field:=3, Criteria1:="<>" & ws.Cells(I, 3), _
Operator:=xlAnd
.Rows("2:" & .UsedRange.Rows.Count).Delete Shift:=xlUp
.Range("A:C").AutoFilter

.Name = ws.Cells(I, 3)
End With
Next I
'作業用シートの削除。
Application.DisplayAlerts = False
ws.Delete
Application.DisplayAlerts = True
End Sub

こんな感じでどうでしょう。元データのシート名は、Sheet1としています。

Sub sample()
Dim ws As Worksheet
Dim I As Long
'元シートをコピーし作業用シートを作成。グループでソート&重複を削除する。
Sheets("Sheet1").Copy After:=Sheets(1)
Set ws = ActiveSheet
With ws.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("C:C"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A:C")
...続きを読む

QExcelのファイルからシート毎にファイルを作成する方法

複数のシートで構成されているひとつのExcelファイルからシートごとに分割してファイルを作成(保存したいです)

具体的には、

ファイル名 file.xls
 含まれているシート Sheet1 Sheet2 Sheet3

このfile.xlsから自動でSheet1.xls Sheet2.xls Sheet3.xlsという
ファイルを作成してそれぞれのシートだけを保存する方法があれば教えてください。

標準の機能でなければ、フリーソフトなど別のソフトを使った方法でもかまいません。

Aベストアンサー

>シートの数が多いので、自動化マクロを作る方法を考えます。
手作業でするのが面倒と思えば、VBAでやらせるほかありません。
ーーー
VBAの経験はありますか。マクロの記録の回答に対し、反応が鈍いところ、質問も丸投げ的なことからも、経験が少ないのでは。多くの経験が必要です。
参考までに、私としては苦心したコードを挙げておきますが、判ってもらえるのかどうか。
Sub test02()
Dim wb1 As Workbook
Set wb1 = ActiveWorkbook
s = wb1.Sheets.Count
MsgBox s & "枚"
For i = 1 To s
Workbooks.Add.SaveAs Filename:="AD" & i & ".xls"
wb1.Worksheets(i).Copy before:=Workbooks("AD" & i & ".xls").Worksheets(1)
Workbooks("AD" & i & ".xls").Worksheets(1).Name = "ADS" & i
Next i
End Sub
ーー
質問のファイル名 file.xlsに当たるブックの標準モジュールに上記を貼り付けます。
上記では新しく出来たブックの名前は"AD" & i & ".xls"で規定されます。適当に変えてください。
新しく出来たブックのシート名は上記では、Name = "ADS" & i
で規定されます。シートが皆同じでよければ定数だけにしてください。
以上は、シートのコピーというエクセルの良く使う機能を使ったもの(操作をVBA化したもの)です。他にもやり方があると思いますが、一番コードが短いかなと思う。

>シートの数が多いので、自動化マクロを作る方法を考えます。
手作業でするのが面倒と思えば、VBAでやらせるほかありません。
ーーー
VBAの経験はありますか。マクロの記録の回答に対し、反応が鈍いところ、質問も丸投げ的なことからも、経験が少ないのでは。多くの経験が必要です。
参考までに、私としては苦心したコードを挙げておきますが、判ってもらえるのかどうか。
Sub test02()
Dim wb1 As Workbook
Set wb1 = ActiveWorkbook
s = wb1.Sheets.Count
MsgBox s & "枚"
For i = 1 To s
Work...続きを読む

QExcelで入力したデータを他のシートにも反映したいです

Excelでシートに入力したデータだけを他のシートに表示させたいです・・・。なにぶん初心者なもので簡単な方法があればよいのですが・・。

シート1
 Å列    B列 C列    
キャベツ     玉   1
りんご     個   2
オレンジ    個
バナナ     本   10
きゅうり    本
ニラ     Kg  20.5

シート2
 Å列    B列 C列
キャベツ     玉  1
りんご     個  2
バナナ     本  10
ニラ     Kg  20.5

↑のように。シート1に入力したデータを入力した行ごと表示させたいです。

Aベストアンサー

》 なにぶん初心者なもので…

関数を一切使用しない方法(フィルタオプションの設定)をご紹介します。

Sheet1
1   A    B   C
1 品名   単位 数量
2 キャベツ 玉    1
3 りんご  個    2
4 オレンジ 個
5 バナナ  本   10
6 きゅうり 本
7 ニラ   Kg  20.5
8

添付図は[フィルタオプションの設定]を開始する Sheet2 を示しています。
([データ]→[フィルタ]→[フィルタオプションの設定]の手順を実行します)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング