Excel 2010 VBAでDouble型の配列を一発で読み込む方法と書き出す方法

このQ&Aのポイント
  • Excel 2010 VBAでDouble型の配列を一発で読み込む方法と書き出す方法を教えてください。
  • Dim A(100) as doubleの配列にワークシート「Sheet1」のセルA1:A100の値を一発で読み込む方法を教えてください。
  • 同様に、Double型の配列A(100)をワークシート「Sheet2」のセルB1:B100に一発で書き出す方法を教えてください。
回答を見る
  • ベストアンサー

Excel 2010 VBAで教えてください。

Excel 2010 VBAで教えてください。 Doubleの配列 Dim A(100) as double に ワークシート "Sheet1" セル A1:A100 の値を一発(For loop等を利用しない) で読み込むにはどうすればよいのでしょうか。 同じく、 Doubleの配列 A(100)を ワークシート "Sheet2" セル B1:B100 に一発で書き出すのはどうすればよいのでしょうか。  Variantにて Dim A as Variant では  A = Sheets("Sheet1").Range("A1:A100") で 読み込めました。 また Sheets("Sheet2").Range("B1:B100")で書き込みできましたが、double等でどうすれば良いのか知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8516/19360)
回答No.1

>Doubleの配列 Dim A(100) as double に ワークシート "Sheet1" セル A1:A100 の値を一発(For loop等を利用しない) で読み込むにはどうすればよいのでしょうか。 できません。 これが出来るのは、Variant型の配列に取り込む場合だけです。 これは「受け側は、Variant型の配列でなければならない」という「お約束」があるからです。 >同じく、 Doubleの配列 A(100)を ワークシート "Sheet2" セル B1:B100 に一発で書き出すのはどうすればよいのでしょうか。  「Option Base 1」に設定されている場合「A(100)」と言う配列は「1行100列」ですから「B1:B100」と言う「100行1列」の範囲に、そのまま書き込む事は出来ません。 Range("B1:B100") = A を実行すると、A(1)の値が、B1~B100に埋められます(B1~B100が全部同じ値になる) この場合は、配列を dim A(100,1) as Double などのように「100行1列」で宣言するか、行と列を入れ替える関数を用いて Range("B1:B100") = WorksheetFunction.Transpose(A) などのように、行と列を入れ替えて代入します。 なお「配列変数の値をセルに書き込む」のは、Variant型でも、Double型でも、どんな型でも出来ます。 これは「セルは、Variant型の配列と同じ扱い」になっていて「受け側は、Variant型の配列でなければならない」という「お約束」に従っているから可能なのです。 しかし、セルの値をDoubleの変数に読み込むのは「受け側は、Variant型の配列でなければならない」という「お約束」に違反しているので、出来ないのです。 例えば、以下のプログラム Dim a(10,10) As Double Dim b As Variant a(1,1) = 0.1 a(1,2) = 0.2 (略) a(10,10) = 100.0 b = a は、正しく実行できます。 この場合、bは「配列として宣言されてない」ですが、bに配列を代入すると「bは要素数が可変の動的配列」として扱われ、bは「Variant型の配列」になります。 すると「受け側は、Variant型の配列でなければならない」という「お約束」に従っている事になるので、実行できます。 しかし、以下のプログラムはエラーになります。 Dim a(10,10) As Double Dim b As Variant Dim c(10,10) As Double a(1,1) = 0.1 a(1,2) = 0.2 (略) a(10,10) = 100.0 b = a 'これは可能 c = b '「コンパイルエラー:配列には割り当てられません」が出る これは「受け側は、Variant型の配列でなければならない」という「お約束」に従ってないのでエラーです。 同様に Dim a(10,10) As Double Dim c(10,10) As Double a(1,1) = 0.1 a(1,2) = 0.2 (略) a(10,10) = 100.0 c = a '「コンパイルエラー:配列には割り当てられません」が出る と書いた場合も「受け側は、Variant型の配列でなければならない」という「お約束」に従ってないのでエラーです。 aとcは「同じ型で、要素数も同じ」ですから「一括で代入できそう」ですが、残念ながら「受け側は、Variant型の配列でなければならない」という「お約束」に背いているので、ダメなのです。

関連するQ&A

  • excel vba 配列の一部 一気に書き出し

    Excel VBAの配列の一部分をワークシートのセルに一気に書き出す方法を教えてください。 Dim A(12000,100) as double があります。 この中の A(1 ~ 12000 , 10) を ワークシートの cells(11,3) へ一気に縦方向に書き出したいのですが(B11から縦方向)、やり方を教えていただけないでしょうか。 cellsとしているのは、あとで 11,3 などを変数で指定したいためです。 doubleでダメな場合は、variantでもOKです。 よろしくお願いします。

  • Function 構文のなかに変数をいれたい(VBA)

    お願いします。 エクセルVBAにて 下記のようなFunction構文内に変数を設定する方法を 教えてください。 この中で k以外にも a = Sheets("sheet1").Range("E27") b = Sheets("sheet1").Range("E27") この変数を扱いたいのですが。 もしかして他にもfunction構文が必要でしょうか。 Function data(k As Double) Dim sum As Double Dim ct As Integer Dim keisu As Integer Dim a As Double Dim b As Double a = Sheets("sheet1").Range("E27") b = Sheets("sheet1").Range("E27")  以下 略

  • VBAで配列のある部分だけをを配列に入れたい

    VBAを勉強をしております。 例えばA1からG20までをある配列に入れているとします。 その配列のある部分(例えばB1からC20)を、別の配列にいれるにはどうすれば良いのでしょうか。 以下の方法で試してみましたが、上手くいきません。 Dim A() As Variant Dim B() As Variant A = Range("A1:G20") B = Range(Cells(A(1,2),Cells(A(20,3)))

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • Excel VBA でVLookUPの質問

    教えてください。 Excel VBA でVLookUPを使用したいのですが 毎回シート名も数も変わります。 そのため、検索範囲 のシート名をセル値が取得したいのですが どうすればよいでしょうか? 検索値 = AシートB列 検索範囲=BシートM列 書出し範囲=AシートU列 下記のコード作成しましたが ws = Worksheets("②価格集計").Range("U2").Value 検索用格納配列(i, 1) = "=VLOOKUP(B" & i + 1 & ",ws!A:M,13,0)" でエラーがでます。 他に方法があれば教えてください。 宜しくお願い致します。 Sub test() Dim 検索値 As Range '検索値 Dim 検索用格納配列 As Variant '検索用格納配列 Dim 出力範囲 As Range '出力範囲 Dim i As Long Dim 検索範囲 As Range Dim endrow As Long Dim ws As Worksheet endrow = Sheets("①SPOT売却明細貼付").Range("B" & Rows.Count).End(xlUp).Row Set 検索値 = Worksheets("②価格集計").Range("B3:B302") Set 出力範囲 = Worksheets("②価格集計").Range("U3:U302") ws = Worksheets("②価格集計").Range("U2").Value 検索範囲 = Worksheets(社名).Range("A:M") 検索用格納配列 = Range(検索値, 出力範囲) For i = 1 To endrow 検索用格納配列(i, 1) = "=VLOOKUP(B" & i + 1 & ",ws!A:M,13,0)" Next 出力範囲 = 検索用格納配列 End Sub

  • VBAエラー '1004' について

    VBA初心者です。 下のプログラムの★部分で 「実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです。」 というエラーが発生します。 どなたか原因を教えていただけないでしょうか?? Dim aRange As Range Dim bRange As Range Set aRange = Range(Sheets("シートA").Range("A3"), Sheets("シートB").Range("A3").End(xlDown)) ★ Set bRange = Range(Sheets("シートB").Range("A3"), Sheets("シートB").Range("A3").End(xlDown)) 下のシートBの範囲取得と同じことをしているつもりなのですが、うまくいきません。 どうぞよろしくお願い致します。

  • Excel VBA TREND関数について

    はじめまして、以前に教えて!gooに同じ質問が掲載されており、参考にさせて頂いたのですが 演算結果に違いが出てしまい原因がわかりません。どなたかアドバイスいただけませんか? 私の環境 winXP sp3 office2000 ---------------------------------------------------------------------------------- 以前の回答(1) Sub Trend_Test()   Dim y(10) As Double '既知のy   Dim x(10) As Double '既知のx   Dim newX As Double '新しいx   '配列y()、x()に値を代入   y(1) = 100: x(1) = 1   y(2) = 200: x(2) = 2   y(3) = 300: x(3) = 3   y(4) = 400: x(4) = 4   y(5) = 500: x(5) = 5   y(6) = 600: x(6) = 6   y(7) = 700: x(7) = 7   y(8) = 800: x(8) = 8   y(9) = 900.1: x(9) = 9   '新しいx(例)   newX = 5.5   '試しに計算結果を出力   Range("A1") = Application.Trend(y, x, newX, True)   Range("A2") = Application.Trend(y, x, newX + 1, True)   Range("A3") = Application.Trend(y, x, newX + 2, True) End Sub ---------------------------------------------------------------------------------- 以前の回答(2) Sub TEST_Trend() Dim x As Variant Dim y As Variant Dim NEWx As Double x = Array(0.005479452, 0.019178082, 0.038356164, 0.082191781, 0.167123288 _ , 0.252054795, 0.328767123, 0.41369863, 0.495890411, 0.580821918, 0.663013699 _ , 0.747945205, 0.832876712, 0.915068493, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 15, 20) y = Array(0.055, 0.055, 0.057, 0.064, 0.086, 0.086, 0.087, 0.096 _ , 0.099, 0.1, 0.1, 0.1, 0.01, 0.103, 0.106, 0.15, 0.233 _ , 0.347, 0.483, 0.64, 0.817, 0.995, 1.163, 1.31, 1.545, 1.797, 2.07) NEWx = 0.05 Dim i As Integer For i = 1 To 20 Cells(i, 1) = Application.Trend(y, x, NEWx + i - 1, True) Next i End Sub ---------------------------------------------------------------------------------- 今回の検証 Dim y(6) As Double Dim x(6) As Double Dim newX As Double Dim YY As Variant Dim XX As Variant newX=7 y(1) = 92.87: x(1) = 1 y(2) = 92.55: x(2) = 2 y(3) = 91.64: x(3) = 3 y(4) = 92.3: x(4) = 4 y(5) = 93.29: x(5) = 5 y(6) = 92.59: x(6) = 6 Range("A1") = Application.trend(y, x, newX, True) Range("A1") には"119.085714285714"が出力されます XX = Array(1, 2, 3, 4, 5, 6) YY = Array(92.87, 92.55, 91.64, 92.3, 93.29, 92.59) または XX = Array(x(1), x(2), x(3), x(4), x(5), x(6)) YY = Array(y(1), y(2), y(3), y(4), y(5), y(6)) Range("B1") = Application.trend(YY, XX, newX, True) Range("B1") には"92.688"が出力されます ワークシート上でtrend関数を実行すると "92.688"を返しますので Arrayを使用した値と同じです ここで問題がありまして Do...Loop等でx(1)~x(6), y(1)~y(6)の値を取り出しています 取り出した配列(値は固定ではないのです)をどうのように Array(1, 2, 3, 4, 5, 6) または Array(x(1), x(2), x(3), x(4), x(5), x(6)) 等の形にしたら良いか分かりません たとえば Dim a as String Dim b as String a="1, 2, 3, 4, 5, 6" b = "92.87, 92.55, 91.64, 92.3, 93.29, 92.59" XX = Array(a) YY = Array(b) また、 Dim a As Variant Dim b As Variant a="1, 2, 3, 4, 5, 6" b = "92.87, 92.55, 91.64, 92.3, 93.29, 92.59" XX = Array(a) YY = Array(b) Range("D1") = Application.trend(YY, XX, newX, True) 演算結果は"#VALUE!"を返します どうのようにしたらよいのでしょうか?

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。  動作環境は  OS:WINDOWS XP  エクセル2003  です。 今、Book1.xlsというエクセルファイルがあります。 このファイルの中に、【sheet1】,【sheet2】,【sheet3】の3つのシートが存在しています。 【sheet1】および【sheet2】には、A列=ユニーク番号、B列=データ1、C列=データ2・・・・n列=データnの値が約1500行(各行で、データの値は異なります。)入っています。 この【sheet1】と【sheet2】のデータの内容を照合して【sheet3】にその結果を反映(TRUEまたはFALSE)します。 仮に【sheet3】のあるセル(仮にD3)の値がTRUEとなったら、【sheet1】のセル(D3)の値を【sheet3】のセル(D3)に代入する。 逆に【sheet3】のあるセルの値がFALSEとなったら、そのセルはFLASEのままにする。プログラムは以下の様にしたのですが、全てを処理するまでに相当時間がかかっています。 VBAのプログラムは今回初めて書いたので、プログラムが悪いのか、プログラムの思想が悪いのかがわかりません。 どなたかご教授していただけませんか?多分、コードの書き方もキレイではないと思います(悲) Private Sub データ照合ボタン_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Long Dim area As Range Dim A As Variant Dim WrkRange As String '----シート(1)とシート(2)の各セルの値を比較---- With Sheets("sheet1") WrkRow = .Cells(Rows.Count, 3).End(xlUp).Row End With Sheets("sheet3").Select For i = 12 To WrkRow WrkRange = Range("C" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" WrkRange = Range("D" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" '・           '・           '・ Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("C" & i).Select Selection.Copy Range("C" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("C" & i) = True Then Sheets("sheet1").Select Range("C" & i).Copy Sheets("sheet3").Select Range("C" & i).Select ActiveSheet.Paste Else: End If Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("D" & i).Select Selection.Copy Range("D" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("D" & i) = True Then Sheets("sheet1").Select Range("D" & i).Copy Sheets("sheet3").Select Range("D" & i).Select ActiveSheet.Paste Else: End If Next i          '・          '・          '・    End Sub

  • EXCEL VBAを利用して別ウィンドウでブックを起動する

    エクセルファイル(A.xls)内のセル($A$1)をダブルクリックすることで、エクセルファイル(B.xls)のワークシート(1)を開くVBAを作成しています。 ここまでは出来たのですが、1つ問題があります。 上記VBAでは、A.xls と B.xls が1つのエクセルファイルとして開かれてしまいます。(表現が誤っていれば申し訳ないです) どういうことかと言いますと、A.xlsもしくは、B.xlsのどちらかを閉じると両方閉じてしまいます。また、A.xlsとB.xlsを画面上に並べて比較することができず、画面下のタブを切り替えてそれぞれのファイルを見なければなりません。 例えば、スタート→プログラム→MicroSoftOffice→EXCELを2回行えば、エクセルファイルが別ウィンドウでそれぞれ独立して立ち上がります。要は、A.xlsのセル($A$1)をダブルクリックした時にB.xlsはこのような状態で立ち上がってきて欲しいのです。 以下、作成途中のVBAコードの一部です。A.xlsのセル($A$1)をダブルクリックすると、独立したエクセルを開くことはできました。 Dim OP As Double   OP = Shell("EXCEL.EXE", vbMaximizedFocus) しかし、B.xlsのワークシート(1)はA.xlsと1つのファイルとして開かれてしまいます。 (例:A.xlsのセル($A$1)をダブルクリックすると、B.xlsと新規EXCELファイルの全部で3つの状態になります。) 目標は、A.xlsのセル($A$1)をダブルクリックすれば、B.xlsのワークシート(1)が開く。 A.xlsのセル($B$2)をダブルクリックすれば、B.xlsのワークシート(2)が開くです。 長くなりましたが、どうかご助言よろしくお願い致します。 【作成途中VBAコード】 Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean) Dim OP As Double    Dim Bfile As String Bfile = target.Address Select Case Bfile Case "$A$1" OP = Shell("EXCEL.EXE", vbMaximizedFocus) Workbooks.Open ("C:\B.xls") Worksheets("ワークシート(1)").Activate Case Else End Select End Sub

専門家に質問してみよう