マンガでよめる痔のこと・薬のこと

1つのフォルダの中に生徒数分のブックがあり、その他に集計用のブックがあります。
生徒用ブックが20、集計用が1つあると思ってください。
集計用ブックには参照元の生徒用ブックの点数等が自動的に反映するようにしたいと思います。

表は、B1から列横に生徒の名前、
A2から下にテスト項目、
B列2行目から下に各々の生徒の成績が反映されていると思ってください。

1行目の生徒名も、成績の点数も、生徒のブックをいじると
自動的に集計用ブックに反映されるようにしたいのです。

自分で使用するなら、後が面倒でも簡単な方法を採るのですが、
私は元を作るだけで、それぞれ講師の先生に渡して使って貰うので、
なるべく自動的に反映されるようにしたいと思っています。

今、仮にブック名をstudent1と付けていても、実際には生徒名を付けるでしょうし、
シート名も代わる可能性があります。

使用するシートの表形式は、基本的に生徒用も集計用も全く同じにします。
ただ、集計用に関しては、生徒の成績の欄が横にずらずら~と長くなるイメージです。

リンクでやると、ブック名が変わるたび
毎回リンクの変更更新をしなければいけないので、
作業が面倒になります。
すると、マクロでないと出来ないと聞きました。
使用エクセルは2003です。

こんな面倒な質問に答えて頂ければ幸いです。
やりたいことが伝え切れているか不安ですが、不明点を記載して頂ければ補足します。

どうか、宜しくお願い致します。

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

A 回答 (3件)

>エクセルど素人なので、どうしたらよいか、具体的にコードや方法を教えて頂けると助かります。



一般的なマクロの操作や動作確認と言う事であれば別ですが、すでに運用されているシステムの場合
実際のシート構成、保存フォルダー、運営方針・ルールなどの詳しい情報がないと具体的なコードの提示と言うのは無理です

たとえコードの提示が出来たとしても、実際に保守運営を行う方が理解されていないと細かな修正も出来ません、何かしらの不具合が出来てこの場に再度質問を行ったとしても、前回コードを提示した回答者が必ず回答を行うわけではないため、余計ややこしくなる可能性があります
    • good
    • 0

エクセルではシートやブックを別にすると、途端にまとめなどがむつかしくなる。

エクセルの経験が少ないからそういうことをすると思う。質問のようなことは、質問者がVBAでも出来ないと出来ないおもう(仕事にエクセルを使い出すとVBAが出来ることが必須だろう)質問者は簡単なVBAでも作った経験あるのかな。
ーー
次善の策として、生徒数分の各シートに、まとめて、シートの3D集計や、統合などの機能を使うようにすべきでしょう。
そのためにはVBAのお世話になる必要があるかもしれないが、まだコードは比較的簡単と思う。
ーー
疑問
>1つのフォルダの中に生徒数分のブックがあり
>表は、B1から列横に生徒の名前、
  は矛盾するようで良くわからない。
表は、下記のように取れるが
ーーー田中  鈴木 木村 ・・・
国語 20 30 25
算数 30
理科
・・・
ならブックは生徒別が必要ないのでは?
質問には文章でくだくだ書くばあかりでなく、簡単なシートの列や行のデータ実例を挙げて質問すること。
ーー
一案(質問の自動という点ではない)
かりに自動でブック名が変わったとして、どういう機能で集計なりを出そうというのか?目算はあるのか?
ピボットテーブルという機能がある。
これは別の複数ブックを指定できる。
点数1.xls
ーー田中木村鈴木
国語203540
算数303050
社会404020
ーー
点数2.xls
田中木村鈴木
国語203040
英語405020
算数202020
ーー
ピボットで合計すると
合計 / 値2列
行田中木村鈴木総計
英語405020110
国語406580185
算数505070170
社会404020100
(空白)
総計170205190565
操作の途中で
統合するワークシートの範囲を指定してください、で
[点数1.xls]Sheet1!$A$1:$D$5
[点数2.xls]Sheet1!$A$1:$D$5
のように別ブックを指定できる。
20ブックもあると指定が大変だが、仕方がない。どこかにこの20行の範囲を作っておき、作業の前に変わってないかチェックするしかなかろう。
ピボットは合計だけでなく、いろんな計数をだすことが出来る。
体裁についても色々できる。
こういうのでも活用してやるほか無いでしょう。
点数1.xls]Sheet1!$A$1:$D$5
などを変えたときは、ピボットの操作者が変えないと自動では変わらないでしょう。

たやすく自動というがプログラムのプロの仕事であって生易しいものではない。
関数におけるデータ変更で結果が自動で変わることぐらいが自動の場面と思っていて丁度良い。

この回答への補足

ありがとうございます。
私の実力では無理だと思いながらも、上司の無茶な命令にとにかく出来るところまでやってみようと、言う状態です。
ピボットテーブルを使うのも手ですね。
ブックを別にしているのは、個々の成績の分析、グラフ化した物を受講者別に管理しているからで、生徒数分のブックと集計ブックを用意するのは、今回のミッションでは必須なのです。ピボットテーブル試してみます。
細かく教えて頂き、ありがとうございます。

またお礼を書きたくなった時に、書くところが無くなると困るので、補足に記載しました。ご容赦ください。

補足日時:2011/04/05 10:01
    • good
    • 0

根本的なことですが


ブック名を変更した場合、マクロであっても変更したブック名にコードの中身を書き換える必要が出てきます

※Sheet名が変更になる分にはSheet(1)とそのブック内の何番目のシートと指定する事でシート名が変更になっても対応は可能(シートの並び順を変えたり、追加・削除をしない限り)

ブックの名前付けのルール自体を取り決める必要があります
例:
1.集計用のブックを作成
2.集計用ブックの生徒名から生徒別のブックの作成
3.生徒別のブック名の変更、保存先フォルダーの変更禁止
4.生徒用ブックのシートは削除や追加、並び順変更の禁止
※3と4は運営ルール、2はマクロで自動作成

こんな形で

この回答への補足

なるほど、やはり自動的に、と言うわけにはいかないと言うことですね。

エクセルど素人なので、どうしたらよいか、具体的にコードや方法を教えて頂けると助かります。
現状のベストの方法で、構いません。

補足日時:2011/04/04 16:19
    • good
    • 0

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

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

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

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

Qエクセルマクロで不特定なファイル名を使用するには

初めて質問します。
不適切があれば申し訳ございません。

教えていただきたいです。
ファイル名が日々変わる場合、以下のマクロを使用した際に
ファイル名が変ったとしてもマクロが実行できるようにするにはどうすれば良いでしょうか?
ファイル名が変るのが"日別進捗_20140814.xlsx"の日付の所です。

初歩的で誠に申し訳ございません。
教えていただければ幸いです。


-----------------------------------------------------------


Sub Macro1()
'
' Macro1 Macro
'

'
Sheets("Sheet2").Select
Windows("日別進捗_20140814.xlsx").Activate
Cells.Select
Selection.Copy
Windows("Book1.xlsm").Activate
Cells.Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Range("A1").Select
Sheets("Sheet1").Select
Range("D15").Select
End Sub

初めて質問します。
不適切があれば申し訳ございません。

教えていただきたいです。
ファイル名が日々変わる場合、以下のマクロを使用した際に
ファイル名が変ったとしてもマクロが実行できるようにするにはどうすれば良いでしょうか?
ファイル名が変るのが"日別進捗_20140814.xlsx"の日付の所です。

初歩的で誠に申し訳ございません。
教えていただければ幸いです。


-----------------------------------------------------------


Sub Macro1()
'
' Macro1 Macro
'

'
Sheets("Sheet2").Select
Wi...続きを読む

Aベストアンサー

開いているファイルが「日別進捗_日付"の形で日付の部分が作業日でしたら

FileName = "日別進捗_" & Format(Date, "yyyymmdd") & ".xlsx"


開いているエクセルファイルがBook1.xlsmと該当ファイルしかないのでしたら

For i = 1 To Workbooks.Count
If Workbooks(i).Name <> "Book1.xlsm" Then
FileName = Workbooks(i).Name
End If
Next

で、FileNameに該当ファイル名が取得できますので

Windows(FileName).Activate

としてください。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qフラグについて

loop文等で、よくフラグを立てろといわれるんですが、意味もわからないし、
何の為に、どのように使うんでしょうか?教えて下さい。

Aベストアンサー

まず、「フラグを立てろと」ということですが、
意味は、条件に対する結果だとおもってください。
すると「何の為に」が条件

Loop構文だと
ループ(繰り返し)を終わる条件を  満たよ/満たしていないよ(フラグ)
ということになります。

※注 Do Loop の場合は繰り返す条件または、繰り返しを終わる条件を指定できます。 

例題で考えます。

「例題1」
最初に入力した文字と同じ文字を入力するまで、何度でも再入力を要求するプログラムを作る。


「考え方」
最初に入力した文字と同じ場合にループを終わる。

ループ(繰り返し)を終わる条件 = 最初に入力した文字と同じ場合
満たよ/満たしていないよ(フラグ)= 最初に入力した文字と同じ場合

になる。

解答Aと解答Bを用意しました。解答Bの方が質問の解答に、あってますが
例題の解答としては、Aの方がシンプルです。解答Bの場合に、なる場合は
大抵終わる条件が複数ある場合です。


「解答A」

Private Sub Form_Load()

Dim sStr As String
Dim sLoopStr As String
Dim lCnt As String

sStr = InputBox("文字をいれてください。")


Do Until sStr = sLoopStr

sLoopStr = InputBox(sStr & "と同じ文字を入力したらループを抜けます。" & lCnt & "回目")

Loop

  End

End Sub


「解答B」

Private Sub Form_Load()

Dim sStr As String '最初
Dim sLoopStr As String '2回目以降
Dim lCnt As String '回数

Dim bFlg As Boolean 'フラグ

sStr = InputBox("文字をいれてください。")

bFlg = False
lCnt = 1

Do Until bFlg = True

sLoopStr = InputBox(sStr & "と同じ文字を入力したらループを抜けます。" & lCnt & "回目")

If sStr = sLoopStr Then
bFlg = True 'フラグを立てる
End If

    lCnt = lCnt + 1

Loop

End

End Sub

そこで、条件を複数にします。

「例題2」

例題1に回数制限をつけます。5回間違えたら入力した文字にかかわらず終了します。

解答は、以下のようにします。

Private Sub Form_Load()

Dim sStr As String '最初
Dim sLoopStr As String '2回目以降
Dim lCnt As String '回数

Dim bFlg As Boolean 'フラグ

sStr = InputBox("文字をいれてください。")

bFlg = False
lCnt = 1

Do Until bFlg = True

sLoopStr = InputBox(sStr & "と同じ文字を入力したらループを抜けます。" & lCnt & "回目")

If sStr = sLoopStr Then
bFlg = True 'フラグを立てる
End If

If lCnt = 5 then
bFlg = True 'フラグを立てる
End If

    lCnt = lCnt + 1

Loop

End

End Sub

まず、「フラグを立てろと」ということですが、
意味は、条件に対する結果だとおもってください。
すると「何の為に」が条件

Loop構文だと
ループ(繰り返し)を終わる条件を  満たよ/満たしていないよ(フラグ)
ということになります。

※注 Do Loop の場合は繰り返す条件または、繰り返しを終わる条件を指定できます。 

例題で考えます。

「例題1」
最初に入力した文字と同じ文字を入力するまで、何度でも再入力を要求するプログラムを作る。


「考え方」
最初に入力した文字と同じ場...続きを読む

Qエクセルで重複しているデータの抽出のしかたを教えてください。

エクセルで重複しているデータを抽出したいのですが・・。なにぶん初心者なもので簡単な方法があればよいのですが・・。
A列に日付 B列に企業名このデータが300件ほどあります。

 Å列      B列
1月 1日    AAAA社
1月 4日   BBBB社
1月 8日   CCCC社
2月 1日   BBBB社
2月20日    DDDD社
3月 2日   AAAA社

と、あるとしてB列の企業名が重複しているものを抽出したいのですが・・・。この場合 AAAA社とBBBB社ですが。
これを簡単に抽出する方法はないでしょうか?
教えてください お願いいたします。

Aベストアンサー

企業名がセルB2からセルB300まで入力されていると仮定します。
セルC2に IF(COUNTIF($B$2:B2,B2)>1,"*","") を入力し、セルC300までコピーして下さい。すると重複したデータの二番目以降に "*" のマークが付きます。
(注) 数式を下のセルまでコピーするため、COUNTIF($B$2 は絶対参照にして下さい。

QExcelVBAでBookを開く時にファイル名の一部だけを指定で

VBA初心者です。
ExcelVBAで決まったフォルダーのファイルを開きたいのですが、ファイル名が固定した文字+日付になっているため、この固定した文字だけでこのファイルを開く方法を教えて下さい。このフォルダーには2つファイルがありますが、もう1つは全く違うファイル名です。

Aベストアンサー

> ワイルドカード"*"はどんな時に使えるのですか

Dir関数を使用時の"*" (アスタリスク) および "?" (疑問符) のワイルドカード文字については、
VBAのヘルプを参照し、特に「使用例」のコードを理解してください。

その他 VBAでの ワイルドカード使用に関しては、ヘルプで Like で検索して、
Like 演算子 を参照し、同じく「使用例」のコードを理解されたら宜しいかと思います。


> 通常のOPENメソッドでの> ファイル名指定では使えないと思うのですが。

Workbooks.Openメソッドの1番目の引数は、ファイルが特定出来るように指定する必要が
ありますので、当然 ワイルドカード文字は、使用出来ません。

殆ど、フルバスで指定します。 もし、パス名を省略すると カレントホルダ内のファイルを
指定したことになります。([メニュー]-->[オプション]-->[全般]タブの中で指定)

Q【Excel VBA】ファイル名が一定でないファイルの指定方法

Excel2003を使用しています。

メールに添付されてくるExcelファイル(A)のデータを印刷するために、レイアウト等を整えたファイル(B)に値のみコピーというマクロをファイル(B)に作成したいと思っています。

この作業は、ファイル(A)とファイル(B)を並べて作業しますが、毎回メールに添付されてくるファイル(A)の名前が一定ではなく、ファイル名に日付が入っています。『2.07○○○.xls』のような感じですので、ファイル(B)にコードを記述するときに、Excelで開いているもう1つのファイルといったような指定の仕方は可能でしょうか?

やはり、きちんと決まったファイル名でないと不可能であれば、添付されてきたファイルを、ある名前で一旦どこかに保存して…と考えていますが、もし、上記のような指定方法ができるのであれば、教えていただきたいと思い、質問させていただきました。

Aベストアンサー

こんにちは。

オープンしているブックが

 ファイル(A)
 ファイル(B)

の2つなら、例えば Workbooks(Index) でとるとか。

Sub SampleProc()

  Dim wb As Workbook
  Dim i As Long
  
  If Workbooks.Count <> 2 Then Exit Sub
  For i = 1 To 2
    Set wb = Workbooks(i)
    If Not wb Is ThisWorkbook Then
      Exit For
    End If
  Next
  MsgBox wb.Name

End Sub

QエクセルVBAで違うブックの指定セルの値をコピーするコード

同じフォルダ内に次のブックがあります。
・「日報」フォルダ
・「入力」ブック
・「日報」ブック

「日報」ブックの「入力」シートのセルに入力して、ボタンを押すと
「日報」ブックの指定のセルに順にコピーしていくようにしたいの
ですが、コードをお教えいただけないでしょうか?
具体的には次のようになります。

「入力」ブックの「入力」シート→「日報」ブックの「日報」シート
A2,C2,D2,E2,F2→→→→→→A5,D5,F5,L5,P5
A3,C3,D3,E3,F3→→→→→→A6,D6,F6,L6,P6
A12,C12,D12,E12→→→→→→A34,J34,E34,E35
A13,C13,D13,E13→→→→→→A36,J36,E36,E37

このように入力されるようにしたいと思います。
実際にはもう少し同じようにコピーするところが
あるので、後でセル番地を追加できるようなコード
であれば非常にありがたいです。コードを教えて
ほしいなんて本当にずうずうしいですが、どうぞ
よろしくお願いします。

Aベストアンサー

#3です。直すのは簡単です。
マクロは日報ブックに、対比表も日報ブックのSheet2に作成としてください。
Sub test()
Dim sourceRange As Range
Dim destRange As Range
Dim sourceAddress As String
Dim destAddress As String
Dim addressTable As Range
Dim i As Long

Set addressTable = ThisWorkbook.Sheets("Sheet2").Range("A1").CurrentRegion
For i = 1 To addressTable.Rows.Count
sourceAddress = addressTable.Cells(i, 1).Value
destAddress = addressTable.Cells(i, 2).Value
Set sourceRange = Workbooks("入力.xls").Sheets("入力").Range(sourceAddress)
Set destRange = ThisWorkbook.Sheets("日報").Range(destAddress)
destRange.Value = sourceRange.Value
Next i
End Sub

#3です。直すのは簡単です。
マクロは日報ブックに、対比表も日報ブックのSheet2に作成としてください。
Sub test()
Dim sourceRange As Range
Dim destRange As Range
Dim sourceAddress As String
Dim destAddress As String
Dim addressTable As Range
Dim i As Long

Set addressTable = ThisWorkbook.Sheets("Sheet2").Range("A1").CurrentRegion
For i = 1 To addressTable.Rows.Count
sourceAddress = addressTable.Cells(i, 1).Value
d...続きを読む

QExcelでファイルを越えて連携できるのでしょうか

Excel2010なのですが、同じファイルであればシートをまたいであるセルを参照出来ますが、
別ファイルの、あるシートのあるセルを参照するというような事は出来ないのでしょうか?
ほんの初歩的なマクロは学んだのですが、そういうファイルをまたいでの設定は無かったように思いますが、マクロとか使えば出来るのでしょうか?
例えばプログラミングなどであるinclude()などあればファイルを参照出来るのでしょうが。

Aベストアンサー

エクセルの数式では,
='c\test\[book1.xls]Sheet1'!A1
といった数式で多ブックの値を参照し計算に利用できます

参照元ブックを開いておいて
=[book1.xls]sheet1!A1
のように数式を作成し,参照元ブックを保存して閉じると,自動で閉じたブックを参照する式に書き換わります。エクセルの操作になれていないときは,こちらの手順を行った方が間違いがありません。




マクロでは別のブックを「開いて参照する」のが原則です。
sub macro1()
 dim w as workbook
 set w = workbooks.open("c:\test\book1.xls")
 msgbox w.worksheets("シート名").range("セル番地")
 w.close false
end sub


開きたくないご相談はしばしば見かけますが,労多くして功少ないの典型と言えます。

方法1:開いているところを見せない
sub macro2()
 dim w as workbook
 dim x
 application.screenupdating = false
 application.calculation = xlcalculationmanual
 set w = workbooks.open("c:\test\book1.xls")
 x = w.worksheets("Sheet1").range("A1")
 w.close false
 application.calculation = xlcalculationautomatic
 application.screenupdating = true
 msgbox x
end sub

方法2:エクセルに閉じたブックの値を取ってこさせる
sub macro3()
 dim x
 range("A1").formula = "='C\test\[book1.xls]Sheet1'!A1"
 x = range("A1").value
 range("A1").clearcontents
 msgbox x
end sub

方法3:4.0マクロ関数を使う
色々制約があるのでお薦めしませんが,下記など参考に。
http://www.moug.net/tech/exvba/0060037.html

エクセルの数式では,
='c\test\[book1.xls]Sheet1'!A1
といった数式で多ブックの値を参照し計算に利用できます

参照元ブックを開いておいて
=[book1.xls]sheet1!A1
のように数式を作成し,参照元ブックを保存して閉じると,自動で閉じたブックを参照する式に書き換わります。エクセルの操作になれていないときは,こちらの手順を行った方が間違いがありません。




マクロでは別のブックを「開いて参照する」のが原則です。
sub macro1()
 dim w as workbook
 set w = workbooks.open("c:\test\book1.xls")
...続きを読む

QVBA別シートの最終行の下行へ貼り付けされるようにしたいです。

教えてください。ド素人です。(参考書読み始めたところ)
聞き方も適切かわからないのですが、質問させてください。

Sheet1(入力画面)、Sheet2(確認画面)、Sheet3(データ)の3つのシートを作りました。

Sh1「入力画面」で入力された値は、関数で自動的に、Sh2「確認画面」指定のセルへコピーされるようにしています。
Sh1「入力画面」を入力し終えると。画面下のコマンドボタンで、Sh2「確認画面」へ画面が変わります。

そこで、内容を確認して、また、ここの下のコマンドボタンをクリックしてもらうと、Sh2「確認画面」の内容が、
Sh3(データ)の1行に集約されて貼り付けられます。同時にSh1「入力画面」の値は、クリアされ、Sh2「確認画面」も同様にクリアになります。

ここまで、完成したのですが、また、次のデータを入力していき、最後のSh3「データ」の最終行の下(空白行)に次々データを追加していくためのコードが解りません。

Sub ボタン3_Click()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Set sh1 = Worksheets("入力画面")
Set sh2 = Worksheets("確認画面")
Set sh3 = Worksheets("データ")

With sh2
.Range("C2:E2").Copy
Sheets("データ").Range("B2:D2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C3:C5").Copy
Sheets("データ").Range("E2:G2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, True
.Range("C6:D6").Copy
Sheets("データ").Range("H2:I2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C7:D7").Copy
Sheets("データ").Range("J2:K2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C8:D8").Copy
Sheets("データ").Range("L2:M2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C9:D9").Copy
Sheets("データ").Range("N2:O2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C10:C14").Copy
Sheets("データ").Range("P2:T2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, True
.Range("C17").Copy
Sheets("データ").Range("U2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
End With

With sh1
.Range("D8:K8").ClearContents
.Range("D6:K6").ClearContents
.Range("D4:K4").ClearContents
.Range("D10:K10").ClearContents
.Range("D12:J12").ClearContents
.Range("D14:L14").ClearContents
.Range("L16").ClearContents
.Range("D16:J16").ClearContents
.Range("D18:J18").ClearContents
.Range("L18").ClearContents
.Range("L20").ClearContents
.Range("D20:J20").ClearContents
.Range("L22").ClearContents
.Range("D22:J22").ClearContents
.Range("D24:H24").ClearContents
.Range("D26:H26").Value = "90"
.Range("D28:H28").Value = "80"
.Range("D30:H30").Value = "5"
.Range("D32:H32").Value = "5"
End With
Worksheets("入力画面").Activate
End Sub

ここまで、試行錯誤した内容です。
どこに最終行の下(空白行)の記述をいれられますでしょうか?
画像が一枚しかのせられなかったので、Sheet2(確認画面)だけ添付致しました。
Sheet3(データ)では、一行に集約しています。
是非、ご教授お願いします。色々なお意見がききたいです。

教えてください。ド素人です。(参考書読み始めたところ)
聞き方も適切かわからないのですが、質問させてください。

Sheet1(入力画面)、Sheet2(確認画面)、Sheet3(データ)の3つのシートを作りました。

Sh1「入力画面」で入力された値は、関数で自動的に、Sh2「確認画面」指定のセルへコピーされるようにしています。
Sh1「入力画面」を入力し終えると。画面下のコマンドボタンで、Sh2「確認画面」へ画面が変わります。

そこで、内容を確認して、また、ここの下のコマンドボタンをクリックして...続きを読む

Aベストアンサー

私も、ど素人のマクロで、オマケにどんどん今は劣化中です。
ただ、今は、もう参考にする本もなくなってしまいました。

ご質問は、非常にわかりやすいです。

必ず、起点が2行目にあるとすれば、
i = sh3.Cells(Rows.Count, 2).End(xlUp).Row -1 '最後の次の行を探します。

そこに、Offsetで、ずらしていきます。

Sheets("データ").Range("B2:D2").Offset(i).PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
のようにして、全部、置換で、.Offset(i). を割りこませればよいでしょう。
検索:[).P] -> 置換:[).Offset(i).P]

以下で、添付したのは、マクロを集約してしまいました。
たぶん、私のコードは参考にはなりません。こんな考え方もあるのかなっていう程度にしてください。以下は、機械的に作られたものです。

'//--
Sub Test2Macro()
  Dim sh1 As Worksheet: Set sh1 = Worksheets("入力画面")
  Dim sh2 As Worksheet: Set sh2 = Worksheets("確認画面")
  Dim sh3 As Worksheet: Set sh3 = Worksheets("データ")
  Dim r1 As Range, a As Range
  Dim i As Long, j As Long, k As Long
  Dim Datas As Variant, c As Variant
  
  j = sh3.Cells(Rows.Count, 2).End(xlUp).Row + 1 '最後の行を探します。
  Set r1 = sh2.Range("C2:E2,C3:C5,C6:D9,C10:C14, C17")
  i = 2 '初期列
  For Each c In r1.Cells
    sh3.Cells(j, i).Value = c.Value
    i = i + 1
  Next c
  
  sh1.Range("D6:K6,D8:K8,D4:K4,D10:K10,D12:J12" & _
  ",D14:L14,L16,D16:J16,D18:J18,L18,L20" & _
  ",D20:J20,L22,D22:J22").ClearContents
  Datas = Array(90, 80, 5, 5)
  For Each a In sh1.Range("D26:H26,D28:H28,D30:H30,D32:H32").Areas
    a.Value = Datas(k)
    k = k + 1
  Next a
End Sub
'//--

私も、ど素人のマクロで、オマケにどんどん今は劣化中です。
ただ、今は、もう参考にする本もなくなってしまいました。

ご質問は、非常にわかりやすいです。

必ず、起点が2行目にあるとすれば、
i = sh3.Cells(Rows.Count, 2).End(xlUp).Row -1 '最後の次の行を探します。

そこに、Offsetで、ずらしていきます。

Sheets("データ").Range("B2:D2").Offset(i).PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
のようにして、全部、置換で、.Offset(i). を割りこませればよいでしょう。...続きを読む


人気Q&Aランキング