[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データー集め』(ちぃさん)
いつもお世話になります。
データー集めをしたいのですがマクロで便利に早くできればと思い質問にまいりました。
マクロどころか関数ですら理解できていない私ですが宜しくお願いします。
入力シートとして使っている
仮名:333.xlsm
仮名:Sheet1
仮セル番:B5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,F15,H15,I15
に入力した値を同じBook1の別シート
データを収集しようとしている
仮名:333.xlsm
仮名:Sheet2
仮セル番:B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2,N2,O2,P2
に転記したいです。
入力シートとして使っているシートは使い回しなので次回使う場合は入力した値を消去しまた値を入力します。
データを収集しようとしているシートは入力シートとして使っているシートの値を消去しても消えないでほしいです。
仮に6/11に入力シートとして使っているのセルB5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,F15,H15,I15に入力すればSheet2のB2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2,N2,O2,P2に
6/11 ・・・・・・・・・・・
6/12に入力シートとして使っているのセルB5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,F15,H15,I15に入力すればSheet2のB3,C3,D3,E3,F3,G3,H3,I3,J3,K3,L3,M3,N3,O3,P3に
6/12・・・・・・・・・・・・
6/25に入力シートとして使っているのセルB5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,F15,H15,I15に入力すればSheet2のB4,C4,D4,E4,F4,G4,H4,I4,J4,K4,L4,M4,N4,O4,P4に
6/25・・・・・・・・・・・・
と最下行の次の行に貼り付けを繰り返したいです。
過去ログに私が望んでいる回答に近いものがありましたので試してみたのですが・・・[[20130526180206]]←コチラのものを解らないなりに真似して
Sub Sample()
Dim shF As Worksheet Dim r1 As Range Dim r2 As Range Dim r3 As Range Dim r4 As Range Dim r5 As Range Dim r6 As Range Dim r7 As Range Dim r8 As Range Dim r9 As Range Dim r10 As Range Dim r11 As Range Dim r12 As Range Dim r13 As Range Dim r14 As Range Dim r15 As Range
Set shF = Workbooks("333.xlsm").Sheets("Sheet1")
With shF Set r1 = .Range("B5", .Range("B" & .Rows.Count).End(xlUp)) Set r2 = .Range("C5", .Range("C" & .Rows.Count).End(xlUp)) Set r3 = .Range("E5", .Range("E" & .Rows.Count).End(xlUp)) Set r4 = .Range("F5", .Range("F" & .Rows.Count).End(xlUp)) Set r5 = .Range("H5", .Range("H" & .Rows.Count).End(xlUp)) Set r6 = .Range("I5", .Range("I" & .Rows.Count).End(xlUp)) Set r7 = .Range("C7", .Range("C" & .Rows.Count).End(xlUp)) Set r8 = .Range("F7", .Range("F" & .Rows.Count).End(xlUp)) Set r9 = .Range("I7", .Range("I" & .Rows.Count).End(xlUp)) Set r10 = .Range("B15", .Range("B" & .Rows.Count).End(xlUp)) Set r11 = .Range("C15", .Range("C" & .Rows.Count).End(xlUp)) Set r12 = .Range("E15", .Range("E" & .Rows.Count).End(xlUp)) Set r13 = .Range("F15", .Range("F" & .Rows.Count).End(xlUp)) Set r14 = .Range("H15", .Range("H" & .Rows.Count).End(xlUp)) Set r15 = .Range("I15", .Range("I" & .Rows.Count).End(xlUp)) End With
With Workbooks("333.xlsm").Sheets("Sheet2") r1.Copy .Range("B" & .Rows.Count).End(xlUp).Offset(2) r2.Copy .Range("C" & .Rows.Count).End(xlUp).Offset(2) r3.Copy .Range("D" & .Rows.Count).End(xlUp).Offset(2) r4.Copy .Range("E" & .Rows.Count).End(xlUp).Offset(2) r5.Copy .Range("F" & .Rows.Count).End(xlUp).Offset(2) r6.Copy .Range("G" & .Rows.Count).End(xlUp).Offset(2) r7.Copy .Range("H" & .Rows.Count).End(xlUp).Offset(2) r8.Copy .Range("I" & .Rows.Count).End(xlUp).Offset(2) r9.Copy .Range("J" & .Rows.Count).End(xlUp).Offset(2) r10.Copy .Range("K" & .Rows.Count).End(xlUp).Offset(2) r11.Copy .Range("L" & .Rows.Count).End(xlUp).Offset(2) r12.Copy .Range("M" & .Rows.Count).End(xlUp).Offset(2) r13.Copy .Range("N" & .Rows.Count).End(xlUp).Offset(2) r14.Copy .Range("O" & .Rows.Count).End(xlUp).Offset(2) r15.Copy .Range("P" & .Rows.Count).End(xlUp).Offset(2) End With
End Sub
と記述しましたが転記されたセルがSheet2のB3,C3,D3,E3,F3,G3,H3,I3,J3,K3,L3,M3,N3,O3,P3に転記、さらにプラスしC5,E5,G5,H6,I6,J6,H7,I7,J7,B8,C8,D8,E8,F8,G8,B9,C9,D9,E9,F9,G9,H11,I11,J11,B13,C13,D13,E13,F13,G13に転記されました。
どこを直せばいのか全くわかりません。
助けて頂きたいたいです。
最終はデータを収集しようとしているシートを選択した時に値を入力したシートの値と入力」した日付が転記できるマクロが希望です。
解りにくい説明で申し訳ないです。
説明内容で情報不足な部分がありましたら指摘ください。
どうぞ宜しくお願いします。
WindowsXP Excel2003、Windows 7 Excel2010 で可能な環境が希望です。
>さらにプラスし >C5,E5,G5,H6,I6,J6,H7,I7,J7,B8,C8,D8,E8,F8,G8,B9,C9,D9,E9,F9,G9,H11,I11,J11,B13,C13,D13,E13,F13,G13に転記されました。
それは、そういうコードになっているから。 入力シートのC列のコードをサンプルにとるなら
>6/12に入力シートとして使っているのセルC5,C7,C15に入力すれば
Set r2 = .Range("C5", .Range("C" & .Rows.Count).End(xlUp))
これは、C5から、そのときのC列のデータ最終セル、C15までを取得(C5:C15)
r2.Copy .Range("C" & .Rows.Count).End(xlUp).Offset(2)
上記で取得した C5:C15 の 9セルを Sheet2 のC列のデータ最終行 +2 のところ (前日のデータから【1行あけて】)に、『9セル』を転記。
こうなっているよ。
以下は C列の分のみを書いたもの。他の列も同様に。
Sub Sample2() Dim shF As Worksheet Dim shT As Worksheet
Set shF = Workbooks("333.xlsm").Sheets("Sheet1") Set shT = Workbooks("333.xlsm").Sheets("Sheet2")
With shT .Range("C" & .Rows.Count).End(xlUp).Offset(1).Value = shF.Range("C5") 'または shF.Range("C5").Copy .Range("C" & .Rows.Count).End(xlUp).Offset(1) End With
End Sub
なお、もし、ある日の入力でどこかの入力セルが空白だった場合、その次の日はその空白セルは未入力とみなすので 他の列に書き込まれた行とは異なる行に書き込まれる。 これは具合悪いのでは? xlUP で書き込み行を調べる際に、各行毎に調べるのではなく、絶対に値がある代表列で調べて 各列、全て、その行に書き込んだらいいんじゃないかな?
それと、このマクロブックが 333.xlsm なら Workbooks("333.xlsm") のかわりに ThisWorkbook のほうがいいかも。
(ぶらっと)
↑でいった、転記先のどこかの列で転記行を決定することができるなら、仮にそれをB列だとすると。
Sample3 がコピペ方式、Sampl4,Sample5 が セル.Value = セル.Value 方式。 (Sample5 は 転記実行コードを1行にしたもの)
Sub Sample3() Dim shF As Worksheet Dim shT As Worksheet Dim z As Long
Set shF = Workbooks("333.xlsm").Sheets("Sheet1") Set shT = Workbooks("333.xlsm").Sheets("Sheet2")
With shT '転移シートデータ最終行をB列で判断 z = .Range("B" & .Rows.Count).End(xlUp).Row + 1 shF.Range("B5").Copy .Range("B" & z) shF.Range("C5").Copy .Range("C" & z) shF.Range("E5").Copy .Range("D" & z) shF.Range("F5").Copy .Range("E" & z) shF.Range("H5").Copy .Range("F" & z) shF.Range("I5").Copy .Range("G" & z) shF.Range("C7").Copy .Range("H" & z) shF.Range("F7").Copy .Range("I" & z) shF.Range("F7").Copy .Range("J" & z) shF.Range("B15").Copy .Range("K" & z) shF.Range("C15").Copy .Range("L" & z) shF.Range("E15").Copy .Range("M" & z) shF.Range("F15").Copy .Range("N" & z) shF.Range("H15").Copy .Range("O" & z) shF.Range("I15").Copy .Range("P" & z) End With
End Sub
Sub Sample4() Dim shF As Worksheet Dim shT As Worksheet Dim z As Long
Set shF = Workbooks("333.xlsm").Sheets("Sheet1") Set shT = Workbooks("333.xlsm").Sheets("Sheet2")
With shT '転移シートデータ最終行をB列で判断 z = .Range("B" & .Rows.Count).End(xlUp).Row + 1 .Range("B" & z).Value = shF.Range("B5").Value .Range("C" & z).Value = shF.Range("C5").Value .Range("D" & z).Value = shF.Range("E5").Value .Range("E" & z).Value = shF.Range("F5").Value .Range("F" & z).Value = shF.Range("H5").Value .Range("G" & z).Value = shF.Range("I5").Value .Range("H" & z).Value = shF.Range("C7").Value .Range("I" & z).Value = shF.Range("F7").Value .Range("J" & z).Value = shF.Range("F7").Value .Range("K" & z).Value = shF.Range("B15").Value .Range("L" & z).Value = shF.Range("C15").Value .Range("M" & z).Value = shF.Range("E15").Value .Range("N" & z).Value = shF.Range("F15").Value .Range("O" & z).Value = shF.Range("H15").Value .Range("P" & z).Value = shF.Range("I15").Value End With
End Sub
Sub Sample5() Dim shF As Worksheet Dim shT As Worksheet Dim z As Long
Set shF = Workbooks("333.xlsm").Sheets("Sheet1") Set shT = Workbooks("333.xlsm").Sheets("Sheet2")
With shT '転移シートデータ最終行をB列で判断 z = .Range("B" & .Rows.Count).End(xlUp).Row + 1 .Range("B" & z & ":P" & z).Value = Array( _ shF.Range("B5").Value, _ shF.Range("C5").Value, _ shF.Range("E5").Value, _ shF.Range("F5").Value, _ shF.Range("H5").Value, _ shF.Range("I5").Value, _ shF.Range("C7").Value, _ shF.Range("F7").Value, _ shF.Range("F7").Value, _ shF.Range("B15").Value, _ shF.Range("C15").Value, _ shF.Range("E15").Value, _ shF.Range("F15").Value, _ shF.Range("H15").Value, _ shF.Range("I15").Value) End With
End Sub
(ぶらっと)
(ぶらっと)サン 回答ありがとうございます。
毎回感謝しています。
コピペ方式よりSampl4,Sample5 のほうが私の好みでしたw
パターンを沢山ありがとうございます。
転記位置もB列でOKです。
あと、2点
1,この転記した列の先頭のA列に転記した日付を表示したいのですがかこうでしょうか?
2,今はボタンをクリックした時にマクロが実行されているものをSheet2を選択した時に転記できている状態にしたいです。
2,の所で解りにくい説明でしたら指摘ください。
どうぞ宜しくお願いします。
(ちぃさん)
Sample5 をベースに日付セットと、Sheet2を選択したときに実行するパターン。
Sheet2 のシートタブを右クリック、コードの表示を選んで出てくるところに
Private Sub Worksheet_Activate() Dim shF As Worksheet Dim z As Long
Set shF = Workbooks("333.xlsm").Sheets("Sheet1")
'転移シートデータ最終行をB列で判断 z = Range("B" & Rows.Count).End(xlUp).Row + 1 Range("A" & z & ":P" & z).Value = Array( _ Date, _ shF.Range("B5").Value, _ shF.Range("C5").Value, _ shF.Range("E5").Value, _ shF.Range("F5").Value, _ shF.Range("H5").Value, _ shF.Range("I5").Value, _ shF.Range("C7").Value, _ shF.Range("F7").Value, _ shF.Range("F7").Value, _ shF.Range("B15").Value, _ shF.Range("C15").Value, _ shF.Range("E15").Value, _ shF.Range("F15").Value, _ shF.Range("H15").Value, _ shF.Range("I15").Value) End Sub
(ぶらっと)
あ、すみません。
回答いただいた内容は完璧です。が、私の言葉足らずな部分がありました。
>2,今はボタンをクリックした時にマクロが実行されているものをSheet2を選択した時に転記できている状態にしたいです。
この説明に誤りがありました。
本当に申し訳ないです。
値が一部でも更新せれていればSheet2を選択した時に転記できている状態に変更できますでしょうか?
私の言葉足らずのために二度手間のなり申し訳ありません。
何卒宜しくお願いいたします。
(ちぃさん)
testで転記させる選択範囲40個まで増やしてみようですが選択範囲が24個で警告がでました。
「行継続文字()_を使いすぎています。」
Private Sub Worksheet_Activate() Dim shF As Worksheet Dim z As Long
Set shF = Workbooks("333.xlsm").Sheets("Sheet1")
'転移シートデータ最終行をB列で判断 z = Range("B" & Rows.Count).End(xlUp).Row + 1 Range("A" & z & ":AN" & z).Value = Array( _ Date, _ shF.Range("B5").Value, _ shF.Range("C5").Value, _ shF.Range("E5").Value, _ shF.Range("F5").Value, _ shF.Range("H5").Value, _ shF.Range("I5").Value, _ shF.Range("C7").Value, _ shF.Range("F7").Value, _ shF.Range("F7").Value, _ shF.Range("B15").Value, _ shF.Range("C15").Value, _ shF.Range("E15").Value, _ shF.Range("B10").Value, _ shF.Range("C10").Value, _ shF.Range("D10").Value, _ shF.Range("E10").Value, _ shF.Range("F10").Value, _ shF.Range("G10").Value, _ shF.Range("H10").Value, _ shF.Range("I10").Value, _ shF.Range("B11").Value, _ shF.Range("C11").Value, _ shF.Range("I15").Value) End Sub
Range("A" & z & ":P" & z).Value = Array( _
↑この部分のP1はANに変えたのですが・・・・
Range("A" & z & ":AN" & z).Value = Array( _
また私が全然意味不明な事をしているのでしょうか?
何度も申し訳ないです。
助けて頂けないでしょうか?
宜しくお願いいたします。
(ちぃさん)
まず、1つ、ごめん を。 アップしたコード、転記元セルの F7 が重複してたね。 2つめの F7 は I7 だったね。 さておき、「行継続文字()_を使いすぎています。」これは【文字通り】継続文字( _ ) が多すぎるということで 24個が許容範囲の上限みたいね。
もともと、継続文字は、1行で長いコードを書くと、VBA画面でみづらくなるので 適宜、 半角スペースと _ で区切って、次の行にコードの残りを記述するもの。 アップしたコードでは、セル1つずつで区切ったのでセル数分の _ が必要になっている。 これを、たとえばセル3つ分ずつで1行にすれば、解決することにはなる。
ただ、この書き方、確かに、転記実行は1回になるので効率的といえば効率的だけど、コードを追加したり変更したりする場合に かえって、やりにくくなるかもね。
なので、少し、このコードを変えてみる。
あわせて、現在の仕掛けは Sheet2 が表示されると無条件に1行追加される。 Sheet1 の変更後、最初に Sheet2が表示されたら行追加するけど、 行追加されたら、次に Sheet1 が変更のない限り Sheet2 を開いても、行追加されないコードにしよう。
後程アップするのでしばしお待ち乞う。
(ぶらっと)
>Sheet2 を開いても、行追加されないコードにしよう。
了解です。
本当に何度もすみません。
宜しくお願いいたします。
(ちぃさん)
それでは、現在の Sheet2 のシートモジュールのコードをすべて消したうえで、 ThisWorkbookモジュールに以下を貼り付け。 (VBE画面の左上のプロジェクトエクスプローラの中の ThisWorkbook をダブルクリックするとでてくるところ)
Option Explicit
Dim flag As Boolean Const copyR As String = "B5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,B10,C10,D10,E10,F10,G10,H10,I10,B11,C11,I15"
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Not Sh Is Sheets("Sheet2") Or Not flag Then Exit Sub
CopyLine
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Not Sh Is Sheets("Sheet1") Then Exit Sub If Not Intersect(Target, Sh.Range(copyR)) Is Nothing Then flag = True End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If flag Then CopyLine End Sub
Private Sub CopyLine() Dim shF As Worksheet Dim z As Long Dim x As Long Dim v() As Variant Dim c As Range Dim k As Long Dim shT As Worksheet
Set shF = Sheets("Sheet1") Set shT = Sheets("Sheet2")
'転移シートデータ最終行をB列で判断 z = shT.Range("B" & shT.Rows.Count).End(xlUp).Row + 1 With shF.Range(copyR) x = .Count + 1 'コピーセル数+1 ReDim v(1 To x) v(1) = Date k = 1 For Each c In .Cells k = k + 1 v(k) = c.Value Next
shT.Range("A" & z).Resize(, x).Value = v flag = False End With End Sub
(ぶらっと)
求めていたものそのままです。
感謝感謝です。
試しにtestで選択範囲を50個
Const copyR As String = "B5,C5,E5,F5,H5,I5,C7,F7,I7,B10,C10,D10,E10,F10,G10,H10,I10,B11,C11,D11,E11,F11,G11,H11,I11,B15,C15,E15,F15,H15,I15,B18,C18,E18,F18,H18,I18,B20,C20,E20,F20,H20,I20,B22,C22,E22,F22,H22,I22,D23"
でも問題なく動きました。
さすがに50個も選択することはないのですがw
もし嫌でなければ勉強したいのであと少しお付き合いいただけないでしょか。
本当に勝手ながらすみません。続けます。
今、必要ではないのですがもし違うBookに転記ならば
>If Not Sh Is Sheets("Sheet2") Or Not flag Then Exit Sub
この部分を
If Not Sh Is Workbooks("他のBook.xlsx").Worksheets("Sheet1") Or Not flag Then Exit Sub
と
>Set shT = Sheets("Sheet2")
この部分を
Set shT = Workbooks("他のBook.xlsx").Worksheets("Sheet1")
かなと思ったのですが...
違うんですね。
もしかして他のBookに記録を残す場合はマクロコードが全然変わってしまうのですか?
もし迷惑でなければ教えてほしいです。
長々と同じことばかりで本当にすみません。
(ちぃさん)
(ちぃさん)
自身で気づかれたこと祝着。
ところで、エクセル区画に、このマクロブック(333.xlsm) と、別のブックが開かれていて その別のブックのシートに書き込みするということも、お望みならできるよ。
(ぶらっと)
本当に恥ずかしい質問をすみません。
>ところで、エクセル区画に、このマクロブック(333.xlsm) と、別のブックが開かれていて
>その別のブックのシートに書き込みするということも、お望みならできるよ。
勉強させてください。
宜しくお願いいたします。
(ちぃさん)
急いで書いたので、どこかに抜けがあるかもしれないけど。 かつ、333.xlsm を開く前に 他のBook.xlsx を開いておかなければいけないという暫定版だけど。
Thisworkbookモジュールを総入れ替え。いったん、保存して、また開いてみてくれるかな。
Option Explicit
Dim WithEvents xlapp As Application Dim flag As Boolean Dim wbOT As Workbook Const copyR As String = "B5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,B10,C10,D10,E10,F10,G10,H10,I10,B11,C11,I15"
Private Sub Workbook_Open() Set xlapp = Application Set wbOT = Workbooks("他のBook.xlsx") End Sub
Private Sub xlapp_WorkbookActivate(ByVal Wb As Workbook) If Wb Is wbOT And flag Then CopyLine End Sub
Private Sub xlapp_SheetActivate(ByVal Sh As Object) If Not Sh Is wbOT.Sheets("Sheet1") Or Not flag Then Exit Sub CopyLine End Sub
Private Sub xlapp_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Not Sh Is ThisWorkbook.Sheets("Sheet1") Then Exit Sub If Not Intersect(Target, Sh.Range(copyR)) Is Nothing Then flag = True End Sub
Private Sub xlapp_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) If Not Wb Is wbOT Then Exit Sub If flag Then CopyLine End Sub
Private Sub CopyLine() Dim shF As Worksheet Dim z As Long Dim x As Long Dim v() As Variant Dim c As Range Dim k As Long Dim shT As Worksheet
Set shF = ThisWorkbook.Sheets("Sheet1") Set shT = wbOT.Sheets("Sheet1")
'転移シートデータ最終行をB列で判断 z = shT.Range("B" & shT.Rows.Count).End(xlUp).Row + 1 With shF.Range(copyR) x = .Count + 1 'コピーセル数+1 ReDim v(1 To x) v(1) = Date k = 1 For Each c In .Cells k = k + 1 v(k) = c.Value Next
shT.Range("A" & z).Resize(, x).Value = v flag = False End With End Sub
(ぶらっと)
転記できました。
でも警告?のようなものがでましたが.....。
「プライバシーに関する注意:このドキュメントには、マクロ、ActiveXコントロール、XML拡張子パックの情報、またはwebコンポーネントが含まれています。これらにはドキュメント検査機能で除去することのできない個人情報が含まれる場合があります。」
とでましたが
「はい」
をクリックで転記された値は保存されました。
でも一旦全てファイルを閉じ 他のBook.xlsx を開いた状態で 333.xlsm を開き試した結果問題なくマクロは動きました。
ThisWorkbookに記述していても他のBookにとばせるんですね。
ビックリしました。
(ちぃさん)
(ちぃさん)
仮名:333.xlsm
仮名:Sheet1 仮セル番:B5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,F15,H15,I15
仮名:Sheet2 仮セル番:B10,D10,F10,B11,D11,F11,H11
仮名:Sheet3 仮セル番:B18,C20,E18,F20,H18,I20
の入力データーを
仮名:他のBook.xlsx
仮名:Sheet1
に全て転記です。
マクロの動かしかたは今のままが一番の好みです。
できますでしょうか?
今一度お助けください。
何卒宜しくお願いいたします。
(ちぃさん)
前にコメントした気になっていた点も調整。マクロブックを先に開いても、別ブックを先に開いても大丈夫なようにした(つもり) また、どのブックを先に閉じても大丈夫(のはず) とだし(当然)マクロブック側でデータ変更してから、別ブックのSheet1を表示せずにマクロブックを閉じると、別ブックへの転記は行われない。
マクロブック側の各シートに入れ終わった後、別ブックのSheet1を表示した時点で一括転記。
ThisWorkbookモジュールを総入れ替え。
Option Explicit
Dim WithEvents xlapp As Application Dim flag As Boolean Dim wbOT As Workbook
Const nameOT As String = "他のBook.xlsx" Const nameShTo As String = "Sheet1"
Const copyR1 As String = "B5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,F15,H15,I15" Const copyR2 As String = "B10,D10,F10,B11,D11,F11,H11" Const copyR3 As String = "B18,C20,E18,F20,H18,I20" Const nameShFrom1 As String = "Sheet1" Const nameShFrom2 As String = "Sheet2" Const nameShFrom3 As String = "Sheet3"
Private Sub Workbook_Open() Set xlapp = Application On Error Resume Next 'まだ開かれていなかった場合の対応 Set wbOT = Workbooks(nameOT) On Error GoTo 0 End Sub
Private Sub xlapp_WorkbookOpen(ByVal Wb As Workbook) If Wb.Name = nameOT Then Set wbOT = Wb If wbOT.ActiveSheet.Name = nameShTo Then If flag Then CopyLine End If End If End Sub
Private Sub xlapp_WorkbookActivate(ByVal Wb As Workbook) If Wb.Name = nameOT Then If Wb.ActiveSheet.Name = nameShTo Then If flag Then CopyLine End If End If End Sub
Private Sub xlapp_SheetActivate(ByVal Sh As Object) If Sh.Parent.Name = nameOT Then If Sh.Name = nameShTo Then If flag Then CopyLine End If End If End Sub
Private Sub xlapp_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Parent Is ThisWorkbook Then Select Case Sh.Name Case nameShFrom1 If Not Intersect(Target, Sh.Range(copyR1)) Is Nothing Then flag = True Case nameShFrom2 If Not Intersect(Target, Sh.Range(copyR2)) Is Nothing Then flag = True Case nameShFrom3 If Not Intersect(Target, Sh.Range(copyR3)) Is Nothing Then flag = True End Select End If End Sub
Private Sub CopyLine() Dim nameF As String Dim copyR As String
Dim shF As Worksheet Dim z As Long Dim x As Long Dim y As Long Dim v() As Variant Dim c As Range Dim k As Long Dim shT As Worksheet
Set shT = wbOT.Sheets(nameShTo)
'転移シートデータ最終行をB列で判断 z = shT.Range("B" & shT.Rows.Count).End(xlUp).Row + 1 x = Range(copyR1).Count + Range(copyR2).Count + Range(copyR2).Count + 1 'コピーセル数+1 ReDim v(1 To x) v(1) = Date k = 1 For y = 1 To 3 '3領域 nameF = VBA.Array(nameShFrom1, nameShFrom2, nameShFrom3)(y - 1) copyR = VBA.Array(copyR1, copyR2, copyR3)(y - 1) With Sheets(nameF).Range(copyR) For Each c In .Cells k = k + 1 v(k) = c.Value Next End With Next
shT.Range("A" & z).Resize(, x).Value = v flag = False
End Sub
(ぶらっと)
何度も新しくコードを組んでいただきまして助かります。
今回、ご教示いただきましたコードですが、私の説明が十分でなかった気がします。
Sheet1、Sheet2、Sheet3の転記は出来ていましたが転記された 他のBook.xlsx Sheet1の転記位置の調整はできますでしょうか?
現在、他のBook.xlsx Sheet1 に転記された状態は
A B C D E F G H I J 1 日時 Sheet1 Sheet1 Sheet1 Sheet2 Sheet2 Sheet2 Sheet3 Sheet3 Sheet3 2 3 . . . この転記順を
A B C D E 1 日時 Sheet1 Sheet1 Sheet1 2 日時 Sheet2 3 日時 Sheet3 . . . このような転記順にできますでしょうか?
Sheet1の値が更新されていたら他のBook.xlsx Sheet1を開いた際に最下行へ転記
もしSheet2もSheet3も値が更新されていれば最下行へ転記させたいのです。
転記される際は必ずA列から順に転記させたいのです。
非常に解りにくい説明で申し訳ないです。
説明が不十分でしたら指摘ください。
宜しくお願いいたします。
(ちぃさん)
追加説明です。
>マクロブック側の各シートに入れ終わった後
値を入力するシートは複数あるのですが別物扱いになります。
仮名:Sheet1=試作シート
仮名:Sheet2=○社向けシート
仮名:Sheet3=社内向けシート
何度も解りにくい説明を申し訳ないです。
どうぞ宜しくお願いいたします。
(ちぃさん)
総入れ替えで試してみて。 まだ勘違いがあるかもね。(Workbook_Open を変更しているので、マクロ変更後、一度、閉じてから、また開いて試してね)
Option Explicit
Dim WithEvents xlapp As Application Dim flag() As String Dim wbOT As Workbook
Const nameOT As String = "他のBook.xlsx" Const nameShTo As String = "Sheet1"
Const copyR1 As String = "B5,C5,E5,F5,H5,I5,C7,F7,I7,B15,C15,E15,F15,H15,I15" Const copyR2 As String = "B10,D10,F10,B11,D11,F11,H11" Const copyR3 As String = "B18,C20,E18,F20,H18,I20" Const nameShFrom1 As String = "Sheet1" Const nameShFrom2 As String = "Sheet2" Const nameShFrom3 As String = "Sheet3"
Private Sub Workbook_Open() Set xlapp = Application On Error Resume Next 'まだ開かれていなかった場合の対応 Set wbOT = Workbooks(nameOT) On Error GoTo 0 ReDim flag(1 To 3) End Sub
Private Sub xlapp_WorkbookOpen(ByVal Wb As Workbook) If Wb.Name = nameOT Then Set wbOT = Wb If wbOT.ActiveSheet.Name = nameShTo Then If Len(Join(flag, "")) Then CopyLine End If End If End Sub
Private Sub xlapp_WorkbookActivate(ByVal Wb As Workbook) If Wb.Name = nameOT Then If Wb.ActiveSheet.Name = nameShTo Then If Len(Join(flag, "")) Then CopyLine End If End If End Sub
Private Sub xlapp_SheetActivate(ByVal Sh As Object) If Sh.Parent.Name = nameOT Then If Sh.Name = nameShTo Then If Len(Join(flag, "")) Then CopyLine End If End If End Sub
Private Sub xlapp_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Parent Is ThisWorkbook Then Select Case Sh.Name Case nameShFrom1 If Not Intersect(Target, Sh.Range(copyR1)) Is Nothing Then flag(1) = "X" Case nameShFrom2 If Not Intersect(Target, Sh.Range(copyR2)) Is Nothing Then flag(2) = "X" Case nameShFrom3 If Not Intersect(Target, Sh.Range(copyR3)) Is Nothing Then flag(3) = "X" End Select End If End Sub
Private Sub CopyLine() Dim nameF As String Dim copyR As String
Dim shF As Worksheet Dim z As Long Dim x As Long Dim y As Long Dim v() As Variant Dim c As Range Dim k As Long Dim shT As Worksheet
Set shT = wbOT.Sheets(nameShTo)
For y = 1 To UBound(flag) If Len(flag(y)) Then '転移シートデータ最終行をA列で判断 z = shT.Range("A" & shT.Rows.Count).End(xlUp).Row + 1 nameF = VBA.Array(nameShFrom1, nameShFrom2, nameShFrom3)(y - 1) copyR = VBA.Array(copyR1, copyR2, copyR3)(y - 1)
With Sheets(nameF).Range(copyR)
x = Range(copyR).Count + 1 'コピーセル数+1 ReDim v(1 To x) v(1) = Date k = 1
For Each c In .Cells k = k + 1 v(k) = c.Value Next
shT.Range("A" & z).Resize(, x).Value = v
End With End If Next
ReDim flag(1 To UBound(flag))
End Sub
(ぶらっと)
(ぶらっと)サン 回答ありがとうございます。 >まだ勘違いがあるかもね。 とんでもないです。 私に原因があります。 私の説明不足と我儘のためにいつまでも同じ内容で手間を取らせて申し訳ないです。
新たに組んで頂きましたマクロ完璧でした。
今後、シートが増えたとして試しに選択のシートを10シート増やして試してみましたが問題ないです。
これ以上は求めることは今は思いつかないぐらい完璧な出来上がりでした。
長々とありがとうございました。
これで仕事も短縮できますし頭の中のモヤモヤも無くなりスッキリしました。
マクロの便利さを知りコチラで (ぶらっと)サン によくお世話になりぱなしで本当になんとお礼を言っていいのか解らないぐらい感謝しております。
毎回質問内容を (ぶらっと)サン に解決していただいたのちにコード内容の説明や私の勘違いなどの指摘内容など何度も読み直してはいるのですが、その時は理解できているつもりでもやはり理解できていない。
マクロって超便利ですがコードを組むのは超難しいです。
でも少しづつは理解しているかもです。
今後も解らない事などありましたら質問にきたいのでその際はまた宜しくお願いいたします。
ありがとうございました。
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.