マンガでよめる痔のこと・薬のこと

お世話になっております。
今回、ご教授いただきたいのはVBAの配列なのですが
なにぶん初心者なもので理解しきれずにいます。

以下のような配列に文字列をいれて、後の処理で使用したいと考えて
おりますが、エラーになってしまい思うようにいきません。
どなたかご鞭撻のほど宜しくお願いいたします。
※エラー修飾子が不正ですというエラーです。

Dim HOGE(7) As String

Set HOGE(0).Value = "山田"
Set HOGE(1).Value = "岡田"
Set HOGE(2).Value = "田中"
Set HOGE(3).Value = "中田"
Set HOGE(4).Value = "田口"
Set HOGE(5).Value = "田島"
Set HOGE(6).Value = "多田"

MsgBox HOGE(0)
これでメッセージボックスに山田が入ってくれればうれしいです。
以上、宜しくお願いいたします。
また、わかり易いサイトなどがありましたらURLを併せて教えてください。

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

A 回答 (1件)

余計な知識をごちゃ混ぜにしているようですね。


要素へデータを入れるだけなので "Set" も "Value" も余計な物です。

HOGE(6) = "多田" と通常の代入式と同様に記入します。


http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub0 …
    • good
    • 1
この回答へのお礼

さっそくのご回答ありがとうございます。
なぜでしょうか・・・
最初そのようにしましたところ
オブジェクトがありません云々のエラーがでまして・・。
いま、ご教授いただき、再度挑戦してみたところ
うまくいきました!
謎だ・・・。
ともかく
ありがとうございました!

お礼日時:2009/10/21 00:27

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

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

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

このQ&Aを見た人が検索しているワード

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

QVBAを始めたばかりなので初歩的な質問なのですが、

VBAを始めたばかりなので初歩的な質問なのですが、

Private Sub CmdBtn1_Click()
On Error GoTo err1
Dim TxtBx1 As String
Dim TxtBx2 As Long
TxtBx1 = TextBox1
TxtBx2 = TextBox2
Range("a65535").End(xlUp).Offset(1).Select '新しいセルにデータを追加
Selection = Selection.Row - 2
Selection.Offset(, 1).Value = TxtBx1
Selection.Offset(, 2).Value = ComboBox1
Selection.Offset(, 3).Value = TxtBx2

---------------省略---------------

'「取消」ボタンのオン
If Len("A3") > 0 Then
CmdBtn2.Enabled = True
End If
'初期化
TxtBx1 = ""
TxtBx2 = ""
ComboBox1.ListIndex = -1
Call TxtBx1.SetFocus
Exit Sub

実行すると、初期化のところで変数(Txtbx1,TxtBx2)などが反転して、
「修飾子が不正です」と出ます。
変数を使わないで直接指定すると問題無いみたいなのですがよくわかりません。
こんな質問ですいませんが宜しくお願いします。

VBAを始めたばかりなので初歩的な質問なのですが、

Private Sub CmdBtn1_Click()
On Error GoTo err1
Dim TxtBx1 As String
Dim TxtBx2 As Long
TxtBx1 = TextBox1
TxtBx2 = TextBox2
Range("a65535").End(xlUp).Offset(1).Select '新しいセルにデータを追加
Selection = Selection.Row - 2
Selection.Offset(, 1).Value = TxtBx1
Selection.Offset(, 2).Value = ComboBox1
Selection.Offset(, 3).Value = TxtBx2

---------------省略---------------

'「取消」...続きを読む

Aベストアンサー

フォームのTextBoxに入力された”数字” は 数字ではなく ”文字列”になります
なのでLongの型は指定できません
変数を定義しないと何でも型(Variant)として扱われるのでエラーになりません
文字列を数字にするには Val(TextBox2)としてやる必要があります

フォームのオブジェクトを指定する場合
Me.TxetBox1みたいに どのフォームなのか指定するクセをつけたほうがいいかと思います

ところでOn Error Gotoの行き先がありませんね?
一番最後に
err1:
エラーの時の処理

を追加しましょう
エラーの時は何もしなくても
err1: は必要です エラー回避なのにエラーになります

Q[コンパイルエラー 修飾子が不正です]

ユーザフォームに「ユーザ名」を入力します。
 (1)テキストボックスの入力有無の確認
 (2)ユーザ名の重複の確認
上記を実行させようとしているのですが、「コンパイルエラー 修飾子が不正です」が表示
されてしまいます。

にわか覚えのVBAでどうしたらよいか・・わかりません。
ご教授願います。。m(__)m。。

**********以下

'[登録ボタン]を押した時の処理
Private Sub user_touroku_button_Click()   ←★ここでエラー発生!!

'-------------------------------------------------
Dim check As Long '重複有無
Dim rowsCount As Long '表の現在行数


'必須項目のチェック(ユーザ名)
If user_txt.Text = "" Then
MsgBox "ユーザ(案件)名を入力してください。", vbExclamation, "入力エラー"
user_txt.Text.SetFocus
Exit Sub
End If

'ユーザ名の重複チェック
On Error Resume Next
check = 0
check = WorksheetFunction.Match(user_txt.Text, Range("ユーザ一覧").Columns(5), 0)

On Error GoTo 0
If check > 0 Then
MsgBox "このユーザ(案件)名はすでに登録されています", vbExclamation, "重複エラー"
user_txt.Text.SetFocus

Exit Sub

End If
'-----------------------------------------------------

よろしくお願いします。

ユーザフォームに「ユーザ名」を入力します。
 (1)テキストボックスの入力有無の確認
 (2)ユーザ名の重複の確認
上記を実行させようとしているのですが、「コンパイルエラー 修飾子が不正です」が表示
されてしまいます。

にわか覚えのVBAでどうしたらよいか・・わかりません。
ご教授願います。。m(__)m。。

**********以下

'[登録ボタン]を押した時の処理
Private Sub user_touroku_button_Click()   ←★ここでエラー発生!!

'-------------------------------------------------
Dim check As L...続きを読む

Aベストアンサー

パッと見ただけで確認はしていませんが、

user_txt.Text.SetFocus
はNGです。(2ヶ所ありますね)

user_txt はテキストボックス
user_txt.Text はテキストボックスに入力された文字列

SetFocusを指定できるのはテキストボックスなので、
user_txt.SetFocus
としなければなりません。

Qエクセル VBA セルの個数を所得する

いつも皆様には大変お世話になっております。

早速の質問ですが、

    A    B     C     D     E
1
2       123
3       123
4       123
5       123
6
7       123
とエクセルのセルがなっている場合の
上のB2から下のB7までのセルの個数を所得したいのです
B8以降にも数字が入る場合があるのと間に空白が入る場合があるので
困っています。
B2のセルは固定となっているのでB2からの判別で問題ない状況です。
どうぞ皆様お知恵をお借りしたく思っておりますのでよろしくお願いいたします。

Aベストアンサー

質問が非常に不明確なのですが・・・

所得?取得ですよね?

単にB2:B7のセルの個数をVBAで取得するなら
MsgBox Range("B2:B7").Count

B2:B7の空白でないセルの個数なら
MsgBox Application.CountA(Range("B2:B7"))

B7まででなくB2からB列のデータがある最後までのセル個数なら
MsgBox Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Count

B2からB列のデータがある最後までの空白でないセル個数なら
MsgBox Application.CountA(Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row))

Q'Range'メソッドは失敗しました

ExcelのVBAの質問になりますが、教えてください。
下記を動かすと最後の行で「'Range'メソッドは失敗しました: '_Worksheet' オブジェクト」と出ます
どうしても最後の行をセレクトしたいのですが、どうしたらよいでしょうか。


Option Explicit
Public WB1 As Workbook
Public WB1SH1 As Worksheet

Public CSVWB1 As Workbook
Public CSVWB1SH1 As Worksheet

Dim MaxRow As Integer

Private Sub CommandButton1_Click()

Set WB1 = ActiveWorkbook
Set WB1SH1 = WB1.Worksheets(1)
Dim a As String

a = WB1SH1.Range("a1)

Workbooks.Open "C:\Users\User\Desktop\" & a & ".CSV"

Set CSVWB1 = ActiveWorkbook
Set CSVWB1SH1 = CSVWB1.Worksheets(1)

MaxRow = CSVWB1SH1.Cells(Rows.Count, 1).End(xlUp).Row

WB1SH1.Activate
WB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select
CSVWB1SH1.Activate
CSVWB1SH1.Range(Cells(1, 1), Cells(MaxRow, 3)).Select  '←ここでエラーがでる

End Sub

ExcelのVBAの質問になりますが、教えてください。
下記を動かすと最後の行で「'Range'メソッドは失敗しました: '_Worksheet' オブジェクト」と出ます
どうしても最後の行をセレクトしたいのですが、どうしたらよいでしょうか。


Option Explicit
Public WB1 As Workbook
Public WB1SH1 As Worksheet

Public CSVWB1 As Workbook
Public CSVWB1SH1 As Worksheet

Dim MaxRow As Integer ...続きを読む

Aベストアンサー

初心者さんが必ず一度は失敗します。


>Private Sub CommandButton1_Click()

のようにシートオブジェクトに記載したマクロでは、シートを修飾しないセル(レンジ)オブジェクトは全て「マクロを記載したシート」に紐付けられています。


CSVWB1SH1.Range(CSVWB1SH1.Cells(1, 1), CSVWB1SH1.Cells(MaxRow, 3)).Select
のようにしなければいけません。

QVBAにてデータが数字か文字かを判定するには

VBAにてデータが数字か文字かを判定するには、
どうすれば良いのでしょうか?

文字数は任意で決まっていません。


123 ← 数字
あい ← 文字
1F  ← 文字
G  ← 文字

Aベストアンサー

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Then
  MsgBox "文字列"
 Else
  MsgBox "その他" '代表的なものはエラー値です
 End If
End Sub

-----------------------------------------
こちらの場合は、全角数字も、数字として扱われます。

Sub Test2()
 If IsNumeric(Range("A1").Value) Then
   MsgBox "数字"
 Else
   MsgBox "数字ではない"
 End If
End Sub

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Th...続きを読む

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む

QExcel2007VBA配列変数の宣言について

●質問の主旨
(1)以下のコードのプロシージャを実行すると
12行目の変数myArrが選択され、「配列に割り当てられません」と
エラーメッセージが返されます。これはなぜでしょうか?

(2)(1)の原因は5行目の変数myArrの宣言について問題があるよう
気がしますが、どうすればいいのか分かりません?

以上2点について、1つだけでもご助言いただければ幸いです。
ご教示よろしく願いします。

●質問の補足

下記のコードは「各支社の成績」(画像の下部)を
「業務成績通知書」(画像上部)に成績欄に差し込んで
各支社ごとのワークシートを印刷するためのコードです。

画像上部のワークシート名→差込印刷TARGET
画像下部のワークシート名→data

●コード
Option Explicit

Sub オートシェイプ1_Click()

Dim myTar As Worksheet 'ワークシート差込印刷(ターゲット)のオブジェクト変数
Dim myDat As Worksheet 'ワークシートdataの配列変数
Dim myArr(6, 4) As Range
Dim y As Integer '印刷するシート数のオブジェクト変数
Dim myTem As Range '印刷するアクティブシートのオブジェクト変数
Dim n As Integer '差込数の数
Dim target_name As String '差込名

'ワークシート差込印刷(ターゲット)をオブジェクト変数に代入
Set myTar = Worksheets("差込印刷TARGET")
Set myDat = Worksheets("data") 'ワークシートdataをオブジェクト変数に代入
myArr = myDat.Range("B2:G6") '印刷範囲のセル範囲を配列変数に代入

For y = 1 To 5 '繰り返し
myTar.Copy after:=myDat 'ワークシート差込印刷のコピーをワークシートdataの後に配置
Set myTem = ActiveSheet 'アクティブシートを変数myTemに代入
myTem.Name = "印刷中" 'コピーされたワークシートの名前は「印刷中」とする

For n = 1 To 6
'差込名に「ターゲット番号」を代入
target_name = "TARGET" & n
'印刷中シートの「ターゲット番号」のセルに支店ごとのデータ(配列変数)を代入
myTem.Cells.Find(target_name).Value = myArr(y, n)
Next

myTem.PrintOut 'アクティブシートの印刷
Application.DisplayAlerts = False '画面警告表示を非表示
myTem.Delete '「印刷中」のシートを削除
Application.DisplayAlerts = True '画面警告表示を非表示を元に戻す

Next End Sub

●質問の主旨
(1)以下のコードのプロシージャを実行すると
12行目の変数myArrが選択され、「配列に割り当てられません」と
エラーメッセージが返されます。これはなぜでしょうか?

(2)(1)の原因は5行目の変数myArrの宣言について問題があるよう
気がしますが、どうすればいいのか分かりません?

以上2点について、1つだけでもご助言いただければ幸いです。
ご教示よろしく願いします。

●質問の補足

下記のコードは「各支社の成績」(画像の下部)を
「業務成績通知書」(画像上部)に成績欄に差し込んで
各支社...続きを読む

Aベストアンサー

myArrが既に配列宣言されているからです。
Dim myArr(6, 4) As Range⇒Dim myArr As Variantに変更してみて下さい。

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で計算値を四捨五入、切り上げ、切捨てする方法

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

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)
で切り上げです。

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

QExcelで正規表現やワイルドカードなどを使って置換したいのですが…

Excelの中で置換をしたいのですが、
例えば以下のように( )かっこでくくられた不規則な数字を検索し、その前後に記号を付加するといった具合です。
Wordだと置換で正規表現が使えますが、Excelではやはりマクロを作らないとだめなのでしょうか?

 置換前
  あいう(123)かきく(あああ)
  さしす(ははは)たち(589)つ
   ・      ・
   ・      ・

 置換後
  あいう★(123)★かきく(あああ)
  さしす(ははは)たち★(589)★つ
   ・      ・
   ・      ・

Aベストアンサー

以下の正規表現アドインを使用すると可能です。
http://srcedit.pekori.jp/tool/excelre.html

置換前 ((\d+))
置換後 ★$1★


人気Q&Aランキング

おすすめ情報