- ベストアンサー
Excelマクロ初心者の方への質問:マクロを使用して特定のセルに最新の数値を書き込む方法について教えてください。
- Excelのマクロ初心者の方から、特定のセルに最新の数値を書き込む方法について質問があります。現在、複数のセルの値を特定のセルに書き込むプログラムを作成していますが、セルの数が増えるにつれてプログラムを増やさなければなりません。
- 質問者は、プログラムを一つにまとめて、指定されたセルに最新の数値を書き込む方法を知りたいと考えています。プログラムの一部を引用しながら、具体的な解決策を教えていただけますか?
- 質問者は、Excelのバージョンが2003であることを明示し、解決策を求めています。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
> 9行目の横にではなくて別の3つを15行目の横に書き込まれるようにするにはプログラム自体を増やすしかないのでしょうか 別な処理ですからプログラムを増やすしか方法はありません。 念じてできるならプログラムする必要はありませんから。(^_^) 15行目というのが判りませんが、例えばsheet1のCells(iRows, 6)、Cells(iRows, 7)、Cells(iRows, 8)をsheet3のB15、C15、D15に書きたいという場合には For j=1 to MaxCH Worksheets("Sheet3").Range(chr(asc("A")+j) & "9").Value = Worksheets("Sheet1").Cells(iRows, j + 2).Value Worksheets("Sheet3").Range(chr(asc("A")+j) & "15").Value = Worksheets("Sheet1").Cells(iRows, j + 5).Value Next j 上記はデータ数が共に3の場合ですが、データ数が違う場合はFor文を二つにする必要があります。
その他の回答 (8)
- samtomsan
- ベストアンサー率55% (1060/1897)
> sheet3にまた別の3つ分のCHを書き込まれるように増やしたい場合 MaxCH = 3 'sheet3に表示するチャネル数 この値を変更します。例えば MaxCH=6 とすれば sheet1のCells(iRows, 6)~Cells(iRows, 8)の値がsheet3のE9、F9、G9に書き込まれます。 即ち、sheet1のCells(iRows, x)の値がsheet3の9行目に横に増えていきます。 その為に MaxCH という変数にしています。 ANo.1さんのプログラムの場合は For文を変更して、例えば For j = 1 to 6 のように終わりを変更すればお望みの結果になります。 ANo.1さんとの違いは、Cell(行と列を数字で指定する)を使うかRange(文字で指定しているだけ)を使うかの違いだけで、動作は同じです。
補足
9行目の横にではなくて別の3つを15行目の横に書き込まれるようにするにはプログラム自体を増やすしかないのでしょうか?
- samtomsan
- ベストアンサー率55% (1060/1897)
> CH2の数値がsheet3のB10に書き込まれてしまいます ANo.1さんのプログラムでも私が示したプログラムでも「B10」にはならないはずですが。 下記の行の意味が判りませんので省きます。 ' 最終行をシート3にコピー Worksheets("Sheet1").Rows(iRows).Copy Destination:=Worksheets("Sheet4").Range("1:1") プログラムは下記のようになるはずですが。これでうまくいきませんか。 Private Sub Command1_Click() ' ' Macro1 Macro ' ' Dim iRows As Integer Dim sRows As String Dim i As Integer Dim tm As Single Dim j as Integer Dim MaxCH as Integer MaxCH = 3 'sheet3に表示するチャネル数 fStop = Fal For i = 1 To 500 Cells(1, 1) = i tm = Timer() + 5 Do DoEvents Loop While Timer() < tm ' 最終行の調査: iRows = Worksheets("Sheet1").UsedRange.Rows.Count For j=1 to MaxCH Worksheets("Sheet3").Range(chr(asc("A")+j) & "9").Value = Worksheets("Sheet1").Cells(iRows, j + 2).Value Next j Next i End Sub
補足
何度もありがとうございました。出来ました、やはり自分がプログラムの作り方がおかしかったみたいです。最後の補足なんですが、sheet3にまた別の3つ分のCHを書き込まれるように増やしたい場合はWorksheets("Sheet3").Range(chr(asc("A")+j) & "9").Value = Worksheets("Sheet1").Cells(iRows, j + 2).Valueこのプログラムを増やしていくしかないのでしょうか。
- in01280128
- ベストアンサー率50% (48/95)
初めと終わりの2行を加えると、すべてのデータの書き込みが終わるまで 画面更新が行われません。 Application.ScreenUpdating = False For j = 1 to 3 Worksheets("Sheet3").Cells(9, 1 + j).Value _ = Worksheets("Sheet1").Cells(iRows, 2 + j).Value Next Application.ScreenUpdating = True ただ、現実問題として、Excelの処理は充分早いので、 この2行を入れなくても問題になることはないと思います。
- samtomsan
- ベストアンサー率55% (1060/1897)
> その際にsheet1の数値がsheet3のセルに順に書き込まれてしまうので、3つの更新された数値をそれぞれのセルに同時に表示できるようにしたいです プログラム的にはその時にsheet1に書かれているデータをsheet3にコピーしますから、同時に表示しています。 5秒間隔でsheet1からsheet3にコピーしていますが、これをsheet1が変更されたら(計測してsheet1に書き込まれたら)sheet3にも反映したいという意味の同時でしょうか。 そうであれば、計測ルーチンがどの様な処理を行なってsheet1に書き込んでいるかが判らなければ答えようがありません。 お示しになったプログラムは5秒間隔で500回、その時の最後のデータをsheet1からsheet3にコピーする処理ですから、それに合わせた回答になっています。
補足
本当に何度もすいません。sheet1は質問に載せた2つのsheet画面の上の画像がsheet1の画面です。セルのA5から下に計測した回数、B5から下に時刻、そしてC5から下にCH1、D5から下にCH2、C5からまた新しいCHと更新された数値はそれぞれ5から下に書き込まれていくようになってます。自分の作ったプログラムがおかしいのかもしれませんが、教えていただいたプログラムを使うと5秒経つとsheet1のCH1の新しい数値がshee3のB9に書き込まれ、また5秒経つとCH2の数値がsheet3のB10に書き込まれてしまいます。
- in01280128
- ベストアンサー率50% (48/95)
計測するチャネルが知らない間にだんだん増えて行って、 コピーするデータもその分増えて行くということしょうか? その場合であれば、まず、セルにデータがあるかどうかを確認して、 それからコピーすればよいと思います。 for j = 1 to 254 if Worksheets("Sheet1").Cells(iRows, 2 + j).Value <> "" then Worksheets("Sheet3").Cells(9, 1 + j).Value _ = Worksheets("Sheet1").Cells(iRows, 2 + j).Value end if next
補足
すいません。sheet1の指定した数値をsheet3の特定のセルに書き込むことは出来るのですが、その際にsheet1の数値がsheet3のセルに順に書き込まれてしまうので、3つの更新された数値をそれぞれのセルに同時に表示できるようにしたいです。
- samtomsan
- ベストアンサー率55% (1060/1897)
> sheet1の更新された数値が例えば3つあったとしたらその数値をsheet3のセルB9、C9、D9のそれぞれの場所に書き込まれるようにしたいのですがどのようにすればよいのでしょうか 補足の意味がわかりません。 ANo.1もANo.2も「sheet1の更新された数値が例えば3つ」を指定しているのですが。 ANo.1の場合 Worksheets("Sheet1").Cells(iRows, 2 + j).Value ANo.2の場合 Worksheets("Sheet1").Cells(iRows, j + 2).Value それともお示しになったマクロの下部の部分は違うのでしょうか。 そうであればご自分で上記の部分を目的に合うように書き換えていただく必要があります。
補足
すいません。sheet1の指定した数値をsheet3の特定のセルに書き込むことは出来るのですが、その際にsheet1の数値がsheet3のセルに順に書き込まれてしまうので、3つの更新された数値をそれぞれのセルに同時に表示できるようにしたいです。
- samtomsan
- ベストアンサー率55% (1060/1897)
変化する部分をそれに合わせて変化させる、文字列は文字として、数値は数値として変化させてはいかがでしょうか。 Dim MaxCH as Integer MaxCH = 3 For j=1 to MaxCH Worksheets("Sheet3").Range(chr(asc("A")+j) & "9").Value = Worksheets("Sheet1").Cells(iRows, j + 2).Value Next j
補足
回答ありがとうございます。しかし教えていただいたプログラムですとsheet3のセルB9、C9、D9と順番に表示されてしまいます。出来れば監視盤のようなものを作りたいのでsheet1の更新された数値が例えば3つあったとしたらその数値をsheet3のセルB9、C9、D9のそれぞれの場所に書き込まれるようにしたいのですがどのようにすればよいのでしょうか?
- in01280128
- ベストアンサー率50% (48/95)
質問の意図を充分理解していないかも知れませんが、 for j = 1 to 3 Worksheets("Sheet3").Cells(9, 1 + j).Value _ = Worksheets("Sheet1").Cells(iRows, 2 + j).Value next のようにすればよいのではないでしょうか。 Range("B9") と Cells(9, 2) とは、だいたい同じような意味です。
補足
回答ありがとうございます。しかし教えていただいたプログラムですとsheet3のセルB9、C9、D9と順番に表示されてしまいます。出来れば監視盤のようなものを作りたいのでsheet1の更新された数値が例えば3つあったとしたらその数値をsheet3のセルB9、C9、D9のそれぞれの場所に書き込まれるようにしたいのですがどのようにすればよいのでしょうか?
お礼
本当に何度も補足に答えていただきありがとうございました。