No.4ベストアンサー
- 回答日時:
状況を整理します
・実験設備でデータが次々と10秒おきに入ってくる
・データは200列あたりまで連続する
・A列はx値、B列はy値、D列に新x値、E列に新y値
C列を飛ばすようなので、回転の計算は5列おきにやるわけですね。複数のデータ組を計算するプログラムを作ってみました(動作確認済み)。プログラム中の変数 M はデータ組の数です(新x値は 列5*(M-1)+4に、新y値はその次の列に書き込まれる)。MとNdataの値は適当に変えてください。
Dim i As Long, j As Long, i0 As Long, j0 As Long, i1 As Long, j1 As Long, jj As Long, Ndata As Long
Dim x0 As Double, y0 As Double, c As Double, sn As Double, cs As Double
Dim xy() As Double ' 回転後の xn,yn
Dim Ndada As Long ' データ数
Dim M As Long ' データ組の数
Dim k As Double ' 回転角度(度)
'
i0 = 1 ' x1があるセルの行
j0 = 1 ' 最初のx1があるセルの列(A列
i1 = 1 ' 回転後のx1を書き込むセルの行
j1 = 4 ' 最初の回転後x1を書き込むセルの列(D列)
Ndata = 10000 ' データ数
M = 100 ' データ組の数
k = 90 ' 角度(度)
'
ReDim xy(Ndata, 2) As Double
c = 3.14159265358979 / 180
sn = Sin(c * k)
cs = Cos(c * k)
'
Application.ScreenUpdating = False ' Excelグラフの再描画を禁止する
For j = 0 To M - 1
jj = j0 + 5 * j
For i = 0 To Ndata - 1
x0 = Val(Cells(i0 + i, jj))
y0 = Val(Cells(i0 + i, jj + 1))
xy(i, 0) = x0 * cs - y0 * sn
xy(i, 1) = x0 * sn + y0 * cs
Next i
Range(Cells(i1, jj + 3), Cells(i1 + Ndata - 1, jj + 4)) = xy()
Next j
Application.ScreenUpdating = True ' Excelグラフの再描画を許可する
No.3
- 回答日時:
一括計算するプログラムを作ってみました(動作確認済み)。
マクロの作成方法と実行方法は以下のとおりです。プログラム中に変数の意味うを書いておきましたので、数値は適当に直してください。【マクロ作成】 「ツール」→「マクロ」→「マクロ」→マクロ名に名前(kaiten)を入力→「作成」→ sub kaiten() と End Sub の間の行に以下のコードを貼り付ける
【実行方法】 ワークシートに戻り、「表示」→「ツールバー」→「Visual Basic」→出てきたツールバーの「マクロの実行(▲)」をクリック→「実行」をクリックすると計算される
↓----ここからコピー
Dim i As Long, i0 As Long, j0 As Long, i1 As Long, j1 As Long, Ndata As Long
Dim x0 As Double, y0 As Double, c As Double, sn As Double, cs As Double
Dim xy() As Double ' 回転後の xn,yn
Dim Ndada As Long ' ' データ数
Dim k As Double ' 回転角度(度)
'
i0 = 1 ' x1があるセルの行
j0 = 1 ' x1があるセルの列
i1 = 1 ' 回転後のx1を書き込むセルの行
j1 = 3 ' 回転後のx1を書き込むセルの列
Ndata = 10000 ' データ数
k = 90 ' 角度(度)
'
ReDim xy(Ndata, 2) As Double
c = 3.14159265358979 / 180
sn = Sin(c * k)
cs = Cos(c * k)
'
Application.ScreenUpdating = False ' Excelグラフの再描画を禁止する
Range(Cells(i1, j1), Cells(i1 + Ndata - 1, j1 + 1)).ClearContents ' 結果セルの消去
'
' ------- xn,yn の読み込み&回転計算
'
For i = 0 To Ndata - 1
x0 = Val(Cells(i0 + i, j0))
y0 = Val(Cells(i0 + i, j0 + 1))
xy(i, 0) = x0 * cs - y0 * sn
xy(i, 1) = x0 * sn + y0 * cs
Next i
'
' ------- 計算結果の書き出し
'
Range(Cells(i1, j1), Cells(i1 + Ndata - 1, j1 + 1)) = xy()
'
Application.ScreenUpdating = True ' Excelグラフの再描画を許可する
'
↑----ここまでコピー
ちなみに、このプルグラムでの計算時間はデータ数が10000で1秒くらいです。
ANo.2の方法(user関数)だと1分くらいかかります。
No.2
- 回答日時:
どうしてもVBAで書きたいのなら、
(1) Excelワークシートで「ツール」→「マクロ」→「Visual Basic Editor」
(2) Visual Basic Editor で 「挿入」→「標準モジュール」で出てきた画面に以下をコピー
Const c As Double = 3.14159265358979 / 180
Function new_x( k As Double, x As Double, y As Double) As Double
new_x = x * Cos(c * k) - y * Sin(c * k)
End Function
Function new_y( k As Double, x As Double, y As Double) As Double
new_y = x * Sin(c * k) + y * Cos(c * k)
End Function
(3) Excelワークシートに戻って、C1 に =new_x(90,A1,B1)、D1 に =new_y(90,A1,B1) と記入(k = 90度 の場合)し、C1とD1のセルをn 行までコピーする。
ANo.1 で書いたのと同様、 A列 に xn、B 列に yn が書かれていて、A1にx1、B1にy1があるとします。
この回答への補足
すみません。データ量(n個)が多いのと速度を優先させるために
matrixを利用したいのです。データ量は約10000行あります。
(一度に処理するデータ)
これを一定の座標変換処理で
A列はx値
B列はy値
として
一定の角度変換処理でD列に新x値
E列に新y値この操作が
200列あたりまで連続します。シートが数字だらけになるのです。
この操作を極力早く処理するためにMatrixを利用する必要が
あるのです。
すみません。何とかしてURLを探しました。
http://www.sis.otsuma.ac.jp/~tsutsumi/lecture/gr …
このような例です。ここのURLからの引用になりますが、
Excel VBAでもできないのか?という相談です。
当方は下記のそれぞれの式の意味が全く理解できていないので
P(xn,yn)としたときどう表示するかを聞きたいのですが・・・
下記は多分エクセルではなくてVBだと思いますが・・・
Private Sub Multi_Mat_Vec_Click()
Const pi = 3.1415927
Dim mat_a(1 To 2, 1 To 2)
Dim vec_b(1 To 2), vec_c(1 To 2)
rot_ang = Val(InputBox("回転角度は"))
rot_ang = rot_ang * pi / 180
mat_a(1, 1) = Cos(rot_ang): mat_a(1, 2) = -Sin(rot_ang)
mat_a(2, 1) = Sin(rot_ang): mat_a(2, 2) = Cos(rot_ang)
vec_b(1) = Val(InputBox("xの値は "))
vec_b(2) = Val(InputBox("yの値は "))
'行列の掛け算の定番プログラム----------------------------------------
For i = 1 To 2
vec_c(i) = 0#
For j = 1 To 2
vec_c(i) = vec_c(i) + mat_a(i, j) * vec_b(j)
Next j
Next i
Print "変換結果は ("; Format(vec_c(1), "0.000"); ","; Format(vec_c(2), "0.000"); ")"
End Sub
上記のどこにnが相当するかさえ理解できていません。
No.1
- 回答日時:
VBAで書くほどでもないと思います。
Excelのワークシートの A列 に xn、B 列に yn が書かれているとき(A1にx1、B1にy1があるとにます)
C1 に =A1*cos(k/180*PI())-B1*sin(k/180*PI())
D1 に =A1*sin(k/180*PI())+B1*cos(k/180*PI())
という式を書けば、C1 がx1'、D1 がy1'となります。あとはC1とD1をn行までコピーすれば xn, yn まで計算されます。
すみません。VBAコードでないと処理しきれないのです。
実験設備でデータが次々と10秒おきに入ってくる状況を
想定してください。似たような状況が存在しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 線形代数の2次元直交座標系、極座標系についての問題がわからないです。 2 2022/07/16 20:42
- Excel(エクセル) Excel VBAについてです。 少しだけ知識はあるのですが、 うまくいかなかったので 質問させてい 3 2022/09/13 18:40
- 数学 線形代数の問題について教えて欲しいです。 3 2023/05/06 23:13
- 物理学 角速度ベクトルにつきまして 3 2022/08/09 15:44
- 物理学 ミンコフスキー時空図の作図の仕方について 2 2023/04/30 10:01
- 数学 ベクトル方程式(ヘッセの標準形)についての質問 2 2022/04/23 18:00
- 中学校 中1数学 比例のグラフの座標の読み取り 4 2023/03/28 12:26
- 工学 Pythonの3Dグラフ表示に関する質問です。 1 2022/12/06 15:03
- Excel(エクセル) エクセル・スプレッドシートで、一定数を超えたらゼロから再累計する方法 8 2022/05/28 03:52
- 物理学 角運動量の式変形が分かりません。 4 2022/08/03 21:04
このQ&Aを見た人はこんなQ&Aも見ています
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数の文字列のいずれかが含ま...
-
Excelの入力規則で2列表示したい
-
SUMに含まれる範囲から特定のセ...
-
数式が入ったセルを含めて、数...
-
エクセルで表示されている数字...
-
Excel上でのデータ数字が連番で...
-
列の数字に100をかけたい
-
エクセルのsumifでかけ算してか...
-
エクセルで小数を含む数値の抽出
-
別のセルに値が入力されたら、...
-
エクセル:横長の表を改行して...
-
C列にF列の担当者(A〜)を順番...
-
時間を「昼間」と「夜間」に分...
-
エクセルでセルの値分の個数の...
-
HYPERLINKとADDRESSとMATCHの組...
-
Excel HLOOKUPで...
-
Excelでの検索結果を含む行だけ...
-
エクセルで2行まとめて並び替...
-
アルファベットを含む数をエク...
-
EXCELの特定セルを編集不可・コ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数の文字列のいずれかが含ま...
-
Excelの入力規則で2列表示したい
-
数式が入ったセルを含めて、数...
-
SUMに含まれる範囲から特定のセ...
-
列の数字に100をかけたい
-
Excel上でのデータ数字が連番で...
-
別のセルに値が入力されたら、...
-
エクセルで表示されている数字...
-
エクセル:横長の表を改行して...
-
エクセルでセルの値分の個数の...
-
スペースとスペースの間の文字...
-
HYPERLINKとADDRESSとMATCHの組...
-
Excelのセル内文字の並び替えに...
-
時間を「昼間」と「夜間」に分...
-
エクセルで曜日に応じた文字を...
-
エクセルで、毎日の走行距離(...
-
入退社日より各月末の在籍者数...
-
エクセルのsumifでかけ算してか...
-
Excelで五十音順に並べ替えたい
-
エクセルで1列全部10倍したい
おすすめ情報