- ベストアンサー
マクロを使っての一覧表作成
以下はネットからExelにペ-ストしたものです。約80件ぐらいあります。これを会社名、記事の内容、日付、出所先をマクロを使って表にしたいのですが、どなたか教えてください。 なお、AとBは等間隔でBと次のAも等間隔です。 A.○○、国内グループに、資金管理を一元化。 B.2003/07/01日経産業新聞 A.○○、資金を一元管理――国内グループにCMS。 B.2003/07/01日本経済新聞 地方経済面 A.○○、東南アジア、金融拠点を再編――機能、タイに集約。 B.2003/06/16日経金融新聞
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>1.会社名と記事名がA2のセルから始まってA7、A12と5行間隔です。 Sheet2のA1から抽出していくならA1に =INDIRECT("Sheet1!A"&(ROW()-1)*5+2) と入れ下にコピー Sheet2のA2から抽出していくならA2に =INDIRECT("Sheet1!A"&(ROW()-2)*5+2) と入れ下にコピーします。 >2.日付と出所先はA4のセルから始まってA9、A14と5行間隔です。 Sheet2のC1から抽出していくならC1に =INDIRECT("Sheet1!A"&(ROW()-1)*5+4) と入れ下にコピー Sheet2のC2から抽出していくならC2に =INDIRECT("Sheet1!A"&(ROW()-2)*5+4) と入れ下にコピーします。 しかし >会社名と記事名、日付と出所名の間には空白がありません。 とのことですが、読点(、)は入っているでしょうか。 例えばA1セルに ○○、国内グループに、資金管理を一元化。 と入っているなら =LEFT(A1,FIND("、",A1)-1) で「○○」を抽出し、 =MID(A1,FIND("、",A1)+1,1000) で「国内グループに、資金管理を一元化。」 を抽出できます。 「A1」のところに「INDIRECT("Sheet1!A"&(ROW()-2)*5+4)」などを代入すればいいです。 読点やカンマなどの区切りがなければ手作業という事になりますね。
その他の回答 (8)
- nihonjinn
- ベストアンサー率39% (79/200)
>手始めにこのとうりにやってみました。 >Sheet2のA1に#REF!が表示されました。 シート名が違うのではないですか。この数式では「Sheet1」ですがシート名を入れ替えてみてください。 関数について説明しておきます。 ROW() --その数式の行の番号を返します。 A1にある数式中にその関数があると1を返し、A2にある場合は2を返します。 INDIRECT --指定される文字列への参照を返します。 例えばA1に「"Sheet1!A"&(ROW()-1)*5+2」が入っているなら「Sheet1!A2」という文字列になるのですがそのままでは参照してくれないのでINDIRECT関数を使っているのです。 したがって「(ROW()-1)*5+2」のところなどを工夫すると一定の間隔のセルを参照することが出来るのですが、参照先のシート名だけは合わせておいてください。
VBAはセルに入力する関数ではありません。 メニューのツール→マクロ→Visual Basic Editorで起動された画面から プログラムを記述していくことになります。 VBA自体をご存じないのなら、やはりシート関数のほうがいいのかも。 私は関数はかなり苦手なので無理ですが。。。(^-^; お役に立てず、申し訳ないです。
お礼
どうもありがとうございます。 Visual Basic Editorを起動したら次の表示がでました。 日時入力 Macro ' マクロ記録日 : 2002/10/8 ユーザー名 : 株式会社 ○' ' Keyboard Shortcut: Ctrl+t ' ActiveCell.FormulaR1C1 = "=NOW()" Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False ' Range("A1").Select Selection.NumberFormatLocal = "yy/mm/dd hh:mm" End Sub マクロの公式をどの部分にすればよいのでしょうか
シート関数でいいなら#5さんの回答でいいと思います。 一度に抜き出す・・・の意味がよくわからないのですが シート関数であれば、そのセルに表示したい内容を取り出す関数を書くので 会社を出したいセル、日付を出したいセル・・・とそれぞれに関数が必要になります。 VBAで一括処理、と言う事であれば Cells(1, 10).Value = Left(Cells(7, 1), 10) Cells(1, 11).Value = Mid(Cells(7, 1), 11, InStr(Cells(7, 1).Value, " ") - 1) Cells(1, 12).Value = Mid(Cells(7, 1), InStr(Cells(7, 1).Value, " ") + 1) と書けば、同じシートのJ~L列の1行目に、日付、会社名、出所が出力されます。 質問本文では、日付と会社の間には空白がなく、 会社と出所の間には全角空白となっていますが、常にこうなっていますか? これが行によっては、どちらも半角空白が入っているとか、カンマ区切りになっている とかになると、処理がめんどくさくなる可能性がありますねぇ。。。 とりあえず、シート関数でやるかVBAでやるか決めてくださいね。(笑) 私は処理の内容的には、今後も継続して行うんじゃないかと思われるので VBAのほうが適しているのかな、と思いますが。
お礼
>VBAで一括処理、と言う事であれば Cells(1, 10).Value = Left(Cells(7, 1), 10) Cells(1, 11).Value = Mid(Cells(7, 1), 11, InStr(Cells(7, 1).Value, " ") - 1) Cells(1, 12).Value = Mid(Cells(7, 1), InStr(Cells(7, 1).Value, " ") + 1) これらはどのSheetのどのセルに打ち込めばいいのですか。 なお、会社名と記事名、日付と出所名の間には空白がありません。この場合でもVBAを利用可能でしょうか
- nihonjinn
- ベストアンサー率39% (79/200)
一定の間隔のセルにある内容を抜き出したいのですよね。 例えば内容AがSheet1のA1,A4,A7,A10--に入っているとするとSheet2のA1に =INDIRECT("Sheet1!A"&(ROW()-1)*3+1) と入れて下にコピーしてやるとSheet1のA1,A4,A7,A10--の内容を参照することが出来ます。 (ROW()-1)*3+1 のところを工夫してみてください。セルの場所や間隔がわかりませんのでお教えしてただければまた回答します
お礼
どうもです。 1.会社名と記事名がA2のセルから始まってA7、A12と5行間隔です。 2.日付と出所先はA4のセルから始まってA9、A14と5行間隔です。 なお、会社名と記事名及び日付と出所先は同じセルの中にあるので個別に抜きださないとダメですか。1度に抜き出す方法はないですか
補足
AとBどちらもSheet2のA1を利用するのですね。 >=INDIRECT("Sheet1!A"&(ROW()-1)*3+1) AとBはどのような式になるのですか?この場合ど行間が3つづつですよね。行間が5つの場合です。
- happypoint
- ベストアンサー率36% (521/1422)
#1です。 自分の回答に補足です。 #1のマクロは、指定した範囲に罫線をつけるという、いたって単純な内容です。 質問が「表にしたい」ということだったので、 早合点して主旨を間違えたようです。 申し訳ない。
お礼
ありがとうございました。
実際の行はわかりませんが、例えば 1行目に記事、2行目に日付、会社(?)が入っているのを 他のシートなどのA列に会社、B列に記事、C列に日付・・・というようにしたい と言うことではないのでしょうか?
お礼
そのとうりです。ただ、1行目に会社名と記事、2行目の日付と出所先はそれぞれ1つのセルの中ですから、会社名と記事などをそれぞれ1度に分けるのは難しくありませんか
- HAL007
- ベストアンサー率29% (1751/5869)
ニュース記事のDB化ですか? マクロが苦手なものでテキストエディターでを使い カンマ区切り型式のファイルへ変換してAccseeへ 取り込み管理していました。 理由は、テキストエディタは文書を高速加工できますし 置換に改行などのバイナリーコードも対象にしてくれます。 Accessを使ったのは、毎日のニュースを取り込んむと大量に なることと、柔軟な検索が出来るからです。 日々のニュースをExcelに取り込むと重くなり使い勝手が悪くなりますよ
お礼
>テキストエディターでを使いカンマ区切り型式のファイルへ変換してAccseeへ取り込み管理していました。 ニュース記事のDB化であればエディタ-の方がいいのでうか。テキストエディターというのがどういうものか検討がつかないのでごく簡単に教えてください。
- happypoint
- ベストアンサー率36% (521/1422)
こんにちは。 これでできます。 一応範囲はA1:A80となっております。 適宜変更してください。 Sub Test() Range("A1:A80").Borders.LineStyle = xlContinuous End Sub
お礼
どうもありがとうございます。 >一応範囲はA1:A80となっております。 適宜変更してください。 必ずA1からですね。それと一番終わりの行まで選択するのですね。 >Sub Test() Range("A1:A80").Borders.LineStyle = xlContinuous End Sub これはどこにうちこめばいいのですか?
お礼
レスありがとうございます。 >>1.会社名と記事名がA2のセルから始まってA7、A12と5行間隔です。Sheet2のA1から抽出していくならA1に =INDIRECT("Sheet1!A"&(ROW()-1)*5+2) と入れ下にコピー 手始めにこのとうりにやってみました。 Sheet2のA1に#REF!が表示されました。下にコピ-ということはSheet1にある項目を全部コピ-するのですか