プロが教えるわが家の防犯対策術!

こんにちは。


エクセルでの名前定義ですが、通常、下記のように、セル番地を使用すると思いますが、
配列を使用することは出来ないのでしょうか?

ActiveWorkbook.Names.Add Name:="test", RefersToLocal:="=Sheet1!$A$1:$B$2"


下記のようなマクロを作り実行しましたが、うまくいきませんでした。

Dim ABC(0 to 1)

ABC(0) = 1
ABC(1) = 2

ActiveWorkbook.Names.Add Name:="test", RefersToLocal:="=ABC"

ご指導のほど宜しくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

昔のことでうろ覚えですが、xl2003以前でグラフの系列にワークシートを介さないで値を設定する際に、データ数の制約回避のために、どこかで見つけて来て使った事があります。


http://oshiete.goo.ne.jp/qa/6368497.html
#4で、
For i = 1 To rs.RecordCount
arrayX(i, 1) = rs.Fields(1)
arrayY(i, 1) = rs.Fields(2)
rs.MoveNext
Next i
ThisWorkbook.Names.Add Name:="Date", RefersTo:=arrayX
ThisWorkbook.Names.Add Name:="Rate", RefersTo:=arrayY
てな事をやっています。
時間もないので詳しく見ておりませんが、ご参考まで。
    • good
    • 0
この回答へのお礼

mitarashiさん、こんにちは。

ありがとうございました。

可能性がありそうなので、試してみます!

お礼日時:2015/01/07 15:52

こんにちは。



私も、少し書かせていただきます。

名前定義自体は、ワークシート上のあくまでも、セルの範囲を名前付けすることですから、
VBAの変数を、セル上に埋め込むことはできませんね。
逆に、こんどは、セル上の配列というのは何かというと、あくまでも、数式的に存在するものですね。

>ActiveWorkbook.Names.Add Name:="test", RefersToLocal:="=ABC"
何を意図しているのか、あまりよく分かりませんが、RefersToLocal:=[****]のパラメータには、配列は入ります。ただし、VBAの配列ではなく、ワークシート上の配列です。

例えば、
RefersToLocal:="={1,2,3,4}"
このようなスタイルの配列です。セルの配列には、縦と横がありますから、1次元の縦、横、または、2次元(あくまでも論理的配列)までは入るはずです。
    • good
    • 0
この回答へのお礼

WindFallerさん、こんにちは。

VBAの配列はNGなんですね。

ありがとうございました。

お礼日時:2015/01/07 15:50

名前定義はセル範囲に対して行う物です。


配列変数に名前定義をする事は出来ません。
もしかしてやりたいのは配列のコピーでしょうか?
でしたらこんな感じで出来ます。

  Dim ABC(0 To 1), test As Variant
  ABC(0) = 1
  ABC(1) = 2
  test = ABC

質問の意味を勘違いしていましたら失礼
    • good
    • 0
この回答へのお礼

mt2008さん、こんにちは。

やはりセル範囲に対するものなんですね。

ありがとうございました。

お礼日時:2015/01/07 15:48

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QExcel(エクセル) 名前定義をしたリストから、indirect関数を利用して選択入力できるようにしたいのですが… 

 次のようなことができず困っています。
 Sheet1とSheet2があり、Sheet2には"数字"、"英語"と名前定義された2つのリストがあります。Sheet1のセルA1には"数字"か"英語"どちらかの文字列を選択入力し、B1には、もしA1に"数字"を入力していればリスト"数字"から、もし"英語"を入力していればリスト"英語"から選択入力できるようにしたいのです。つまり、Sheet1のセルA1、B1の入力規則の種類をリストとして、元の値をそれぞれ、
   ・Sheet1!A1には=数字,英語
   ・Sheet1!B1には=indirect($A1)
としています。

質問(1)) ここまでなら何の問題もないようですが、問題はSheet2の"数字"と"英語"の参照範囲です。
   ・"数字"の参照範囲は=Sheet2!$A$1:$A$10,Sheet2!$C$1:$C$10
   ・"英語"の参照範囲は=Sheet2!$B$1:$B$10,Sheet2!$D$1:$E$10
と複数範囲におよんでいる場合、Sheet1!B1にはうまくリストが表示されません。解決法、およびなぜ表示されないのか、どなたかご教示お願いいたします。

質問(2)) Sheet2の"数字"と"英語"の参照範囲を
   ・=OFFSET(Sheet2!$A$1,,,COUNTA(Sheet2!$A:$A))
   ・=OFFSET(Sheet2!$B$1,,,COUNTA(Sheet2!$B:$B))
とした場合も同様にSheet1!B1にはうまくリストが表示されません。こちらの方も解決法と表示されない理由をお願いいたします。

 次のようなことができず困っています。
 Sheet1とSheet2があり、Sheet2には"数字"、"英語"と名前定義された2つのリストがあります。Sheet1のセルA1には"数字"か"英語"どちらかの文字列を選択入力し、B1には、もしA1に"数字"を入力していればリスト"数字"から、もし"英語"を入力していればリスト"英語"から選択入力できるようにしたいのです。つまり、Sheet1のセルA1、B1の入力規則の種類をリストとして、元の値をそれぞれ、
   ・Sheet1!A1には=数字,英語
   ・Sheet1!B1には=indirect($A1)
として...続きを読む

Aベストアンサー

(シート名を指定する必要がない)次のような手法は如何でしょうか?

Sheet2
   A    B    C     D
1  数字1 英語1   数字2 英語2
2   11 Andrew    31 Siew
3   12 Andy     32 Steve
4   13 Bob     33 Stu
5   14 Byron    34 Tibor
6   15 Carol    35 Tim
7   16 Chris    36 Tom
8   17 Clarence   37 Wellington
9   18 Dan     38 Wes
10   19 Dennis    39 William
11   20 Don     40 Wing

Sheet2 において
1.範囲 A1:D100 を選択
2.[挿入]→[名前]→[作成]を実行
3.“上端行”だけにチェック入れ
4.[OK]をクリック

Sheet1 において
5.セル A1 および B1 に[入力値の種類]を“リスト”とし、かつ、[元の値]を
  次とする[入力規則]を設定
  A1: 数字1,数字2,英語1,英語2
  B1: =OFFSET(INDIRECT(A1),,,COUNTA(INDIRECT(A1)))

(シート名を指定する必要がない)次のような手法は如何でしょうか?

Sheet2
   A    B    C     D
1  数字1 英語1   数字2 英語2
2   11 Andrew    31 Siew
3   12 Andy     32 Steve
4   13 Bob     33 Stu
5   14 Byron    34 Tibor
6   15 Carol    35 Tim
7   16 Chris    36 Tom
8   17 Clarence   37 Wellington
9   18 Dan     38 Wes
10   19 Dennis    39 William
11   20 Don  ...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qエクセル VBAで範囲に名前を定義する

Sub 範囲import設定()
Sheets("Format").Select
Range("A1").Select
Selection.CurrentRegion.Select
ActiveWorkbook.Names.Add Name:="import", RefersToR1C1:="=Format!R1C1:R26C7"
End Sub

「マクロの記録」でCTRL + * で全データ範囲を選択して"import"という名前を定義したところ
上のようなコードになりました。全データ範囲は毎回違うのですが、ごらんのようにセル番号
で指定されてしまいます。そのつど異なる全データ範囲に名前を定義するにはどうすればいいのでしょうか。
よろしくお願いします。

Aベストアンサー

こんにちは!

単に名前定義だけの場合は

Sub 範囲import設定()
Worksheets("Format").Range("A1").CurrentRegion.Name = "import"
End Sub

でOKだと思います。

>全データ範囲は毎回違うのですが・・・
というコトは一旦「import」という名前定義を削除して新たに名前定義し直す必要があると思います。
そこで↓は「import」という名前定義を削除するコードです。

Sub 削除()
ActiveWorkbook.Names("import").Delete
End Sub

※ 新しい範囲を名前定義する場合は、一旦「削除」のマクロを実行して
「範囲import設定」のマクロを実行してください。m(_ _)m

QVB上で実行中の無限ループの止め方

今まで、CUIベースのBASICでのプログラムの経験はあるのですが
Visual系のBASICは初心者です。
原因はわかっているのでプログラムの修正はできるのですが
VB上でコンパイルして実行したときに無限ループに陥ってしまって
どうにもプログラムをとめられなくなります。
そんなことがないように、実行前に全てのプロジェクトを保存して
いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・
今現在は、タスクマネージャーから強制終了させています。

Aベストアンサー

無限ループの一番内側に
DoEvents
を入れておくと、ウィンドウ切替え->デバッガ終了操作が出来ますよ

危なそうなとこにも入れておくと、何かと安心です。

QRange("A1")⇔cells(1,1)の変換。

EXCELのマクロについて質問します。
Range("A1")⇒(1,1)
cells(1,1)⇒("A1")
に一発変換する方法を教えて下さい。
時間があるかた宜しくお願いします。

Aベストアンサー

こんなのでよろしいでしょうか?
range("A1") → Range("A1").Row & "," & Range("A1").Column
cells(1,1) → Cells(1, 1).Address(False, False)
()や""は付けていません

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QExcel VBA セルの名前があるか無いかを知るには?

Excelのセル範囲に名前をつけています。
VBAで、Worksheetに名前"牛丼"が無ければ、処理をスキップしたいのですが、存在の有無を知る方法はあるでしょうか?

if 0 < Range("牛丼").column then
... ' これはダメでした(TT)

.Worksheet.Name はシート名のようですし...

Aベストアンサー

その1:エラー処理で対応
Sub Cells_Name4()
'エラートラップの設定
on error goto err1
'エラーが起こるかもしれない処理
Range("牛丼").Select
'エラートラップを解除
On Error GoTo 0
'エラーが起こらなかった場合の処理をして終了
msgbox("あります")
exit sub

'エラーが起こった場合の処理をして終了
err1:
msgbox("ありません")
End Sub

その2:名前を全部調べてフラグで判別

Sub Cells_Name()
Dim MyName As Name
Dim MyFlg As Boolen
MyFlg=False
'存在するかのチェック
For Each MyName In ActiveWorkbook.Names
if MyName="牛丼" then
MyFlg = True
Exit For
End If
Next
If Myflg = True Then
'存在する場合の処理
msgbox("あります")
else
'存在しない場合の処理
msgbox("ありません")
End If
End Sub

その1:エラー処理で対応
Sub Cells_Name4()
'エラートラップの設定
on error goto err1
'エラーが起こるかもしれない処理
Range("牛丼").Select
'エラートラップを解除
On Error GoTo 0
'エラーが起こらなかった場合の処理をして終了
msgbox("あります")
exit sub

'エラーが起こった場合の処理をして終了
err1:
msgbox("ありません")
End Sub

その2:名前を全部調べてフラグで判別

Sub Cells_Name()
Dim MyName As Name
Dim MyFlg As Boolen
MyFlg=False
'存在するかのチェック
For ...続きを読む

QVBAでループ内で使う変数名を可変にできないか。

次のような処理で・・・、
 Cnt_1 = Cnt_1 + 1
 Cnt_2 = Cnt_2 + 1
   :
実際には一つの変数(Cnt_1など)ごとに処理がもっとあるのですが、
変数はCnt_1からCnt_5まであり、すべて同じ処理をするので、変数名を
可変にして同じループで書けないかと思うのですが、可能でしょうか?

たとえば、
For I=1 to 5
 Cnt_I = Cnt_I + 1
Next I
と書くと、「Cnt_I」という変数の処理になってしまいますね・・。

なにかいい方法はないでしょうか?

Aベストアンサー

こんばんは。

配列変数を使えばいいでしょう。
変数を5個用意して、すべて1~5まで足すという処理の場合です。
Dim Cnt(4) As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 4
For j = 1 To 5
Cnt(i) = Cnt(i) + j
Next j
Next i
どうでしょうか。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング