advanced help
per page, with , order by , clip by
Results of 1 - 1 of about 11 for 別のブック コピー オブジェクト 明示 (0.020 sec.)
別のブック (602), コピー (26158), オブジェクト (4985), 明示 (842)
[[20180113094023]]
#score: 11252
@digest: 66da6bc68d9c2e99007e700805f6e8f4
@id: 75251
@mdate: 2018-02-04T18:15:51Z
@size: 66585
@type: text/plain
#keywords: 要録 (771384), 席簿 (363383), 録用 (322081), タws (200704), 簿1 (154683), 出席 (134492), 式ws (125053), 用出 (116521), ヨッ (100929), 名ws (99786), ixcol (88428), ixrow (70991), rngto (65698), 出欠 (59212), 年生 (58144), 年", (50955), 年") (34730), ッシ (16382), 転記 (14640), 2018 (13839), 貼付 (11404), 列目 (9880), 変数 (9568), 氏名 (9200), worksheets (7863), ブジ (7554), オブ (7525), ジェ (7030), ws (6367), cells (6193), ェク (6113), シー (5986)
『20161230111936で教えていただいたマクロを活用して、新しいマクロを作りたい』(ヨッシー)
「20161230111936」でマナさんに教えていただいたマクロを活用して、新しいマクロを作ろうとしたのですが、うまくいきません。 Sub test9() Dim データWS As Worksheet Dim 氏名WS As Worksheet Dim 書式WS As Worksheet Dim コピー行 As Long, コピー列 As Long, 貼付行 As Long, 貼付列 As Long Dim 貼付開始行 As Long Set データWS = Worksheets("出席簿") Set 書式WS = Worksheets("書式") 貼付開始行 = 書式WS.Cells.Find(What:="出欠の記録").Row + 4 Application.ScreenUpdating = False For コピー行 = 4 To データWS.Cells(Rows.Count, 2).End(xlUp).Row Set 氏名WS = Worksheets(データWS.Cells(コピー行, 2).Value) コピー列 = 3 For 貼付行 = 貼付開始行 To 貼付開始行 + 4 Step 2 For 貼付列 = 9 To 39 Step 6 コピー列 = コピー列 + 1 Next Next Next End Sub ○変数はローマ字に置きかえて、理解しています。 ○「出席簿シート」は今回は「要録用出席簿」に置きかえます。 ○「出席簿」シートの氏名ごとに、1行ずつ6項目のデータが入っています。 (G列~M列です。)それを、氏名シート(これはマクロで全員分がつくられます)の「出席の記録」下にある表に転記したいと思います。 1年生はG80、2年生はG81、3年生はG82、4年生はG83、5年生はG84、6年生は、G85です。(G78には、項目名が、結合セルに入っています)(学年別に転記するためのボタンを置きたいです。ですので、「出席簿」は「要録用出席簿1年から6年までのシートを置くつもりです。) ○コピー行は、最初の児童の行番号が「6」です。氏名は1列目に入っている Call リンク貼り付けマクロ(データWS.Cells(コピー行, コピー列), 氏名WS.Cells(貼付行, 貼付列)) ので、「2」は「1」にしました。 ○転記先の表の項目は、G列から始まり、7列ごとに6項目があるので、 「For 貼付列 = 9 To 39 Step 6」は「 For 貼付列 = 7 To 48 Step 7」にしました。 ○「For 貼付行 = 貼付開始行 To 貼付開始行 + 4 Step 2」は、1行に転記するので、どうすれはいいのかわかりません。 ○「 Call リンク貼り付けマクロ(データWS.Cells(コピー行, コピー列), 氏名WS.Cells(貼付行, 貼付列))」は、どう書きかえればいいのかわかりません。 < 使用 Excel:Excel2016、使用 OS:Windows10 > ---- 1)どのシートから、どのシートへの転記ですか 2)希望は、値の転記ですか、リンク貼り付けですか (マナ) 2018/01/13(土) 11:06 ---- コメントをポチポチ打っているあいだに、マナさんが返答されてましたけど。せっかくなので投稿しておきます。 全体的に質問されたい内容がつかめてないですけど、気になった(わからない)部分として >うまくいきません。 とのことですが、なにがどううまくいかないのかよくわからず・・・・ >○変数はローマ字に置きかえて、理解しています。 自分で分かればいいので好きなようにすればOKとおもいます。 >○「出席簿シート」は今回は「要録用出席簿」に置きかえます セットなり、参照するシート名を変更すればいいとおもいます。 次とその次は説明なのか質問なのかよくわからないので飛ばして・・・・ >○「For 貼付行 = 貼付開始行 To 貼付開始行 + 4 Step 2」は、1行に転記するので、どうすれはいいのかわかりません。 質問の内容がわからず。提示のコードを見てもとくに転記(コピーやValue、Formula等の参照)をしている部分は見当たらないです。 >○「 Call リンク貼り付けマクロ(データWS.Cells(コピー行, コピー列), 氏名WS.Cells(貼付行, 貼付列))」は、どう書きかえればいいのかわかりません。 質問の内容がわからず。提示のコードをみても、Callしてる部分が見当たらないし、何をどうしたくて改修したいのかよくわかりません。 回答になってなくてすみません。 (もこな2) 2018/01/13(土) 11:15 ---- もこな2さん、マナさんありがとうございます。 マナさん、「要録用出席簿」シートから、氏名シートへの転記です。リンク貼り付けではありません。 「要録用出席簿」は別のブックの表をコピーして、「値を貼り付け」したものです。A~F列は削除して必要なG列からのデータを転記したいです。 (ヨッシー) 2018/01/13(土) 11:40 ---- 要録用出席簿は、1年~6年用があるということですか (マナ) 2018/01/13(土) 11:45 ---- マナさん、今は、1年生用だけしか作っていませんが、その学年が終わったら、順に付け足そうと思います。 マナさんから教えていただいたマクロを参考に、作ってみたのですが、「mの参照が不正です」と出ます。 Sub test9() Dim データWS As Worksheet Dim 氏名WS As Worksheet Dim 書式WS As Worksheet Dim m As Long, n As Long, i As Long, j As Long Dim k As Long Set データWS = Worksheets("要録用出席簿") Set 書式WS = Worksheets("書式") k = 書式WS.Cells.Find(What:="出欠の記録").Row + 4 Application.ScreenUpdating = False For m = 6 To データWS.Cells(Rows.Count, 1).End(xlUp).Row Set 氏名WS = Worksheets(データWS.Cells(m, 1).Value) n = 3 i = 80 For j = 7 To 48 Step 7 氏名WS.Cells(i, j).Value = データWS.Cells(m, n).Value n = n + 1 Next m Next j End Sub (ヨッシー) 2018/01/13(土) 11:52 ---- よこからすみません 詳しいことは解りませんが。 ここでの、タイプミスでなければ 単に 最後の next m と next j が 逆なのでは? (隠居じーさん) 2018/01/13(土) 12:02 ---- >隠居じーさん あぁ ほんとだ・・・それかもですね >ヨッシーさん >mの参照が不正です とのことですが、エラー時にどこがハイライトされているか教えてください。 (もこな2) 2018/01/13(土) 12:10 ---- もこなさん、隠居じーさんありがとうございます。 エラー時に、「m」がだけが、選択されたようになります。(ハイライトっていうですか?) (ヨッシー) 2018/01/13(土) 13:32 ---- 「隠居じーさん」さん、mとjと入れ替えて実行すると、 「k = 書式WS.Cells.Find(What:="出欠の記録").Row + 4」が黄色くなります。 (ヨッシー) 2018/01/13(土) 13:39 ---- >ハイライトっていうですか? すみません。分かりづらかったかも。どこが黄色くなってます?って聞きたかったんです。 (ちなみに、黄色以外にも変更できますので、興味があればVBEの設定とかで調べてみてください) >k = 書式WS.Cells.Find(What:="出欠の記録").Row + 4 これがエラーになってるとのことであれば、まず条件にあうのが見つかってるかどうかが気になるので、エラーが出てる時に、イミディエイトウィンドに ?書式WS.Cells.Find(What:="出欠の記録").Address って入れてどう反応するか見てみるのはどうですかね 同じようなエラーが表示される場合は、Findメソッドで、「出欠の記録」という値を検索したら見つからなかったから、Nothingになってるんじゃないかなぁと推測します。 ちなみに、Findメソッドは省略可能な引数に前回検索したときのものを承継する引数がありますので、What以外の引数も省略しないほうがいいかもです。 (もこな2) 2018/01/13(土) 13:58 ---- 「イミディエイトウィンドに ?書式WS.Cells.Find(What:="出欠の記録").Address」 もこな2さん、指摘の通り行ってみたところ、「オブジェクトが必要です。」と出ました。 ですが、シートも「出欠の記録」といセルもあるし、何が足りないんですかね? (ヨッシー) 2018/01/13(土) 14:29 ---- 。。。。。確か、Findメソッドの戻り値はRangeだったような。記憶が。。 Function Find(What, [After], [LookIn], [LookAt], [SearchOrder], [SearchDirection As XlSearchDirection = xlNext], [MatchCase], [MatchByte], [SearchFormat]) As Range Excel.Range のメンバー Worksheetfunctionのほうはdoubleかと。 ここでお使いの変数 K は Longですよね。 しかも、求めたkの値はこのsub test9 内では現在使われていません。 この後追加でおつかいになるご予定でしたら、、 kをRangeに変え、求めたRangeオブジェクトのrowに+4されてはどうでしょうか。 Set k = ~ なければ、Nothingがかえるはずです。 Sub main() Dim k As Range Dim 書式WS As Worksheet Set 書式WS = Worksheets("書式") Set k = 書式WS.Cells.Find(What:="出欠の記録") If Not k Is Nothing Then MsgBox (k.Row) + 4 End If End Sub 上記コードで、書式シートの"出欠の記録"と入力されている セルの行数に4を足した数値が取得できます。 (もこな2)さんの 前の値を継承。。。にもご留意ください。 外してましたらお許しを。 (隠居じーさん) 2018/01/13(土) 14:33 ---- >もこな2さん、指摘の通り行ってみたところ、「オブジェクトが必要です。」と出ました。 >ですが、シートも「出欠の記録」といセルもあるし、何が足りないんですかね? Findメソッドの戻り値は隠居じーさんのご指摘の通りRange(見つからなかったらNothing)だったかとおもうんでやっぱ見つからなかったってことじゃないですかね。 イミディエイトのエラーは、Nothingのアドレス出せっていう意味になっちゃうから、オブジェクトがないからアドレス出せない って返してるんだろう推測します。 Findメソッドが失敗するときの注意点がまとまっているサイトがあるので目を通してみてください。 https://www.moug.net/tech/exvba/0150111.html (もこな2) 2018/01/13(土) 14:51 ---- >Sub main() Dim k As Range Dim 書式WS As Worksheet Set 書式WS = Worksheets("書式") Set k = 書式WS.Cells.Find(What:="出欠の記録") If Not k Is Nothing Then MsgBox (k.Row) + 4 End If End Sub >上記コードで、書式シートの"出欠の記録"と入力されている > セルの行数に4を足した数値が取得できます。 「隠居じーさん」さん、実行してみましたが、何の値も取得できませんでした。 (ヨッシー) 2018/01/13(土) 16:54 ---- 外してたらすみません。 そのコード実行したときにどうなりました? たぶん(見た目は)なにもおこらなかったとおもいます。 (隠居じーさん)さんも自分もNothingになってるんじゃないか? っていってるとおもうんですが・・・ そのコードであれば、Range型の変数「k」がNoting 「じゃなければ」 Range型の変数「k」の行番号に4を加算して MsgBoxで表示しなさい ですから、「k」がNothing なら なにも起こりません。 (もこな2) 2018/01/13(土) 17:01 ---- もこな2 さん ありがとうございます。 説明は、もこな2 さん の通りなので。 当方でも、書式という名前のシートを作りB2のセルに 出欠の記録 と 入力後、提示させていただいた、mainマクロを実行すると Msgboxに 6 と表示されます。 他に何が原因なのでしょうね。 ... もう少し考えてみますです。 (隠居じーさん) 2018/01/13(土) 18:39 ---- 要録用出席簿は、1年~6年用を準備するとして、 転記先の氏名シートは1年分ですか。 それとも一つのシートに6年分のデータが転記されるのですか。 (マナ) 2018/01/13(土) 19:01 ---- >(隠居じーさん)さん へ おつかれさまです。ちょっと気になったので勝手にコメントさせていただきました。余計なことだったらごめんなさい。 質問者さんが、2018/01/13(土) 16:54の投稿で提示されたコードのとおり実行しているのであれば、引数が省略されたままなので、LookIn や LookAt が怪しいと勝手におもってますけど、回答側でまったく同じ状況を再現できないので、こればっかりはどうしようもないですよね。 >ヨッシー さんへ 2018/01/13(土) 11:52 に投稿されたコードをみると、(隠居じーさん)さんが指摘された変数「k」が使われていないっていうのも気になりますが、変数「書式WS」もその「k」の取得でしか使ってないので、改修ミスでいらない記述が残ってるとかじゃないでしょうか。 質問とは関係ないのかもしれませんが、気になったのでコメントしておきます。 (もこな2) 2018/01/13(土) 19:15 ---- 2018/01/13(土) 11:52 に投稿されたコードつながりで2点コメントしわすれたので追加させてください。 (1) For j = 7 To 48 Step 7 これ、7ずつ増加するなら 49 じゃないかとおもうんですがタイプミスでしょうか? (2)Application.ScreenUpdating とかオマケは、できあがってから(全体がちゃんと動くようになってから)追加すればいいと思います。 余計なお世話であれば読み飛ばして下さい。 (もこな2) 2018/01/13(土) 19:29 ---- もこなさん、マナさんありがとうございます。「出欠の記録」が探せなかったのは、書式シートで 「出 欠 の 記 録」となっていたのではないかと思い、字間をつめて「出欠の記録」としました。「i」は、学年ごとに値を80~85まで変えて、1つのシートに6年分を転記できるようにしてみました。 次のマクロで実行してみたら、きちんと全員分はいりました。 Sub リンク貼り付けマクロ(コピーセル As Range, 貼り付けセル As Range) '「要録用出席簿」と「要録様式2・出欠の記録」とのリンク コピーセル.Worksheet.Select コピーセル.Select Selection.Copy 貼り付けセル.Worksheet.Select 貼り付けセル.Select ActiveSheet.Paste Link:=True End Sub Sub test() Dim データWS As Worksheet Dim 氏名WS As Worksheet Dim 書式WS As Worksheet Dim m As Long, n As Long, i As Long, j As Long 'mはコピー行、nはコピー列、iは貼付行、jは貼付列 Dim 貼付開始行 As Long Set データWS = Worksheets("要録用出席簿") '「要録用出席簿1年」とする必要あり。シートも作成する。 Set 書式WS = Worksheets("書式") 貼付開始行 = 書式WS.Cells.Find(What:="出欠の記録").Row + 4 '4はセル「出欠の記録」を含めて下に4行目から Application.ScreenUpdating = False '転記をなめらかにするコード For m = 6 To データWS.Cells(Rows.Count, 1).End(xlUp).Row '6は「要録用出席簿」の先頭児童が6行目から最後の児童まで、1は1列目 Set 氏名WS = Worksheets(データWS.Cells(m, 1).Value) 'mはコピー行、1は1列目 n = 2 '2は入力6項目の初めが「要録用出席簿」の2列目 i = 82 '80は1年生、81は2年生、82は3年生、83は4年生、84は5年生、85は6年生 For j = 7 To 42 Step 7 '書式シートの表の項目は、7列目から42列目まで、7列とび 氏名WS.Cells(i, j) = "=" & データWS.Name & "!" & Cells(m, n).Address 'リンクしている n = n + 1 '入力6項目は、2列目から7列目まで1列ずつ増えていく Next Next End Sub すいません、ちょっと見にくいですね。自分でわかるように説明をつけてみました。 ○転記できるようになったのですが、「要録用出席簿」の値が、たとえば「202」となっている時には、「202日」と「日」がつくようになっているのですが、「0」の場合、「日」だけとなってしまいます。 「0日」とするには、何か設定する必要があるのでしょうか。 (ヨッシー) 2018/01/14(日) 03:25 ---- ヨッシー さん すみません~ >kをRangeに変え、求めたRangeオブジェクトのrowに+4されてはどうでしょうか。 は回りくどい蛇足でしたね。 m(__)m コードは正常でしたが、情報が 「出 欠 の 記 録」 だったのですね。 解決してよかったですね。大作に挑戦されておられるようで。頑張ってください。 惑わすような、レスで済みませんでした でわ ^^ (隠居じーさん) 2018/01/14(日) 07:46 ---- >「要録用出席簿」シートから、氏名シートへの転記です。リンク貼り付けではありません。 リンク貼り付けのコードになっていますが理解していますか? (マナ) 2018/01/14(日) 08:52 ---- >「出欠の記録」が探せなかったのは、書式シートで 「出 欠 の 記 録」となっていたのではないかと思い、字間をつめて「出欠の記録」としました。 う~ん。ここからですと、説明するのがちょっと大変です・・・・ とりあえず、1工程ずつ「マクロの記録」機能をつかって、Excelがどんなコードを作成するかを確認してから、手直ししつつご自身のコードに組み込んでみてはいかがでしょうか。 とりあえず、2018/01/14(日) 03:25の投稿のtestプロシージャは必要な部分を抜き出したのかわかりませんけど、気になる点として (1)「書式WS」「貼付開始行」は何のために用意してるのかわかりません。 (2)Findメソッドの引数が省略されてるのでエラーになる可能性がわずかながらあります。 (3)「氏名WS.Cells(i, j) = "=" & データWS.Name & "!" & Cells(m, n).Address 'リンクしている」←リンク貼り付けというか、リンクの設定というか、数式の設定になってます。また、Valueプロパティの省略記述になってます。Valueでも動くのでしょうけど、数式の設定ならFormulaプロパティを使うのが定石かなぁとおもいます。 (もこな2) 2018/01/14(日) 10:23 ---- すみません。気になる点の追加です。 (4)Application.ScreenUpdating = False '転記をなめらかにするコード これは何やってるか理解して記述してますか? 先のコメントのとおり、安定動作が確認されてない状態では記述しないほうがいいとおもいますが。。。少なくとも実行が終わったらTrueに戻すようにすべきとおもいます。 (5)Set データWS = Worksheets("要録用出席簿") '「要録用出席簿1年」とする必要あり。シートも作成する。 とりあえず、「要録用出席簿1年」で作ってみませんか?うまく動くようになってから「要録用出席簿1年」、「要録用出席簿2年」、「要録用出席簿3年」..と、シートを切り替えるループを組み込めばいいとおもいます。 i = 82 '80は1年生、81は2年生、82は3年生、83は4年生、84は5年生、85は6年生 ↑も然り。 (もこな2) 2018/01/14(日) 11:18 ---- 「隠居じーさん」さんありがとうございます。 もこなさん、いろいろ指摘していただいてありがとうございます。自分なりに考えて作ってみたら、実行してくれたので、これでいいのかなあという感じでしかありません。直したらいいところを、もう少し具体的に教えてもらうと助かります。 マナさん、リンク貼り付けのコードを使用しているのは、理解しているつもりです。ですが、どこをどう直したら、転記だけのマクロになるのか、わかりません。教えてください。お願いします。 (ヨッシー) 2018/01/14(日) 12:12 ---- >もこなさん、いろいろ指摘していただいてありがとうございます。自分なりに考えて作ってみたら、実行してくれたので、これでいいのかなあという感じでしかありません。直したらいいところを、もう少し具体的に教えてもらうと助かります。 ごめんなさい。私の説明スキルだとこれ以上うまく説明するのは難しいです・・・ とりあえず気になったところに番号振ったので何番がわからないか教えてください。 (1)「出欠の記録」が探せなかったのは、書式シートで 「出 欠 の 記 録」となっていたのではないかと思い、字間をつめて「出欠の記録」としました。 は、Findメソッドというか、VBA以前に「検索」っていう仕組みがどういうものなのかわかっておいたほうがいいと思います。 ちなみに、Excel君は、完全一致、部分一致っていうのはできるんですが、あいまい検索(間にスペースが入っていたり、何文字か違っているのも対象にする)っていうのは得意ではありません。 (2)「書式WS」「貼付開始行」は何のために用意してるのかわかりません。 読んでそのままの意味です。プロシージャ内で宣言して、定義(値の代入)してますけど、使ってる箇所がないので、使うつもりがないなら記述不要って意味です。 (3)Findメソッドの引数が省略されてるので~ 2018/01/13(土) 14:51 のコメントを読んでください・・・ (4)「氏名WS.Cells(i, j) = "=" & データWS.Name & "!" & Cells(m, n).Address 'リンクしている」 まず、氏名WS.Cells(i, j) っていう記述の部分は、 氏名WS.Cells(i, j).Value って解釈されます。 次に "=" & データWS.Name & "!" & Cells(m, n).Address というのは 数式(を表す文字列)です。 Valueプロパティに数式(を表す文字列)が与えられた場合、最初に「=」入っているから、Excel君が気を利かせて、Formulaプロパティに格納してくれますけど、数式を格納したいのであれば、初めからFormulaプロパティ使うべきかなとおもいます。(前述のとおり、Valueでも動くことは動きますけど。。。。) 値を入れたいのであれば、以下のように修正してください。(2018/01/13(土) 11:52に投稿された記述に戻してください) 氏名WS.Cells(i, j) = "=" & データWS.Name & "!" & Cells(m, n).Address ↓ 氏名WS.Cells(i, j).Value = データWS.Cells(m, n).Value (5)Application.ScreenUpdating = False '転記をなめらかにするコード 繰り返しになりますけど、何をやってるかわかって記述してますか? わかっているのであれば、Falseのままだとよろしくないのは分かると思うんですけど・・ まぁ、プロシージャ実行後に何もせず、他のブックも含めエクセル閉じるなら別にいいです・・ <長くなったので次投稿に続く・・> (もこな2) 2018/01/14(日) 15:25 ---- 横着してコメント欄に直接入力してたら、変なところいじって入力したやつ全損・・・orz とりあえず・・・ <続き> (6)シートを切り替えるループ たとえば、以下のような感じ。 Sub メイン() '==変数の宣言とか Dim 学年 As Integer Dim データWS As Worksheet Dim i As Long ' '==主処理 For 学年 = 1 To 6 Step 1 Select Case 学年 Case Is = 1 Set データWS = Worksheets("要録用出席簿1年") Case Is = 2 Set データWS = Worksheets("要録用出席簿2年") Case Is = 3 Set データWS = Worksheets("要録用出席簿3年") Case Is = 4 Set データWS = Worksheets("要録用出席簿4年") Case Is = 5 Set データWS = Worksheets("要録用出席簿5年") Case Is = 6 Set データWS = Worksheets("要録用出席簿6年") End Select ' i = 79 + 学年 ' Call 転記(データWS, i) Next 学年 End If Sub 転記(データWS As Worksheet, i As Long) '省略 ← 完成したコードをここに入れる End Sub ※1つのプロシージャの中でやってもいいけど、元々ループの入れ子になってるコードを、ループに入れることになるから、訳がわからなくなると思うので非推奨。 (もこな2) 2018/01/14(日) 17:22 ---- もこなさん、詳しく説明していただいてありがとうございます。 説明をワードに貼り付けて、コードを見ながら、熟読して見直してみます。 (ヨッシー) 2018/01/14(日) 17:38 ---- もこなさん、(1)~(5)まで見直しをしてみました。動作を確認しました。次のようなコードです。 Sub test1() Dim データWS As Worksheet Dim 氏名WS As Worksheet Dim m As Long, n As Long, i As Long, j As Long 'mはコピー行、nはコピー列、iは貼付行、jは貼付列 Set データWS = Worksheets("要録用出席簿") Application.ScreenUpdating = True For m = 6 To データWS.Cells(Rows.Count, 1).End(xlUp).Row '6は「要録用出席簿」の先頭児童が6行目から最後の児童まで、1は1列目 Set 氏名WS = Worksheets(データWS.Cells(m, 1).Value) 'mはコピー行、1は1列目 n = 2 '2は入力6項目の初めが「要録用出席簿」の2列目 i = 80 '80は1年生、81は2年生、82は3年生、83は4年生、84は5年生、85は6年生 For j = 7 To 42 Step 7 '書式シートの表の項目は、7列目から42列目まで、7列とび 氏名WS.Cells(i, j).Value = データWS.Cells(m, n).Value n = n + 1 '入力6項目は、2列目から7列目まで1列ずつ増えていく Next Next End Sub ○(6)が理解できません。コピーして貼り付けてみて、実行したのですが、「End Ifに対応するIfブロックがありません。」と返されました。「Sub」の間違いですか。 ○一応、要録用出席簿を1年から6年まで用意してみました。この要録用出席簿は、その学年が終了したら別ブックの出席簿からコピーして貼り付けていくのですが、それでも「シートを切り替えるループ」で対応できるのですか。 よろしくお願いします。 (ヨッシー) 2018/01/15(月) 02:37 ---- もこなさん、理解しないまま、つぎのようにしてみましたが、「 Set データWS = Worksheets("要録用出席簿1年")」の所で、ハイライトになります。 Sub メイン() '==変数の宣言とか Dim 学年 As Integer Dim データWS As Worksheet Dim i As Long ' '==主処理 For 学年 = 1 To 6 Step 1 Select Case 学年 Case Is = 1 Set データWS = Worksheets("要録用出席簿1年") Case Is = 2 Set データWS = Worksheets("要録用出席簿2年") Case Is = 3 Set データWS = Worksheets("要録用出席簿3年") Case Is = 4 Set データWS = Worksheets("要録用出席簿4年") Case Is = 5 Set データWS = Worksheets("要録用出席簿5年") Case Is = 6 Set データWS = Worksheets("要録用出席簿6年") End Select ' i = 79 + 学年 ' Call 転記(データWS, i) Next 学年 End Sub Sub 転記(データWS As Worksheet, i As Long) Dim データWS As Worksheet Dim 氏名WS As Worksheet Dim m As Long, n As Long, j As Long 'mはコピー行、nはコピー列、iは貼付行、jは貼付列 Application.ScreenUpdating = True For m = 6 To データWS.Cells(Rows.Count, 1).End(xlUp).Row '6は「要録用出席簿」の先頭児童が6行目から最後の児童まで、1は1列目 Set 氏名WS = Worksheets(データWS.Cells(m, 1).Value) 'mはコピー行、1は1列目 n = 2 '2は入力6項目の初めが「要録用出席簿」の2列目 For j = 7 To 42 Step 7 '書式シートの表の項目は、7列目から42列目まで、7列とび 氏名WS.Cells(i, j).Value = データWS.Cells(m, n).Value n = n + 1 '入力6項目は、2列目から7列目まで1列ずつ増えていく Next Next End Sub (ヨッシー) 2018/01/15(月) 02:48 ---- もこなさん、「Application.ScreenUpdating = True」はなくてもいいということがわかりました。このコードは、実行速度を速くするためのものであることもわかりました。また、Falseにしておいて、Nextの次で Trueに戻せばいいことも理解できました。 Sub test1() Dim データWS As Worksheet Dim 氏名WS As Worksheet Dim m As Long, n As Long, i As Long, j As Long 'mはコピー行、nはコピー列、iは貼付行、jは貼付列 Set データWS = Worksheets("要録用出席簿1年") For m = 6 To データWS.Cells(Rows.Count, 1).End(xlUp).Row '6は「要録用出席簿」の先頭児童が6行目から最後の児童まで、1は1列目 Set 氏名WS = Worksheets(データWS.Cells(m, 1).Value) 'mはコピー行、1は1列目 n = 2 '2は入力6項目の初めが「要録用出席簿」の2列目 i = 81 '80は1年生、81は2年生、82は3年生、83は4年生、84は5年生、85は6年生 For j = 7 To 42 Step 7 '書式シートの表の項目は、7列目から42列目まで、7列とび 氏名WS.Cells(i, j).Value = データWS.Cells(m, n).Value 'データの転記 n = n + 1 '入力6項目は、2列目から7列目まで1列ずつ増えていく Next Next End Sub (ヨッシー) 2018/01/15(月) 03:32 ---- やりたいことは、こういうことですか? Sub メイン() Dim ws As Worksheet Dim ix As Long 'Application.ScreenUpdating = False For Each ws In Worksheets(Array("要録用出席簿1年", "要録用出席簿2年", "要録用出席簿3年" _ , "要録用出席簿4年", "要録用出席簿5年", "要録用出席簿6年")) ix = ix + 1 Call test2(ws, ix) Next End Sub Sub test2(ByVal wsFrom As Worksheet, ByVal ixRow As Long) Dim rngFrom As Range Dim rngTo As Range Dim r As Range Dim c As Long Dim ixCol As Long '転記対象のデータはA6からデータ最終行までの7列分 With wsFrom Set rngFrom = Application.Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 7) End With '行毎に繰り返す For Each r In rngFrom.Rows '転記先基準セルの取得 Set rngTo = Worksheets(r.Cells(1).Value).Range("G80").Cells(ixRow, 1) '転記列番号初期化 ixCol = 1 'コピーは1列目は不要なのでセル範囲を必要範囲に狭めた範囲で繰り返す For Each c In r.Resize(6).Offset(, 1).Cells '基準セルからの相対位置で転記先を取得して転記 rngTo.Cells(ixRow, ixCol).Value = c.Value '次の転記列番号(7つ飛び) ixCol = ixCol + 7 Next Next End Sub 余談ですが、変数名に漢字使うと日本語と英語の切り替えがめんどくさくないですか? せめて、 wsデータ、ws氏名 としておくと、 ws とタイプした後に Ctrlキー + Spaceキー で、 候補のリストが出るので、日本語の切り替えが無くて楽だと思います。 あ、あと、リンク貼り付けにしたいんでしたっけ??? よくわかってないです。参考になれば。。。 (まっつわん) 2018/01/15(月) 09:30 ---- ●2018/01/15(月) 02:37 の投稿への返答です (1)(6)が理解できません~~「Sub」の間違いですか。 すみません。そのとおり End Sub です。失礼いたしました。 (2)この要録用出席簿は、その学年が終了したら別ブックの出席簿からコピーして貼り付け~ ごめんなさい。意味がよくわからないです。 ●2018/01/15(月) 02:48 の投稿への返答です (3)「 Set データWS = Worksheets("要録用出席簿1年")」の所で、ハイライトになります。 マクロを実行しているブックに「要録用出席簿1年」というシートはありますか? もしかしたら(2)と関係しているかもしれません・・・ ●まっつわんさんの 2018/01/15(月) 09:30 の投稿を拝見して です たしかに、For Eachで配列回した方がすっきり記述できますね。 質問者さんが配列ってなぁに? って状態じゃ無ければ 私も まっつわんさんの記述方法に1票です。 変数名は、まぁそうですね。 個人的には英語アレルギーなので変数名くらいは日本語で書いてやる!と意地になってるだけですね・・・ ●追加コメントです。 たとえば、他のブックにあるシートでも Set データWS = Workbooks("要録用出席簿1年.xls").Worksheets("要録用出席簿1年") というようにしてやれば、Worksheet型の変数にセットできるので、どのような状態で作ってるのか、(マクロを記述してるブックと出席簿のデータがはいってるブックが、同じなのか・違うのか)など全体のシート構成というかブック群の構成?を教えてもらえればアドバイスできることがあるかもしれません。 (もこな2) 2018/01/15(月) 12:05 ---- まっつわんさん、もこな2さん、大変ありがとうございます。今、職場(学校)で返信を見ています。 すごい、情報量に少々パニックになっています。お二人の返信をもう一度よく見て、理解するよう頑張ってみます。少し、時間をください。お願いします。 (ヨッシー) 2018/01/15(月) 14:25 ---- 返信が遅くなりました。すいません。 まっつわんさんから教えていただいたコードをコピーして貼り付けて実行してみました。すると、 「 For Each ws In Worksheets(Array("要録用出席簿1年", "要録用出席簿2年", "要録用出席簿3年" _ , "要録用出席簿4年", "要録用出席簿5年", "要録用出席簿6年"))」でデバックして、ハイライトになります。同じブック内にきちんと1年から6年の要録用出席簿はあるのですが?「Set データWS=Worksheets("要録用出席簿")」のような記述は必要ないのですか? あと、「リンク貼り付け」」ではなく「データの転記」です。 もこな2さん、(2)(3)についてですが、マクロを実行している同じブック内に、「要録用出席簿1年」から「要録用出席簿6年」まできちんとあります。For Each~の記述は、別のマクロでこの学校で学びました。 「この要録用出席簿は、その学年が終了したら別ブックの出席簿からコピーして貼り付け~」ですが、例えば、1年生は、3学期が終了した時点で、すべての出席簿(別ブックで作成しています)が完成します。この出席簿のシートに「要録用」があり、これをコピーして、今教えていただいているマクロを記述しているブックに貼り付けて「要録用出席簿1年」としています。 シート構成ですが、「名簿」「要録用出席簿1年」「要録用出席簿2年」「要録用出席簿3年」「要録用出席簿4年」「要録用出席簿5年」「要録用出席簿6年」「書式」「氏名1」から名簿の名前シートが並びます。 (ヨッシー) 2018/01/16(火) 04:25 ---- >For Each ws In Worksheets(Array("要録用出席簿1年", ~ でエラーになる う~ん。原因がよくわかりませんね。 ブック構成のところに書いていただいたものですと、数字が半角になってますけど、コードでは全角なので、そこが原因ってことはないですか? (もこな2) 2018/01/16(火) 07:56 ---- >デバックして、ハイライトになります。 アルファベットの大文字小文字の違いは無視されますが、 文字の全角半角の違いは、 「違う名前(違うインデックス)」と認識されるようです。 確認願います。 あと、エラーメッセージもちゃんと記載してほしいです。 何がだめかヒントが書かれてるはずです。 (まっつわん) 2018/01/16(火) 08:17 ---- まっつわんさん、もこな2さんありがとうございます。 「要録用出席簿1年」の数字については、何回か打ち直して実行したら、実行してくれました。 ところが、違うところでデバックしました。 「Sub test2(ByVal wsFrom As Worksheet, ByVal ixRow As Long) 」がハイライトになりました。 エラーメッセージは、「For Eachに指定する変数は、バリアント型または、オブジェクト型でなければなりません。」です。何のことかさっぱりわかりません。よろしくお願いします。 (ヨッシー) 2018/01/16(火) 10:14 ---- >違うところでデバックしました。 >「Sub test2(ByVal wsFrom As Worksheet, ByVal ixRow As Long) 」がハイライトになりました。 >エラーメッセージは、「For Eachに指定する変数は、バリアント型または、オブジェクト型でなければなりません。」です。何のことかさっぱりわかりません。よろしくお願いします。 細かいことですが、デバッグしたんじゃなくて、エラーで止まったですよね おそらく、ここでしょう。。。。 Dim c As Long For Each c In r.Resize(6).Offset(, 1).Cells 変数「c」の型、よく見て下さい。 (もこな2) 2018/01/16(火) 10:23 ---- 失礼しました。 >「For Eachに指定する変数は、バリアント型または、オブジェクト型でなければなりません。」 Dim c As Long ← × Dim c As Range ← ○ ※セル範囲=オブジェクト型の一種 (まっつわん) 2018/01/16(火) 10:30 ---- まっつわんさんの指摘の通り直して実行したら、実行されました。しかし、次のような状態になりました。 うまく伝えられるかわかりませんが、例えば1人目は、1年、2年、3年のデータがG80,G82,G84と転記したい表の中で1行とびですが、すべて転記されます。ところが、4年、5年、6年のデータは、表の中に転記されず空白で、6項目目(児童用出席簿のG列)だけが、AP86,AP88,AP90に入っています。それと、表の右下に2人目の6項目目だけが、CM86,CM88,CM90に入ります。表の右外に、3人目から6人目のデータが1行とび、7列とびに入ります。 2人目以降も同じようにずれてデータが入ります。 (ヨッシー) 2018/01/16(火) 15:40 ---- とりあえず、エラーでとまってるわけでは無いんですよね? そうなると、今 ヨッシーさんが実行してるコードを見てどんなふうに動いてるのかを見る必要があるので、可能な範囲でそのまま貼り付けてください。 (もこな2) 2018/01/16(火) 15:57 ---- なんでだろー。。。 ここにブレークポイントを置いて、 ローカルウィンドウで変数の中身を確認してみてください。 >rngTo.Cells(ixRow, ixCol).Value = c.Value ↓参考URL http://www.ken3.org/vba/excel-help.html (まっつわん) 2018/01/16(火) 16:13 ---- あ、失礼しました。 '転記先基準セルの取得 Set rngTo = Worksheets(r.Cells(1).Value).Range("G80").Cells(ixRow, 1) ↑を↓に直してみてください。 '転記先基準セルの取得 Set rngTo = Worksheets(r.Cells(1).Value).Range("G80") あとは、ブレークポイントで止まった時にどんな数字になっているか(意図通りになっているかですかね) (まっつわん) 2018/01/16(火) 16:16 ---- まっつわんさん、直して実行してみました。全員の転記先にデータが入りました。しかし、今度は、表の右外に4人分のデータが残ってしまいます。例えば1人目なら、2人目をとばして、3人目から6人目までのデータが残ります。 ブレークポイントを初めて知りました。行ってみましたが、式 ")" 値 ")" 型 stringとなりましたが、何かやり方を間違えていますか? (ヨッシー) 2018/01/16(火) 17:17 ---- まっつわんさん、 rngTo.Cells(ixRow, ixCol).Value = c.Valueでブレークポイントで止まった時、「オブジェクト変数またはブロック変数が設定されていません」というように出ました。 (ヨッシー) 2018/01/16(火) 18:03 ---- こちらに同じデータがあればデバッグ出来るんですが、 今一つ、どうなればいいか、まだわかってません>< >まっつわんさん、 >rngTo.Cells(ixRow, ixCol).Value = c.Valueでブレークポイントで止まった時、「オブジェクト変数また>はブロック変数が設定されていません」というように出ました。 この時に、 ローカルウィンドウでixRowと ixColの値はどうなってますか? また、 イミディエイトウィンドウに ?rngTo.Address[Enter] ※[Enter]はエンターキー押下の意味 としたとき、なんと表示されますか? 他のRange系のアドレスも意図通りのセルが入っているかチェックしてください。 こういうのを1つづつチェックして行かないとどこで間違ってるか解らないかなと思います。 (これがデバッグという作業です。すごく根気が要ります。ぼくはこれが嫌いだけど^^;) (まっつわん) 2018/01/17(水) 09:13 ---- まっつわんさん、 ローカルウィンドウでixRowと ixColの値はどうなってますか?⇒ixRow 1, ixCol 0 でした。 イミディエイトウィンドウに ?rngTo.Address[Enter] の時の表示 「実行時 エラー'91': オブジェクト変数または、WITHブロック変数が設定されていません」と出ます。 (ヨッシー) 2018/01/17(水) 09:47 ---- メモ帳でぽちぽち書いている間に回答があったけど、とりあえずそのまま投稿します。 初歩的な確認になってしまうけど変数の書き誤りはないですか? エディタの設定は「変数の宣言を強制する」にチェック入れてつかってますか?(Option Explicit ってモジュールの始めに勝手に入ってくれれば、チェック入ってます) コレをやっておくと、(Option Explicit という記述があると)変数のタイプミスがあってもエクセル君が「そんな変数は知らん!」って警告してくれるようになります。 また、変数に何が格納されているか確認する方法ですが、ローカルウィンドウで確認する以外の方法もあるので紹介しておきます。 ◆オブジェクト型変数以外の場合 (1)ブレークポイントやステップ実行で止まっているときに、変数名の上にマウスポインター持って行く (2) 〃 イミディトウインドウに「?○○○」って最初に半角?をつけてから変数名を書いてエンター押す。 ◆オブジェクト型変数(今回のケースでいえば、 ○○ As Worksheet とか ○○ As Range とか書いてあるやつ)の場合 (1)ブレークポイントやステップ実行で止まっているときに、イミディエイトウインドウに「?○○○.Name」「?○○○.Address」など最初に半角?をつけてから変数名を書いてその後ろに適当なプロパティをつける。 >rngTo.Cells(ixRow, ixCol).Value = c.Valueでブレークポイントで止まった時、「オブジェクト変数またはブロック変数が設定されていません」というように出ました。 ↑はブレークポイントで止まったんじゃ無くて、エラーで止まってます。(「オブジェクト変数またはブロック変数が設定されていません」はエラーメッセージです) この場合疑うなら。 「rngTo」←ワークシートがセットされてない(ただ、Set rngTo=~でエラーになっていないので、違うっぽい・・) 「c」←セルがセットされていない(ただ、For Each c ~ ってやってるからセットされないはずはない・・・) 「Cells(ixRow, ixCol)」←行、列がとんでもない値になっていて、エクセルの限界を超えたセルの参照になっている あたりが気になります。 とりあえず、エラーで止まってるときに、イミディトウィンドウに ?rngTo.Name ?rngTo.Cells(ixRow, ixCol).Address ?c.Address ?c.Parent.Name とそれぞれ入力してからエンター押してみて、どんな答えが返ってくるか(どれがエラーになるか)教えて頂ければ、なにかアドバイスできることがあるかもしれません。 >まっつわんさんへ ?rngTo.Address[Enter] だと、rngToはワークシート格納してるはずだからエラーにならないですか?違ってたらすみません。 >ヨッシーさんの2018/01/17(水) 09:47 を拝見して ixCol = 0 はまずいです。 シート見れば解ると思いますけど A列の左に列ありませんよね?A列が1、B列が2 なので、 列番号が0というものは存在しません。つまり、存在しないセルのAddressを求めようとして、そんなの無い ってエラーが出てます。 (もこな2) 2018/01/17(水) 10:24 ---- ixCol は、 ixCol=1 と初期化してるので0になるわけがないと思います。 あと、 >?rngTo.Address[Enter] の時の表示 >「実行時 エラー'91': オブジェクト変数または、WITHブロック変数が設定されていません」と >出ます。 となるので、そのときローカルウィンドウでは、 rngTo が Nothingになってるのかな? それも事前に代入しているはずだからNothingになるわけがないと思うのですが。。。 必要な行がとにかく消えていると思います。 試行錯誤しているうちにコードがおかしくなっている気がします。 もう1回最初から、日本語で作業の流れを表現してみるところから始めてみては? 勉強だから何度でも積んだり崩したりする必要があると思います。 (まっつわん) 2018/01/17(水) 10:33 ---- すみません。私の、2018/01/17(水) 10:24の投稿について、変数「rngTo」をWorkssheetと勘違いしてたので、とりあえず~~以下は無視して下さい。 その上で、まっつわんさんのコメントのとおり、記述漏れなどのミスがあるとおもうので、繰り返しになりますけど、(個人情報が入ってて見せられない部分は別として)現在のコードを提示して添削してもらったほうが、いいんじゃないかとおもいます。 (もこな2) 2018/01/17(水) 10:55 ---- まっつわんさん、もこな2さんありがとうございます。 まっつわんさん、1つ違うかもしれませんが気になるところがあります。 「 '転記対象のデータはA6からデータ最終行までの7列分 With wsFrom Set rngFrom = Application.Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 7)」コードの説明部分ですが、A6には氏名が入っていて、転記したいデータは、B6からG6の6列なのですが、いいのでしょうか? まっつわんさんから教えていただいたコードをコピーして貼り付けたあと、直したコードを提示します。 すいませんが添削をお願いします。 Sub メイン() Dim ws As Worksheet Dim ix As Long 'Application.ScreenUpdating = False For Each ws In Worksheets(Array("要録用出席簿1年", "要録用出席簿2年", "要録用出席簿3年" _ , "要録用出席簿4年", "要録用出席簿5年", "要録用出席簿6年")) ix = ix + 1 Call test2(ws, ix) Next End Sub Sub test2(ByVal wsFrom As Worksheet, ByVal ixRow As Long) Dim rngFrom As Range Dim rngTo As Range Dim r As Range Dim c As Range Dim ixCol As Long '転記対象のデータはA6からデータ最終行までの7列分 With wsFrom Set rngFrom = Application.Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 7) End With '行毎に繰り返す For Each r In rngFrom.Rows '転記先基準セルの取得 Set rngTo = Worksheets(r.Cells(1).Value).Range("G80") '転記列番号初期化 ixCol = 1 'コピーは1列目は不要なのでセル範囲を必要範囲に狭めた範囲で繰り返す For Each c In r.Resize(6).Offset(, 1).Cells '基準セルからの相対位置で転記先を取得して転記 rngTo.Cells(ixRow, ixCol).Value = c.Value '次の転記列番号(7つ飛び) ixCol = ixCol + 7 Next Next End Sub (ヨッシー) 2018/01/17(水) 11:24 ---- まっつわんさんがフォローしてくださってるところ、わかってない私がアレコレ言っても混乱するとおもうので、まぁ話半分くらいで読んでください。 (1) With wsFrom Set rngFrom = Application.Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 7) End With ↑の部分についてApplication.Rangeって記述があるのは知ってるんですけど、イマイチ私が理解できてないのと、 結局wsFromのセル範囲をセットしたいってでしょうから、私なら With wsFrom Set rngFrom = .Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 7) End With こう記述します。 (2) まっつわんさんのコメントのとおり、ixCol=1 として、その後 ixCol = ixCol + 7 とやってるので 0になることはないと思います。 それでも0になってるってことは、そもそも ixCol=1 が実行される前に確認してませんか? ステップ実行(F8を押すと1行ずつコードを実行することができます)してみて、「rngTo.Cells(ixRow, ixCol).Value = c.Value」が黄色くなってるときに、 「ixCol」にマウスカーソル合わせてみてください。たぶん0じゃないと思います。 (もこな2) 2018/01/17(水) 13:07 ---- もこなさん、ありがとうございます。 >ixCol」にマウスカーソル合わせてみてください。たぶん0じゃないと思います。 まっつわんさん、混乱させてしまいすいませんでした。値は「1」でした。 (ヨッシー) 2018/01/17(水) 14:14 ---- ↑そこまで調べたのであれば、同じタイミングで、イミディエイト使って ?rangTo.Parent.Name ?rangTo.Address ?ixRow ?ixCol ?c.Address ?c.Parent.Name を調べて、結果を教えて頂いた方が分析しやすいかもしれません。 (もこな2) 2018/01/17(水) 16:50 ---- もこなさん、調べてみました。 ?rangTo.Parent.Name ⇒実行時エラー 424 オブジェクトが必要です ?rangTo.Address⇒実行時エラー 424 オブジェクトが必要です ?ixRow⇒1 ?ixCol⇒1 ?c.Address ⇒$B$6 ?c.Parent.Name⇒要録用出席簿1年 です。 (ヨッシー) 2018/01/18(木) 01:57 ---- まっつわんさん、もこな2さん ?rangTo.Addressは、rngTo.Cells(ixRow, ixCol).Value = c.Valueを F8でステップ実行したとき、$G$80となりました。 ?rangTo.Parent.Name は名簿の先頭の子の氏名がでました。 (ヨッシー) 2018/01/18(木) 02:46 ---- どっちでしょう? ?rangTo.Address⇒実行時エラー ?rangTo.Address F8でステップ実行したとき、$G$80となりました。 実施するたびに値が変わっちゃうってことはないとおもうので、それぞれどういう状況でしらべたのか教えていただけるとよいかもです。 エラーで止まっている時なのか、ブレークポイントなりステップ実行で意図的に止めてる時に調べたのか。。。 ただ、?rangTo.Addressが「$G$80」を返してる時に、?rangTo.Parent.Nameで「名簿の先頭の子の氏名」が返るのであれば、よくわからないですね。てっきり「要録用出席簿〇年」っていうシート名が入ると思ってたんですけど。。。 (もこな2) 2018/01/18(木) 04:21 ---- もこなさん、ステップ実行⇒イミディエイト⇒入力⇒enterでもう一回調べてみました。 ?rangTo.Parent.Name⇒実行時エラー 424 オブジェクトが必要です ?rangTo.Address⇒実行時エラー 424 オブジェクトが必要です ?ixRow⇒1 ?ixCol⇒1 ?c.Address ⇒$B$6 ?c.Parent.Name⇒要録用出席簿1年 です。 (ヨッシー) 2018/01/18(木) 04:52 ---- う~ん、なんででしょうね。・・・ ?rangTo.Parent.Name⇒実行時エラー 424 オブジェクトが必要です ?rangTo.Address⇒実行時エラー 424 オブジェクトが必要です って出ていることから、Range型の変数「rangTo」がNothingになっていると推測されて、 '転記先基準セルの取得 Set rngTo = Worksheets(r.Cells(1).Value).Range("G80") ココ↑の、特に「r.Cells(1).Value」がうまくいってないんだろうなぁ・・とおもうんですけど、存在しないシート名になってたらそこでエラー停止するようにおもうんですよね・・・ ちなみに、Set rngTo = Worksheets(r.Cells(1).Value).Range("G80") のところにブレークポイント設定してから実行してみて、黄色くハイライトされているときに「r.Cells(1).Value」のところにマウスポインタ合わせたらなんて出ます? ※何も出なかったら、イミディエイトに?r.Cells(1).Value って入力して結果を教えてください。 (もこな2) 2018/01/18(木) 09:53 ---- イミディエイトウィンドウで1行だけ実行しても、 変数に代入するコードがないので、当然オブジェクトが必要ですとなります。 プロシージャを実行中にエラーで止まった時は、 デバックでもどれば、変数に代入されているのでエラーにならないはずです。 なので、エラーが出たからと言って、プロシージャを手動で終了しては意味がないです。 デバッグでプロシージャが実行中の状態のままVBEの画面にもどって、 間違いを探ってください。 =========================================================================== >↑の部分についてApplication.Rangeって記述があるのは知ってるんですけど、 >イマイチ私が理解できてない .Range("A6") ↑これには既に親オブジェクトの情報も含まれてます。 .Range(.Range("A6") ↑これだと対象シートのセル範囲(対象シートのセル範囲のA6セル) と冗舌な感じになるので、個人的にこういうRangeプロパティの 引数に親オブジェクトの情報が含まれる場合は、 application.range と書いてます。 この辺は好みの問題かと思います。 ========================================================================== セルの位置関係がどうしても上手く行かない場合は、 「敢えてSelectしてみて可視化する」というのもありと思います。 Sub test2(ByVal wsFrom As Worksheet, ByVal ixRow As Long) Dim rngFrom As Range Dim rngTo As Range Dim r As Range Dim c As Range Dim ixCol As Long '転記対象のデータはA6からデータ最終行までの7列分 With wsFrom Set rngFrom = Application.Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 7) End With '行毎に繰り返す For Each r In rngFrom.Rows r.worksheet.select r.select '転記先基準セルの取得 Set rngTo = Worksheets(r.Cells(1).Value).Range("G80") '転記列番号初期化 ixCol = 1 'コピーは1列目は不要なのでセル範囲を必要範囲に狭めた範囲で繰り返す For Each c In r.Resize(6).Offset(, 1).Cells c.select '基準セルからの相対位置で転記先を取得して転記 rngto.worksheet.select rngTo.Cells(ixRow, ixCol).select rngTo.Cells(ixRow, ixCol).Value = c.Value '次の転記列番号(7つ飛び) ixCol = ixCol + 7 Next Next End Sub ステップ実行で、意図通りのセルが指定できているか確認してみてください。 あと、自分はパソコンの前に座らない日があるので、 いつも書き込みが出来るとは限りませんのでご了承願います。 とにかく、動かしてみて、出来た出来ないではなく、 一行一行の意味を理解し、自分の意図あるいは意思に沿った、 文章になっているか確認してプログラムを作ってください。 http://www.ken3.org/vba/excel-help.html (まっつわん) 2018/01/18(木) 10:14 ---- >まっつわんさんへ なるほど、Application.Rangeってすれば、引数の親オブジェクトを引き継ぐから、いちいち自身の親オブジェクトを記述する必要はないってことですね。 Range1とRange2の親オブジェクトが違ったらどうなるのかなと思ってやってみたら普通にエラーになったので、そこはきちんと辻褄があってないと駄目なのはApplication.Rangeだろうと、[親オブジェクト].Rangeだろうと代わりはないということですね。大変勉強になりました。フォローありがとうございます。 (もこな2) 2018/01/18(木) 11:57 ---- まっつわんさん、ありがとうございます。 >とにかく、動かしてみて、出来た出来ないではなく、 一行一行の意味を理解し、自分の意図あるいは意思に沿った、 文章になっているか確認してプログラムを作ってください。 その通りですよね。何度も、一行ずつ見て理解しようとしているのですが、正直言って、わからないことだらけでおいついていません。すいません。いろいろ調べながら理解していこうと思います。 とりあえず、まっつわんさんが提示してくださったプログラムをコピーして、実行してみました。 「c.select」がハイライトになり、「実行時エラー 1004 rangeクラスのselectメソッドが失敗しました」と出ました。 >プロシージャを実行中にエラーで止まった時は、 デバックでもどれば、変数に代入されているのでエラーにならないはずです。 なので、エラーが出たからと言って、プロシージャを手動で終了しては意味がないです。 デバッグでプロシージャが実行中の状態のままVBEの画面にもどって、 間違いを探ってください。 どのように間違いをなおせばいいのかわかりません。教えてください。お願いします。 (ヨッシー) 2018/01/19(金) 03:31 ---- エラーメッセージをもとに調べてみました。「selectの前に対象シートをactivateしなければいけない」とありました。ちょっとチャレンジしてみます。 (ヨッシー) 2018/01/19(金) 03:52 ---- あぁ、ループするから、2回目からはシートの選択からしないとだめですね。 セルの選択はアクティブなシートでしか出来ないので、 セルを選択するにはまずはシートを選択しなければなりません。 一度にセルを選択する命令もありますが(別途勉強してみてください。)、まぁ、こういうことは、 いつか躓くことなので、「知っておく」必要がある事柄だと思います。 (まっつわん) 2018/01/20(土) 10:09 ---- まっつわんさん、教えていただいた最初のコードを1行1行日本語に置きかえて、理解しようとしています。 Sub メイン2() Dim ws As Worksheet Dim ix As Long 'Application.ScreenUpdating = False For Each ws In Worksheets(Array("要録用出席簿1年", "要録用出席簿2年", "要録用出席簿3年" _ , "要録用出席簿4年", "要録用出席簿5年", "要録用出席簿6年")) ix = ix + 1 Call test2(ws, ix) Next End Sub 基本的なことですいません。変数を日本語に置きかえようとしているのですが、なんとなく「これ」を指しているのではないかと思うのですが、はっきり「間違いない」と言えないのです。必要な変数は、日本語にすると、「要録用出席簿」「氏名ワークシート」「コピー行」「コピー列」「貼付行」「貼付列」などと思いますが、教えていただけませんか。 Sub test2(ByVal wsFrom As Worksheet, ByVal ixRow As Long) Dim rngFrom As Range Dim rngTo As Range Dim r As Range Dim c As Range Dim ixCol As Long '転記対象のデータはA6からデータ最終行までの7列分 With wsFrom Set rngFrom = Application.Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 7) End With '行毎に繰り返す For Each r In rngFrom.Rows '転記先基準セルの取得 Set rngTo = Worksheets(r.Cells(1).Value).Range("G80") '転記列番号初期化 ixCol = 1 'コピーは1列目は不要なのでセル範囲を必要範囲に狭めた範囲で繰り返す For Each c In r.Resize(6).Offset(, 1).Cells '基準セルからの相対位置で転記先を取得して転記 rngTo.Cells(ixRow, ixCol).Value = c.Value '次の転記列番号(7つ飛び) ixCol = ixCol + 7 Next Next End Sub (ヨッシー) 2018/01/21(日) 04:47 ---- まっつわんさん、何度もすいません。「bybal」が「値渡し」だということはわかったのですが、このコードでどんな役割をしているのかわかりません。 (ヨッシー) 2018/01/21(日) 05:24 ---- まっつわんさん、何度も何度もすいません。やっとできました。 「 For Each c In r.Resize(6).Offset(, 1).Cells」を 「For Each c In r.Resize(1,6).Offset(, 1).Cells」にしてみたら、きちんと入りました。 でも、変数の日本語版が知りたいです。 (ヨッシー) 2018/01/21(日) 05:40 ---- >このコードでどんな役割をしているのかわかりません。 考え方を別にしているだけです。 値の転記は値の転記をすることだけに集中して考えます。 1個のプロシージャに全部盛り込むと、 少しの変更でプロシージャ全体に影響を与えるかもしれません。(与えないかも知れませんが) こういう部品(転記するという部品)を作っておけば、 必要な時に呼び出して使えますし、メインの流れと切り離して論理的解法を考えることが出来ます。 >変数の日本語版が知りたいです。 意味が解りかねます。 変数を日本語で宣言した方が解りやすいという話でしょうか? 確かに僕も英語は嫌い(はっきり言って読みたくない)ですが、 コードを書いていて日本語とアルファベットを切り替えるのは、 そんな重いを吹き飛ばすぐらい難儀なことです。 でも、転記元「から(Form)」、転記先「へ(To)」って結構イメージしやすいかなと思っているのですが。。。 あと、RngはRangeの略 ixは、インデックスの略(ixRowで行番号) cはCellの略 という意味で使ってます。この辺は個人のローカルルールで命名してます。 >「For Each c In r.Resize(1,6).Offset(, 1).Cells」にしてみたら、きちんと入りました。 あぁ、すみません。 For Each c In r.Resize(,6).Offset(, 1).Cells と書きたかったのですが、カンマを1つ忘れてますね。タイプミスです。すみませんm(_ _)m なかなか、デバッグなしのコードを書くのは難しいですね。 (まっつわん) 2018/01/22(月) 09:09 ---- >「bybal」が「値渡し」だということはわかったのですが、 >このコードでどんな役割をしているのかわかりません。 あ、あえてbyvalとかく理由の話だったでしょうか? 今回の場合、 ByRefでも、省略しても結果は同じだと思いますが、 こういうのは習慣なので、いつも意図を明確に書く癖を付けておきたいという、 個人的な理由です。 いつか、いつもの癖で省略してかいて、そのことで不都合が出て来ても、 省略がbyRefの意味になるからバグが発生しているということに気づかないということが、 起きないないためにいつも明示して書いています。 そして、byRefである必要が無い場合はByvalを必ず明示するということも、 個人的なルールとして決めていることです。 全ては、少しでもデバッグの量を減らすためです。 そういうルールが、いつ役に立つかはわかりませんので、ご自分で判断して取捨選択してください。 (まっつわん) 2018/01/22(月) 09:20 ---- まっつわんさん、長い間ありがとうございました。退職前の57歳の男が、現場の仕事を少しでも楽にしようという思いでこの学校に投稿して、マクロを色々教えてもらいました。今、教えていただいたマクロの1行1行の意味を確かめていっています。自分のようにマクロを初めて見た者が、少しでも理解できるようにしておきたいです。 今回、まっつわんさんから教わったことで、いろいろなことがわかりました。私は、残念なことにマクロを書くことはできません。ですが、やりたい作業を1文1文書き出したうえで、考えたり、投稿したりすることが大切だということをあらためて知りました。 まだ、いくつかやってみたいことがありますが、その時は、どうぞよろしくお願いいたします。 本当にありがとうございました。 (ヨッシー) 2018/01/23(火) 00:45 ---- >変数の日本語版が知りたいです。 あぁ、こういうことかな。。。 少し変えました。 Option Explicit Sub メイン() Dim wsCollection As Worksheets '操作対象のシートの集まり Dim ws As Worksheet 'シートの集まりを構成する要素(各シート) '操作対象のシートの集まりを取得 Set wsCollection = Worksheets(Array("要録用出席簿1年", "要録用出席簿2年", "要録用出席簿3年" _ , "要録用出席簿4年", "要録用出席簿5年", "要録用出席簿6年")) '各シート毎に繰返し For Each ws In wsCollection Set転記 ws Next End Sub '***************************************** '転記のサブルーチン '第一引数:wsFrom 元データのシート '******************************************* Private Sub Set転記(ByVal wsFrom As Worksheet) Dim rngFrom As Range '転記する元のデータのセル範囲 Dim r As Range '転記元の各行 Dim rngTo As Range '転記先のセル範囲 Dim ixRow As Long '転記先の行の相対位置 With wsFrom '転記元のデータのセル範囲 Set rngFrom = Application.Range(.Range("A6"), .Cells(.Rows.Count, "A").End(xlUp)) _ .Resize(, 6).Offset(, 1) 'シート名から学年を抽出(行の書き出し位置に利用) ixRow = Val(Right(.Name, 2)) End With 'データのセル範囲の行の集まりに対して行毎に繰り返す For Each r In rngFrom.Rows '転記先のセル範囲を取得(シートの指定も含む) Set rngTo = Worksheets(r.Cells(1, 0).Value).Range("G80").Resize(6, 42) '各セルの値を転記(7列おき) rngTo(ixRow, 1).Value = r.Cells(1).Value rngTo(ixRow, 8).Value = r.Cells(2).Value rngTo(ixRow, 15).Value = r.Cells(3).Value rngTo(ixRow, 22).Value = r.Cells(4).Value rngTo(ixRow, 29).Value = r.Cells(5).Value rngTo(ixRow, 36).Value = r.Cells(6).Value Next End Sub こういうのは、コピペして実行してみるだけでなく、 印刷してキーボードから文字を入力した方が頭に入るし、 また、そうすることで別の発見(工夫している点)などが見つかるかも知れません。 (基本的に全部小文字で入力してみてください。) 自分で新たに書く場合はコピペは出来ないわけですから。 (まっつわん) 2018/01/23(火) 08:34 ---- >私は、残念なことにマクロを書くことはできません。 いやいや、所詮マクロなんてただの説明文です。 日本語では説明出来るはずです。 マクロは書けるはずです。 あとは、エクセル君に解る言葉に翻訳してあげるだけです。 学校の先生なら僕より頭がいいはずです。 英語も苦手ではないでしょうし、数学的素養もあるでしょう。 そして文法は日本語にかなり近いです。 所詮、VBAのプログラムなんて、 論理的な解法を見つけて、その作業手順の説明を書くだけです。 そんなに難しいことではないです。 ただし、バグの無いプログラムを一発で書くことは、 慣れた人でも難しいです。 バグ取りはホント根気のいる作業です。 そういうことが楽しいと思える人でないと、 プログラムミングすることには向いてないかも知れませんね。 (まっつわん) 2018/01/23(火) 08:45 ---- まっつわんさん、重ね重ねありがとうございます。年齢を理由にして、「自分では無理だから、わかっている人に聞いてしまえ。」的な気持ちになってしまっていたのかもしれません。頭は決して良くありませんが、根気はまだあります。(少しというかだいぶ年ですが・・) 今度「こんなことをやってみたい」という場面に出くわしたら、まずは、一つ一つ、順番に、日本語で表してから、なんとかできるところまで、自分で書いてから投稿するようにしてみます。(マナさんという方にもそう言われました。) この学校で教えていただいたマクロが5つあり、どれも学校での作業にかなり活用し、作業の軽減をさせてもらっています。今そのマクロの1行1行を、過去のやりとりをもう一度読みながら、理解しようと努力しています。そのやり取りの中に「まっつわんさん」の投稿もありました。今読み返すと、とても大事なことを教えてくださっているのに、その当時は、理解できずスルーしてしまっていました。すいませんでした。 今回の投稿で、いろいろなことを学ばせてもらいました。 忙しいまっつわんさんだと思いますが、時間がありましたら「バグ取り」についてまた教えてください。 (ヨッシー) 2018/01/23(火) 11:32 ---- >その当時は、理解できずスルーしてしまっていました。すいませんでした。 先生なんてものは、必要になったら出会います。 スルーされたのだとしたら必要とされてなかったのでしょう。 >忙しいまっつわんさんだと思いますが、 暇すぎてサボっています。 なので掲示板の回答を考えるか、パソコンの無いところに旅立っています^^; また新たなテーマがあれば、時間があれば一緒に考えてみます。 >時間がありましたら「バグ取り」についてまた教えてください。 こんかいほとんどのテクニックを紹介した気がします。 あとは、「掲示板で聞く」だけでなく「自分でWebで調べられる」ようになってください。 回答を待っている時間、指示待ちになって無駄に過ごしてませんか? 試行錯誤して、 自分で調べられるようになることが上達のコツです。 掲示板で聞くことがほぼなくなれば、脱初心者でしょう^^ と偉そうに能書きたれている僕も万年初心者なんですが^^; (まっつわん) 2018/01/23(火) 16:55 ---- まっつわんさん、 >「掲示板で聞く」だけでなく「自分でWebで調べられる」ようになってください。 この文章、肝に銘じます。 ありがとうございました。 (ヨッシー) 2018/01/23(火) 18:37 ---- まっつわんさん、すいません。いろいろ調べてみたのですが、どうしてもわからないので教えてください。 新しく提示してもらった次のコードでエラーが発生します。 >Sub メイン() Dim wsCollection As Worksheets '操作対象のシートの集まり Dim ws As Worksheet 'シートの集まりを構成する要素(各シート) '操作対象のシートの集まりを取得 Set wsCollection = Worksheets(Array("要録用出席簿1年", "要録用出席簿2年", "要録用出席簿3年" _ , "要録用出席簿4年", "要録用出席簿5年", "要録用出席簿6年")) '各シート毎に繰返し For Each ws In wsCollection Set転記 ws Next End Sub 「 Set wsCollection = Worksheets~」の所で、「型が一致しません」というエラーが出ます。それで、 「Dim wsCollection As Worksheets」の「worksheets」の「s」かなと思い、削除してみました。ですが、同じエラーが出ます。「set 変数名=値」の形になっているので、問題ないと思うのですが・・・。 あと、「 Set転記 ws」のコードが、「set 変数名=値」の形になっていないので、このままでいいのかわかりません。「call」しなくてもいいのですか? (ヨッシー) 2018/01/25(木) 17:10 ---- 回答代理 ^^ Dim wsCollection As Worksheets ↓ Dim wsCollection As Object で動くのは動きますよ。 >。「call」しなくてもいいのですか? 大丈夫です。 詳しい内容は解りませんので まっつわんさん もしくは、他の回答者様 のレスをお待ちください。 (隠居じーさん) 2018/01/25(木) 18:07 ---- ねこの手でもよければ・・・ >Set wsCollection = Worksheets(Array("要録用出席簿1年", "要録用出席簿2年", "要録用出席簿3年" _ > , "要録用出席簿4年", "要録用出席簿5年", "要録用出席簿6年")) を使いたいのなら Dim wsCollection As Worksheets ↓ Dim wsCollection As Sheets で動きます。 隠居じーさんさんの回答のようにObject型を指定しても動きます。 紛らわしいのですがWorksheetsプロパティの戻り値はWorksheetsコレクションではなく、Sheetsコレクションですので、 それを格納する変数の型もSheetsコレクションに合わせれば動きます。 この辺は、オブジェクトブラウザなりMSDNを引けばわかります。 >あと、「 Set転記 ws」のコードが、「set 変数名=値」の形になっていないので、このままでいいのかわか >りません。「call」しなくてもいいのですか? 『Set転記 ws』はSet転記というSubプロシージャの引数に変数『ws』を指定して呼び出しています。 オブジェクト変数に値をセットしているわけではないのでそのままで良いです。 Callを使いたい場合は、下記のように書けばよいかと思います。 Call Set転記(ws) とにかく、HelpとかオブジェクトブラウザとかMSDNを活用できるようになると作業が捗りますよ~ # (ねこの手) 2018/01/25(木) 20:46 ---- あぁ、ごめん。 型宣言が間違ってました。 Sheetsという型で変数を宣言してください。 Objectで宣言するとインテリセンス機能が効かないので、 英語嫌いには不便です。 callステートメントは省略可能です。 callがあった方が呼び出している感じがしていいと思いますが、 まぁ、省略もできるよという話です^^ (まっつわん) 2018/01/26(金) 09:30 ---- >あと、「 Set転記 ws」のコードが、「set 変数名=値」の形になっていない この場合はプロシージャの名前としてのSetです SetとかSet up(置くとか配置する)という意味で、 プロシージャの名前に接頭辞的に付けてます。 サブルーチンの機能を端的に表現しています。 (返り値があるものはGetにしています。個人ルール) そうすることで、 「set」と入力して Ctrlキー+Spaceキーで、 候補が出ます。 変数名も同じことです。 そうすることで、日本語と英語の切り替えを極力減らして作業出来るようにします。 また、アルファベットで大文字と小文字を組み合わせておくことで、 小文字でタイピングして、大文字に変わらなければタイプミスしていることになるので、 そいうのもタイプミスを早く見つけらる工夫です。 (まっつわん) 2018/01/26(金) 10:11 ---- まっつわんさん、教えていただいた一番目のマクロの意味を色々調べながら一応理解できました。(少しわからないところもあるのですが・・) それで、2番目に教えていただいた「Selectしてみて可視化する」マクロを確かめています。 >「ループするから、2回目からはシートの選択をしないとだめですね」 というアドバイスの所で、次のようにしてみたら、きちんと動きました。これであっていますか? > wsFrom.Select c.Select です。 >「一度にセルを選択する命令もある。」 というアドバイスで、色々調べたところ、「Ctrl+Shift+*」でマクロの記録を行ってみたところ、 「Selection.CurrentRegion.Select」と記録されたので、次のように入れてみました。 >wsFrom.Select Selection.CurrentRegion.Select c.Select このコードでも動きましたが、アドバイスの意図とは違いますか? (ヨッシー) 2018/01/27(土) 07:12 ---- まっつわんさん、最後に教えていただいたマクロで実行したところ、動いたのですがデータが1つもはいりませんでした。そこで、F8でステップインで確認したところ、ループしてもixRowの値がValで返された0のままだったので、 「For ixRow=1 To 6」を加えて、実行したところきちんと転記されました。 これでいいと思いますが、どうでしょうか? (ヨッシー) 2018/01/27(土) 16:53 ---- > Selection.CurrentRegion.Select > c.Select >このコードでも動きましたが、アドバイスの意図とは違いますか? 変数に代入されたセルのアドレスが意図通りになっているかの確認ですので、 エラーが出るかどうかなんてあんまり意味がない(エラーが出たら実行できないですが。)ので、 意図通りにセルが選択できるか、が重要です。 その時に他のセルを選択しては、混乱しませんか? ステップ実行をしながら目視で確認して、セルの選択でエラーが出たなら、 手動でシートをSelectしてアクティブにするのを手伝ってあげてもなんら不都合はありません。 どうやればデバッグが簡単になるかの話ですので、 デバッグが必要でないなら試す価値はないです。 > 「For ixRow=1 To 6」を加えて、実行したところきちんと転記されました。 > これでいいと思いますが、どうでしょうか? それがあなたの意図あるいは意思ですか? 「こうやりたい」という文章を書けているならそれでいいのでは? こう書かなければならないということもないです、あなたの意思が他人(今回はエクセル君)に 通じていればOKです。(まぁ、半年後に自分で読んで理解できるかはまた別の話です。) ただ、「1年生」という文字列を下請の「Set転記さん」(=サブルーチン)に、 渡すのでその情報から「1」取り出せれば、 「1年生」と「1行目」という情報を2重に伝えなくても、意図が伝わって欲しいなと思いませんか? まぁ、そういう意図で僕は書きました。 (上手く文字列から数値を取り出せなかったみたいですが^^;;) (まっつわん) 2018/01/30(火) 10:22 ---- まっつわんさん、 >その時に他のセルを選択しては、混乱しませんか? >デバッグが必要でないなら試す価値はないです。 わかりました。 >ただ、「1年生」という文字列を下請の「Set転記さん」(=サブルーチン)に、 渡すのでその情報から「1」取り出せれば、 1年生」と「1行目」という情報を2重に伝えなくても、意図が伝わって欲しいなと思いませんか? 「Right関数」で「要録用出席簿1年」から「1年」をとりだし、「Val関数」で数値に置き換えていると理解しています。「1年」からさらに「1」取り出すにはどうしたらいのでしょうか。 (ヨッシー) 2018/02/01(木) 02:44 ---- まっつわんさん、調べてLeft関数が左端からの数字をとり出せることがわかりました。 ixRow=Left(Right(.Name,2),1) ということでしょうか。 (ヨッシー) 2018/02/01(木) 03:05 ---- 、「Val関数」で数値に置き換えていると理解しています なら ixRow=Left(Right(.Name,2),1) ↓ ixRow = Val(Left(Right(.Name, 2), 1)) なのでは。 (隠居じーさん) 2018/02/01(木) 06:52 ---- すみません。 追記です 要録用出席簿1年の1が全角なら上記コードではゼロが返ります半角に変換してから数値変換 と言う事で ^^; m(__)m (隠居じーさん) 2018/02/01(木) 08:08 ---- >まっつわんさん、調べてLeft関数が左端からの数字をとり出せることがわかりました。 >ixRow=Left(Right(.Name,2),1) >ということでしょうか。 ん~エラーにならないならいいかもしれませんが、 エクセル君が勝手に解釈してくれて、助けられているのを意識しておいてください。 Left関数は、 与えられた文字列のうち、左から指定された文字数分切り出します。 返す答えは文字列です。 Val関数は、 与えられた文字列から、数値として有効なデータを返します。 なので、この関数を使えるかと思いましたが、全角の数字を数値に変換してくれないとは迂闊でした^^; 例えば、 「7文字目が必ず数字」なら、 MsgBox CInt(Mid(StrConv("要録用出席簿1年", vbNarrow), 7, 1)) とかでもいいでしょう。 (まっつわん) 2018/02/01(木) 08:12 ---- 隠居じーさんさん、まっつわんさん、ありがとうございます。所用で返信を見ることができず、今見ています。教えていただいたことをたるしてみます。 (ヨッシー) 2018/02/05(月) 03:15 ...
https://www.excel.studio-kazu.jp/wiki/kazuwiki/201801/20180113094023.txt - [detail] - similar
PREV NEXT
Powered by Hyper Estraier 1.4.13, with 97054 documents and 608268 words.

訪問者:カウンタValid HTML 4.01 Transitional