• ベストアンサー

エクセルVBAで配列?

以下は、文字列"t", "e", "s", "t"を配列に取り込み、セルに表示する例ですが、 ar = Array("t", "e", "s", "t") なら作動しますが、セル範囲から取り込もうと、 ar = Range("A1:D1").Value とするとエラーになります。 どうしてでしょうか? Sub test() Dim ar As Variant Dim n As Integer ar = Array("t", "e", "s", "t") 'ar = Range("A1:D1").Value For n = LBound(ar) To UBound(ar) Cells(n + 1, 5) = ar(n) Next n End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 今回は、配列がテーマですから、配列のお答えをしなくてはならないと思います。 >ar = Range("A1:D1").Value 通称、ジャグ配列といいます。2次元配列の変形したものです。 本来は、参考の部分のように、1次元側と、2次元側、両方を調べなくてはなりません。 Set で、Rangeオブジェクトにした場合は、配列変数ではありません。あくまでも、ar が、Variant だから、Rangeオブジェクトを変数として可能になるだけです。 Sub test2()   Dim ar As Variant   Dim n As Integer   Dim i As Integer   Dim j As Integer      ar = Range("A1:D1").Value   '参考   i = UBound(ar, 1)   j = UBound(ar, 2)      For n = LBound(ar, 2) To UBound(ar, 2)     Cells(n + 1, 5).Value = ar(1, n)   Next n End Sub       セルの値は、とびとびでも、同じことです。 なお、2次元までが精一杯で、それ以上の次元はややこしくてしょうがないです。 また、動的配列の場合は、1次元側を触ることは出来ません。2次元側で処理します。

merlionXX
質問者

お礼

i = UBound(ar, 1) j = UBound(ar, 2) 一次元と二次元で違うことがわかりました。 有難うございました。

その他の回答 (12)

回答No.13

お師匠さん、流石です。 昨夜の本場薩摩の芋焼酎が少々お手伝いをしたのでせうかねぇ。 昨夜午前0時少し前、 「VisibleRange,SmallScroll等を調べてみたらどうでしょう」 と途中まで書きかけていたのですが、 たぶんその時分はほろ酔いだろうとボツにしたところでした。 それにしてもほんとに上達が速いですねぇ。びっくりします。 これからは、「VBAエキスパートMerlion様」とお呼びせねばなりますまいねぇ。(^o^)/~~ これからも初級者、中級者(時には上級者)の方にも、 目から鱗の回答をしながらご自身でもますます精進してくださいな。 ----------------------------------------------------- >「てんがらもん」とは当地の方言 そう言われれば、そんなこと口走ったような。。。 忘れっぽい性格はなかなか治りませぬよ。 ●連休は3泊4日の予定で京都旅行です♪ 「それがどうした!」と言われれば、二の句が継げませんが。(^^;;;  

merlionXX
質問者

お礼

ありがとうございました。 鹿児島にはまだ行ったことありませんが、薩摩の芋焼酎、美味しいですね!苦瓜も好きですよ。 いえいえ、まだまだ初心者の域を脱しきれずにおります。 お教え、有難うございました。 良いご旅行を。(^o^)/

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.12

こんにちは。Wendy02です。 >ワークシート関数でもVBAでも配列は難しいですねえ・・・・。 ご存知でしたら、余計なことかもしれませんが、VBAの配列に関しては、大村あつし氏の『かんたんプログラミング Excel VBA 応用編』で、出てきます。VBAでは、配列に関連するものは、多次元配列, 動的配列, Collection, Dictonary (パラメータ配列は別)ぐらいを抑えておけばよいと思います。 ただ、私は、ワークシートのほうが遥かに難しいとは思います。以前の質問の回答の中で、文字列の並べ替えをするというものがありました。それを、関数だけで出来るとは夢にも思いませんでした。確かに、出来上がったものは分かっても、発想自体が、関数の配列の取り扱い方が見えてこない限りは、自分自身では作れないような気がします。 私は、ある程度、ユーザー定義関数で、配列の関数は出来ますが、既存のものを解読するのは、なかなか難しいです。

merlionXX
質問者

お礼

Wendy02さま、重ね重ね有難うございます。 今後ともご指導のほど、よろしくお願いいたします。

回答No.11

いまお暇モードなのでまたまた登場。 納得されたようで何より。 序に一言。 「VBAで特定のテキストボックスを画面中央に来るように表示したい」 この質問の回答見ました。おお、といふ感じです。 お暇なときにでも、画面中央というところまでコードにしてみたらどうでしょう。 勉強になると思います。 ところで最近VBAの回答者にお師匠さんの名前をよく見かけるようになりました。 頼もしい限りです。 その調子でますます精進してくださいな。 >今夜は芋焼酎で祝杯をあげようかなあ まさかここで芋焼酎が出てくるとは、びっくりくりくりくりくり坊主。 びっくりした理由 ↓↓↓     Kobouzu lives in Kagoshima City....(^o^)/~~    

merlionXX
質問者

お礼

スクロールでテキストボックスを画面の中央にですか? テキストボックスを画面中央に移動させるのならなんとかできそうですが、そうやったらレイアウトが崩れてしまいますよね?う~ん、難しいです。 芋焼酎はわたしの好物です。 (^∇^) で、存じてたから書いたんですよ~。以前の >「てんがらもん」とは当地の方言 でわかりました。

merlionXX
質問者

補足

遅くなったので読んでいただけるかどうか・・・。 > 画面中央というところまでコードにしてみたらどうでしょう。 なんとか出来ました! ↓こんな感じでどうでしょうか? Sub test03() Dim myRng As Range Dim wc As Integer, hc As Integer, rc As Integer, cc As Integer With ActiveSheet.TextBoxes("テキスト 1") Set myRng = Range(.TopLeftCell, .BottomRightCell) End With wc = myRng.Columns.Count hc = myRng.Rows.Count Application.Goto Reference:=myRng, Scroll:=True With ActiveWindow rc = .VisibleRange.Rows.Count cc = .VisibleRange.Columns.Count .SmallScroll Down:=Int((hc - rc) / 2) .SmallScroll ToRight:=Int((wc - cc) / 2) End With End Sub もう締め切っているので質問No2943282 の方に伝えられないのが残念ですが・・・・。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

こんにちは。 >test001がうまく行って、002がエラーも出ないのにRange("C1:C10")に代入されない理由です。 私が、書いている最中に、解決したようですね。一応、そのまま、載せておきます。 それは、br(10, 1) の配列のサイズが違っていますね。 br(0 to 10, 0 to 1) ということになっているので、その構造に、Rangeオブジェクトを反映させます。 Range("C1:D11").Value = br エラーが出ないのは、2列目側に入っているからです。だから、2列目の2行目から出力されるはずです。 または、 モジュールの先頭に、 Option Base 1 としてあげればよいです。あまり、このオプションは使うことはないと思います。このほかにも、2次元配列独特にテクニックはあるのですが、面倒な作業ばかりですから、避けて通れるものなら、避けて通っても、困りもしないと思います。

merlionXX
質問者

お礼

ありがとうございます。 ワークシート関数でもVBAでも配列は難しいですねえ・・・・。

回答No.9

ある時は、kobouzu、またある時は、ta.....(笑)   ちょっとこんがらがってしまったようですね。 今度はちゃんと説明します。 ---------------------------------------------  ar = Array("t", "e", "s", "t") 配列宣言したとすると、Dim ar(3) For i=LBound(ar) to UBound(ar) For i=0 to 3 --------------------------------------------  ar = Range("A1:D1") 配列宣言したとすると Dim ar(1,4)  ← ▲後で説明あり For i=LBound(ar,1) to UBound(ar,1)   For j=LBound(ar,2) to Ubound(ar,2) For i=1 to 1   For j=1 to 4 ----------------------------------------------- どうですか、お気づきになったでしょうか。 セル範囲の場合カウンターのスタートが"0"からではなくて"1"から始まってますよね。 ですから、上記では、Dim ar(行、列)で、  Dim ar(1,4) と書きましたが、実際は  Dim ar(1 to 1, 1 to 4) と各次元の添字のOption Base が1になっているのです。   ふつう、Dim ar(1,4) は、Dim(0 to 1, 0 to 4) ですよね。 ●まとめ● (1)セル範囲を配列変数に入れた場合は、2次元配列になる。 (2)各次元の添字は、普通の配列とは違って、0からではなく、1から始まる。 尚、LBound(ar,1)とLBound(ar)の違いは、ヘルプをご覧あれ。 口で説明すると簡単に済むのですが、文章ではなかなか。。。(^^;;; 以上です。

merlionXX
質問者

お礼

ありがとうございます。 おかげさまでやっと納得できました。 #8のお礼で再質問した件も、 > ふつう、Dim ar(1,4) は、Dim(0 to 1, 0 to 4) ですよね。 のおかげで原因がわかり、解決できました。 いつもおせわになり有難うございます。 今夜は芋焼酎で祝杯をあげようかなあ o(^-^)o

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 >2次元配列のRangeは、arを一次元配列としてみると、行方向しかカウントしないのでしょうか、 こういう話を突っ込んでいくと、おっしゃっている話は、VBAを遥かに超えて、マシン語の世界に入ってしまうと思います。 イメージで、2次元配列を縦横のマトリックスに捉えるのが楽だからするのであって、本来、メモリ上は、1次元の世界だそうです。VBAのLboundとか、Uboundの関数自体が、そういうような取得をするだけであって、その関数は、そういう書式(フォーマット)を読み取るだけのものなのだと思うのです。 以下は、一次元配列ではなくて、一次側の配列の下限・上限ですね。 Set rng = Range("A1:D2") ar = rng.Value i = LBound(ar) ' i =Lbound(ar, 1) j = UBound(ar) 'j = UBound(ar, 1) RangeオブジェクトのValueから、配列を取り出すときと、Rangeオブジェクトは、構造的には、まったく違ったものです。 こういう表を作って、読み出しの実験をしてみるとよいです。  A   B   C   D 1,1  1,2  1,3  1,4 2,1  2,2  2,3  2,4 Set rng = Range("A1:D2") ar = rng.Value For Each v In ar  n = n + 1  Debug.Print n, v Next v ところが、これは、rng 変数を以下のようにループしたものとは、数は同じでも、その読み出し方が違います。 Set rng = Range("A1:D2") For Each c In rng  n = n + 1  Debug.Print n, c.Value Next c こんなことを書いても、それで理解されると思いません。どちらかというと、ワークシートとは切り分けて考えたほうがよいのかもしれませんね。

merlionXX
質問者

お礼

何度も有難うございます。 なるほど、配列は縦方向に、範囲は横に、読み出していますね! ご指摘の通り、ほとんど理解できていません、済みません。 最後にこれだけ教えていただけませんか? test001がうまく行って、002がエラーも出ないのにRange("C1:C10")に代入されない理由です。 Sub test001() Dim ar Dim br ar = Range("A1:B10").Value br = Range("C1:C10").Value For i = LBound(ar, 1) To UBound(ar, 1) br(i, 1) = (ar(i, 1) = ar(i, 2)) 'Debug.Print br(i, 1) Next Range("C1:C10").Value = br End Sub Sub test002() Dim ar Dim br(10, 1) ar = Range("A1:B10").Value For i = LBound(ar, 1) To UBound(ar, 1) br(i, 1) = (ar(i, 1) = ar(i, 2)) 'Debug.Print br(i, 1) Next Range("C1:C10").Value = br End Sub

merlionXX
質問者

補足

Wendy02さま、解決しました。 Dim br(10, 1)ではいけなかったのですね。(9, 0)だったのですね。 以下で成功しました。 Sub test003() Dim ar Dim br(9, 0) ar = Range("A1:B10").Value For i = LBound(ar, 1) To UBound(ar, 1) br(i - 1, 0) = (ar(i, 1) = ar(i, 2)) 'Debug.Print br(i, 1) Next Range("C1:C10").Value = br End Sub

回答No.7

お師匠さん、こんばんは。 あまり難しく考えずに、 ar = Range("A1:D1").Value のようにセルの値を代入した場合は 必ず2次元配列になる。  Dim ar(行、列)  と単純に覚えたらどうでしょう。   '--------------------------------------------------------  Sub Test()  Dim ar As Variant  Dim R As Long  Dim C As Long  ar = Range("A1:D1").Value  MsgBox "行 " & LBound(ar, 1) & " to " & UBound(ar, 1) & Chr(10) _     & "列 " & LBound(ar, 2) & " to " & UBound(ar, 2)  For R = LBound(ar, 1) To UBound(ar, 1)    For C = LBound(ar, 2) To UBound(ar, 2)      Range("G1").Offset(R, C) = ar(R, C)    Next C  Next R End Sub '------------------------------------------------------------ データがどういうふうに取り込まれているか確認するためには 取り込むデータと同じに列方向に出力した方が確認しやすいですね。 上記コードではそうしてあります。 また、ar=Range("A1:D2").valueと複数行がどう取り込まれるかも確認するとなお分かり易いと思います。   おっと大事なことを忘れてました。最重要事項?  ar = Array("t", "e", "s", "t") のL,UBound(ar)と  ar = Range("A1:D1") のL,Ubound(ar)を比べてみてください 重要な違いに気づくことでしょう。 この違いに気づかなければ本当に理解したとは言えません。 などと偉そうなことを言ってみたくなる花散らしの雨の夜。(^^;;;  以上です。  

merlionXX
質問者

お礼

> ar = Range("A1:D1").Value のようにセルの値を代入した場合は > 必ず2次元配列になる。 了解です。 > ar = Array("t", "e", "s", "t") のL,UBound(ar)と > ar = Range("A1:D1") のL,Ubound(ar)を比べてみてください Arrayは0-3、Rangeは1-1でした。 UBound(ar)って、覚えたてですが、arを一次元配列としてみているのですよね?だからもともと1次元の"t", "e", "s", "t"は、0から3までの4つ、 2次元配列のRangeは、arを一次元配列としてみると、行方向しかカウントしないのでしょうか、1-1でした。よくわかりません。(ar = Range("A1:D2")なら1-2を返しました) でもkobouzu_suさん? ん?

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.6

>実行時エラー13で型が一致しませんとなりました。 失礼しました。 下記のようにしてみて下さい。 Sub test() Dim ar As Variant Dim n As Integer ar = Range("A1:D1") For n = LBound(ar, 2) To UBound(ar, 2) Cells(n + 1, 5) = ar(1, n) Next n End Sub

merlionXX
質問者

お礼

(ar, 2)が「二次元配列」という意味だとわかり理解できました。 有難うございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#4 に足しておきます。 参考までに、オブジェクトと配列の違いについては、このような結果になって現れます。 オブジェクトを確保しなければ、test3 は、出力することは出来ません。しかし、test4 は、オブジェクトは必要ではありません。すでに、配列変数として確保しているからです。 Sub test3() 'オブジェクト   Dim ar As Variant   Dim n As Integer      Set ar = Range("A1:D1")   'Range("A1:D1").Delete 'これを入れるとエラーが発生する      For n = 1 To ar.Columns.Count     Cells(n + 1, 5).Value = ar(1, n)   Next n End Sub Sub test4() '配列   Dim ar As Variant   Dim n As Integer      ar = Range("A1:D1").Value   Range("A1:D1").Delete 'エラーは起こりません。      For n = LBound(ar, 2) To UBound(ar, 2)     Cells(n + 1, 5).Value = ar(1, n)   Next n End Sub 飛び飛びのセルの場合は、Area というものが入ってくるので、ややこしくなりますが、配列ですと、一旦変数に確保すれば簡単です。 Sub Test1_Area() Dim r As Range Dim i As Integer Dim j As Integer Dim n As Integer  Set r = Range("A1:C1,E1")  n = 1  For j = 1 To r.Areas.Count   For i = 1 To r.Areas(j).Cells.Count    Cells(n + 1, 5).Value = r.Areas(j).Cells(i).Value    n = n + 1   Next i  Next j End Sub Sub Test1_Array() Dim r As Range Dim c As Variant Dim i As Integer Dim n As Integer Dim ar() As Variant  Set r = Range("A1:C1,E1")  ReDim ar(r.Count - 1)    For Each c In r   ar(i) = c.Value   i = i + 1  Next c  For n = LBound(ar) To UBound(ar)    Cells(n + 2, 5).Value = ar(n)  Next n End Sub

merlionXX
質問者

お礼

いつもお世話になります。 わたしには難しすぎて一度に理解できそうもありませんが、徐々に覚えていこうと思います。 有難うございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

私が回答するのはおこがましいのですが… 実験したところ以下なら動きました。 Sub test1() Dim ar As Variant Dim n As Integer  Set ar = Range("A1:D1")  For n = 1 To Range("A1:D1").Count   Cells(n, 5) = ar(n)  Next n End Sub またご存じと思いますが  Set ar = Range("A1") の後では、Cells(i,j) と ar(i,j) は同じ意味になります ものの本には「Rangeオブジェクトは内部的には配列で管理されているためどこかのセルをバリアント型変数に格納するだけで配列ができてしまう」とありました。 ただし配列の起点からの連続した範囲が必要ですので Range("A1:D1") や Range("A1:A4") は動きますが、Range("A1:C1,E1")のように範囲が離散するとダメでした。より正当な解説は他の皆様に期待します

merlionXX
質問者

お礼

有難うございました。 「配列」と言うのがよくわかってなくて・・・。 難しいですねえ。

関連するQ&A

  • エクセルVBAで配列内に空白データを入れる場合

    エクセル2000です。 ある大きな表のうち、0値を非表示ではなく完全に削除するために以下のようなマクロを書いてみました。 一旦配列に取り込んでいるのは高速化のためです。 これで見た目には目的を達しているのですが、実際には0値が長さ0の文字列に変わっただけで完全な空白にはなっていません。 配列にとりこまず、セルをループして0値のセルをClearすれば解決するのはわかるのですが、ほかにいい方法はないでしょうか? Sub TEST0値() Dim myAr With ActiveSheet x = .Range("A" & Rows.Count).End(xlUp).Row myAr = .Range("A4:AP" & x).Value For i = LBound(myAr, 1) To UBound(myAr, 1) For n = LBound(myAr, 2) To UBound(myAr, 2) If myAr(i, n) = 0 Then myAr(i, n) = "" Next n Next i .Range("A4:AP" & x).Value = myAr End With End Sub

  • 【エクセルvba】(1)(2)(3)を区切りとして分けたい 配列

    こんばんは。 もしエクセルで可能なら教えていただきたいです。(2003です) A1セルに (1)りんご(2)みかん(3)バナナ と入力されています。 これを A2にりんご、B2にみかん、C2にバナナ とSplitと使って区切りたいのですが不可能でしょうか? 以下がここのサイトを参考にして作ったサンプルマクロです。 Sub サンプル() Dim myStr As String Dim ar As Variant myStr = Cells(1, 1) ar = Split(myStr, "") '←この部分をどうすればいいのかわからない Cells(2, 1).Resize(1, UBound(ar) + 1).Value = ar End Sub やはり、区切る文字が複数ある場合は不可能でしょうか? ご教授よろしくお願いします。

  • 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

  • エクセルVBAを教えて下さい

    エクセルの表で -AB C D E F 1年月--1801 2------ 3------ 4------ (-)は空欄でセルE1=18、F1=1とします。 コントロールボックスをつかって Private Sub Command登録_Click() Dim d1 As Long Dim d2 As Long Dim ret As Variant Dim FindValue As String Dim TotalAddress As String If Range("E1").Value = "" Or Range("F1").Value = "" Then MsgBox "該当する場所にデータが入っていません。", vbCritical Exit Sub End If d1 = Range("A65536").End(xlUp).Offset(1).Row d2 = Range("B65536").End(xlUp).Offset(1).Row FindValue = """" & Range("E1").Value & Range("F1").Value & """" TotalAddress = Range("A1").Resize(d1).Address & "&" & Range("B1").Resize(d1).Address ret = Evaluate("MATCH(" & FindValue & "," & TotalAddress & ",0)") If IsError(ret) Then Cells(d1, 1) = Range("E1").Value Cells(d2, 2) = Range("F1").Value Else MsgBox "既に同じ組み合せがあります。", vbInformation End If End Sub というものを作ったのですが、E1=18、F1=1及びコマンドボタンを別シートに作成し、上記の表への登録をできるようにしたいのですが、なにかいい方法はありませんか?

  • エクセルVBAで配列の追加

    エクセル2000です。 1行4列のセル範囲のデータを配列に取り込んで、後から別の1行4列のセル範囲のデータを配列に追加し、2次元配列として吐き出そうと思います。 最初の範囲がA1:D1、追加範囲がA4:D4とした場合、こんな不細工なコードになってしまいました。 これでも動きますが、どう修正すべきでしょうか? Sub test() Dim myAr() myAr = Application.Transpose(Range("A1:D1").Value) ReDim Preserve myAr(1 To 4, 1 To 2) For i = 1 To 4 myAr(i, 2) = Cells(4, i) Next i Range("F1").Resize(UBound(myAr, 2), UBound(myAr, 1)).Value = Application.Transpose(myAr) End Sub

  • エクセルVBAでTransposeの不思議

    MS Officeのエクセル2000です。 下記Sub test01はRange("A1:I1")に文字列を入力し、一旦配列に取り込んでからワークシートに貼り付けるものです。 試験用のコードですので意味はありません。 このコードで255文字まではまったく問題はありません。 ところが、256文字以上の場合、横に貼り付けは問題ないのですが、 Transposeで縦に変換すると型が一致しません。(Error 13)となります。 どうしてでしょうか? 試行錯誤の結果、Sub test02のように一旦横に貼ったデータをコピーしてTransposeして貼り付けるのは大丈夫のようですので不思議でしょがありません。 またこの方法は列数256より要素が多い配列には使えないので解決策にはなりません。 ご教示くださいませ。 Sub test01() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A5").Resize(UBound(myAr, 2)).Value = Application.Transpose(myAr) '256文字の場合エラー End With End Sub Sub test02() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A3").Resize(, UBound(myAr, 2)).Copy .Range("A5").PasteSpecial Paste:=xlValues, Transpose:=True '256文字の場合もOK Application.CutCopyMode = False End With End Sub

  • Array配列について教えてください。

    重複を防止する為に当サイトにて伝授頂きました。 付きましては、下記コードの c_in = Array("A1", "A2", "A3", "A4", "A5") '//処理対照セル名を列記(入力セル) c_cmp = Array("A1", "A2", "A3", "A4", "A5") '//比較対照セル名を列記(参照セル) の Array("A1"・・・) 部分を A1:A500 若しくは A列全体 としたいのですが、方法はありますでしょうか? 宜しくお願いいたします。 ・・・コード・・・ Sub Code_Check(s_ad As String) Dim st As Worksheet, rng As Range, flag As Boolean Dim i As Long, s, c_in, c_cmp Set rng = ActiveSheet.Range(s_ad) On Error Resume Next If rng.Value = "" Then Exit Sub On Error GoTo 0 c_in = Array("A1", "A2", "A3", "A4", "A5") '//処理対照セル名を列記(入力セル) c_cmp = Array("A1", "A2", "A3", "A4", "A5") '//比較対照セル名を列記(参照セル) flag = True i = LBound(c_in) '//処理対照セルかどうかを判定 While flag And (i <= UBound(c_in)) If rng.Address = Range(c_in(i)).Address Then flag = False i = i + 1 Wend If flag Then Exit Sub '//ブック内の全シートについて比較 For Each st In Worksheets For Each s In c_cmp If st.Range(s).Value = rng.Value Then If (st.Name <> ActiveSheet.Name) Or (st.Range(s).Address <> rng.Address) Then MsgBox ("重複エラー!!" & Chr(13) & "" & Chr(13) & "入力した受注番号は当BOOK内に既に存在します!確認して下さい!") Exit Sub End If End If Next s Next st End Sub

  • エクセルVBA

    Sub PlusA001() Dim a As Range Dim b As Integer Range("e1").Value = "氏名" Range("e2").Value = "甲" Range("e2").AutoFill Destination:=Range("e2:e10"), Type:=xlFillDefault Range("f1:j1").Value = Array("国", "数", "理", "社", "英") Set a = Range("f2") For i = 1 To 5 Do Until b = 9 a.Value = Int(100 * Rnd) + 1 b = b + 1 Set a = a.Offset(1, 0) Loop b = 0 Set a = a.Offset(-9, 1) Next i End Sub サンプルコードの例ですが、どうも実行しても納得できない部分があります。それはSet a=a.offset(-9,1)の部分です。Set a = Range("f2")においてf2を始点としているのは判りますが、f2からであればa=a.offset(-9、5) とすればいいのかと思い実行したのですが、ぐちゃぐちゃになります。なぜ(-9、5)ではなく(-9、1)何ですか?いくら読み解いても判りません。教えてください。

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • エクセル2003のVBAで列を指定

    エクセルで特定の列の2~10行目に対して、ある作業をする場合、列を指定する方法は以下のどれがいいでしょうか?あるいはもっといい方法があれば教えてください。 実際には列は約40列(固定)、行は1~2万行(変動)程度で、作業はもっと複雑です。 Sub test01() Dim col Dim i As Long, n As Long For Each col In Array(1, 3, 7, 8, 11) '列番号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test02() Dim col Dim i As Long, n As Long For Each col In Array("A", "C", "G", "H", "K") '列の記号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test03() Dim col Dim i As Long, n As Long For Each col In Range("A2,C2,G2,H2,K2") 'セルで指定 For i = 2 To 10 n = n + 1 col.Offset(i - 2).Value = n Next i Next col End Sub

専門家に質問してみよう