Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8816 / 13646 ツリー ←次へ | 前へ→

【30987】配列に関するマクロ nikuo 05/11/8(火) 17:38 質問[未読]
【30989】Re:配列に関するマクロ かみちゃん 05/11/8(火) 20:02 発言[未読]
【30992】Re:配列に関するマクロ こたつねこ 05/11/8(火) 20:37 発言[未読]
【30994】Re:配列に関するマクロ かみちゃん 05/11/8(火) 20:45 発言[未読]
【30995】Re:配列に関するマクロ nikuo 05/11/8(火) 21:49 質問[未読]
【30996】Re:配列に関するマクロ かみちゃん 05/11/8(火) 21:57 発言[未読]
【30998】Re:配列に関するマクロ nikuo 05/11/8(火) 22:51 質問[未読]
【31000】Re:配列に関するマクロ かみちゃん 05/11/8(火) 23:01 発言[未読]
【30997】Re:配列に関するマクロ awu 05/11/8(火) 22:47 回答[未読]
【31001】Re:配列に関するマクロ nikuo 05/11/8(火) 23:03 質問[未読]
【31002】Re:配列に関するマクロ かみちゃん 05/11/8(火) 23:09 発言[未読]
【31003】Re:配列に関するマクロ nikuo 05/11/8(火) 23:23 発言[未読]
【31006】Re:配列に関するマクロ かみちゃん 05/11/9(水) 0:14 発言[未読]
【31007】Re:配列に関するマクロ nikuo 05/11/9(水) 0:57 質問[未読]
【31008】Re:配列に関するマクロ かみちゃん 05/11/9(水) 6:33 発言[未読]
【31029】Re:配列に関するマクロ nikuo 05/11/9(水) 15:09 お礼[未読]
【31022】Re:配列に関するマクロ Jaka 05/11/9(水) 13:53 発言[未読]

【30987】配列に関するマクロ
質問  nikuo  - 05/11/8(火) 17:38 -

引用なし
パスワード
   すいません。質問なのですが
Sheet1に
  A  B   C    D
1 年    えと
2 月    誕生石
3 日   メッセージ    えとと誕生石←フォームボタン

Sheet2に
 A    B       C
 申    ガーネット  熱愛
 酉    アメジスト  誠実
 戌    アクアマリン 聡明
 亥    ダイヤモンド 清浄無垢
 子    エメラルド  幸運
 丑    パール       健康
 寅    ルビー       情熱
 卯    ペリドット  幸福
 辰    サファイア  慈愛
 巳    オパール       歓喜
 午    トパーズ       希望
 未    トルコ石       成功
マクロは
Option Explicit

Sub ボタン1_Click()

 Dim Eto(11) As String
 Dim n As Integer
 
 For n = 0 To 11 Step 1
 
 Eto(n) = Sheet2.Cells(n + 1, 1).Value
 
 Next n
 
 n = Range("B1").Value Mod 12
 
 Range("D1").Value = Eto(n)

End Sub

それで今のところSheet1のセルB1に年数をいれて実行するとSheet1のセルD1にSheet2のセルA1からA12に対応する干支がSheet1のセルD1に表示されるまでできたのですが、
今度はSheet1のセルB2,3に数字を入力するとSheet2のB1からB12に対応する誕生石
がSheet1のD2に表示され、Sheet2のC1からC12に対応するメッセージがSheet1のD3に表示されるのですが、干支、誕生石、メッセージを表示させるマクロを作成したいのですが教えてください。お願いします。

【30989】Re:配列に関するマクロ
発言  かみちゃん  - 05/11/8(火) 20:02 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>今度はSheet1のセルB2,3に数字を入力するとSheet2のB1からB12に対応する誕生石
>がSheet1のD2に表示され、Sheet2のC1からC12に対応するメッセージがSheet1のD3に表示されるのですが、干支、誕生石、メッセージを表示させるマクロを作成したい

要件がよくわかりません。
年(B1セル)を西暦で入力したら、それを12で割ったときの余りを取得して、それ
を配列の中から表示するのは、わかります。
月(B2セル)を入力したら、その数字から1を引いた値を取得して、それを「誕生石」の配列の中から表示するということでいいのでしょうか?
日(B3セル)を入力したら、どのようにして、「メッセージ」を表示したいのでしょうか?

また、ご提示のコードは、きちんと動きますか?
こちらで検証したところ、コンパイルエラーで「干支」すら、取得できないですけど?

【30992】Re:配列に関するマクロ
発言  こたつねこ  - 05/11/8(火) 20:37 -

引用なし
パスワード
   かみちゃんさん、nikuoさん、こんばんは

>>今度はSheet1のセルB2,3に数字を入力するとSheet2のB1からB12に対応する誕生石
>>がSheet1のD2に表示され、Sheet2のC1からC12に対応するメッセージがSheet1のD3に表示されるのですが、干支、誕生石、メッセージを表示させるマクロを作成したい
>
>要件がよくわかりません。

確かに良く分かりませんね^^;

>また、ご提示のコードは、きちんと動きますか?
>こちらで検証したところ、コンパイルエラーで「干支」すら、取得できないですけど?

かみちゃんさん、
下記の環境で試したところ、コンパイルエラーは出ませんよ?

OS:WindowsXP
Excel2000

【30994】Re:配列に関するマクロ
発言  かみちゃん  - 05/11/8(火) 20:45 -

引用なし
パスワード
   こんにちは。かみちゃんです。

>下記の環境で試したところ、コンパイルエラーは出ませんよ?

Windows XP HomeEdition + Excel2002 SP3の環境でエラーが出ました。
ただし、標準モジュールに記述していました。
シートモジュールに、記述すれば、エラーは出なくなりました。
お騒がせしました。

【30995】Re:配列に関するマクロ
質問  nikuo  - 05/11/8(火) 21:49 -

引用なし
パスワード
   >年(B1セル)を西暦で入力したら、それを12で割ったときの余りを取得して、それ
>を配列の中から表示するのは、わかります。
>月(B2セル)を入力したら、その数字から1を引いた値を取得して、それを「誕生石」の配列の中から表示するということでいいのでしょうか?
>日(B3セル)を入力したら、どのようにして、「メッセージ」を表示したいのでしょうか?

あの今ここまでできたのですが、

Option Explicit

Sub ボタン1_Click()

 Dim Eto(11), Isi(11) As String
 Dim n, o As Integer
 
 For n = 0 To 11 Step 1
  For o = 0 To 11 Step 1
 
 Eto(n) = Sheet2.Cells(n + 1, 1).Value
 Isi(o) = Sheet2.Cells(o + 1, 2).Value

  Next o
 Next n
 
 n = Range("B1").Value Mod 12
 o = Range("B2").Value - 1
 
 Range("D1").Value = Eto(n)
 Range("D2").Value = Isi(o)

End Sub

結果は下のようになったのですが
年    1987    えと    卯
月    3    誕生石    アクアマリン
日    7    メッセージ    

まだメッセージのところができなくて最終的な結果は
年    1987    えと    卯
月    3    誕生石    アクアマリン
日    7    メッセージ 聡明
とさせたいのですがどうすればよいでしょうか。

【30996】Re:配列に関するマクロ
発言  かみちゃん  - 05/11/8(火) 21:57 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>まだメッセージのところができなくて最終的な結果は
>年    1987    えと    卯
>月    3    誕生石    アクアマリン
>日    7    メッセージ 聡明
>とさせたいのですがどうすればよいでしょうか。

私の疑問には、お答えいただけないのでしょうか?
日(B3セル)を入力したら、どのようにして、「メッセージ」を表示したいのか?
入力した数値と配列の添え字の関係がさっぱりわかりません。
そこを説明していただけないと、よいアドバイスはできないと思います。

あと、以下のコードは、For〜Nextの入れ子にしていますが、無駄処理と思います。

>For n = 0 To 11 Step 1
> For o = 0 To 11 Step 1
>  Eto(n) = Sheet2.Cells(n + 1, 1).Value
>  Isi(o) = Sheet2.Cells(o + 1, 2).Value
> Next o
>Next n

For n = 0 To 11 Step 1
 Eto(n) = Sheet2.Cells(n + 1, 1).Value
 Isi(n) = Sheet2.Cells(n + 1, 2).Value
Next n

でいいのでは?

【30997】Re:配列に関するマクロ
回答  awu  - 05/11/8(火) 22:47 -

引用なし
パスワード
   こんな感じで如何でしょうか。

Sub ボタン1_Click()
Dim N As Integer
With Sheets("Sheet2")
  If IsNumeric(Range("B1").Value) And _
      Range("B1").Value <> "" Then
    N = Range("B1").Value Mod 12
    Range("D1").Value = .Range("A1").Offset(N).Value
  Else
    Range("D1").Value = ""
  End If
  If Range("B2").Value >= 1 And _
      Range("B2").Value <= 12 Then
    Range("D2").Value = _
      .Range("B1").Offset(Range("B2").Value - 1).Value
    Range("D3").Value = _
      .Range("C1").Offset(Range("B2").Value - 1).Value
  Else
    Range("D2:D3").Value = ""
  End If
End With
End Sub

【30998】Re:配列に関するマクロ
質問  nikuo  - 05/11/8(火) 22:51 -

引用なし
パスワード
   >>まだメッセージのところができなくて最終的な結果は
>>年    1987    えと    卯
>>月    3    誕生石    アクアマリン
>>日    7    メッセージ 聡明
>>とさせたいのですがどうすればよいでしょうか。
>
>私の疑問には、お答えいただけないのでしょうか?
>日(B3セル)を入力したら、どのようにして、「メッセージ」を表示したいのか?
>入力した数値と配列の添え字の関係がさっぱりわかりません。
>そこを説明していただけないと、よいアドバイスはできないと思います。

sheet2がこのようになっていて
   B      C 
1 ガーネット    熱愛
2 アメジスト    誠実
3 アクアマリン    聡明
4 ダイヤモンド    清浄無垢
5 エメラルド    幸運
6 パール         健康
7 ルビー         情熱
8 ペリドット    幸福
9 サファイア    慈愛
10 オパール    歓喜
11 トパーズ    希望
12 トルコ石    成功

それでSheet1で月と日を例えば1月1日から1月31日の間で数字を入力して
結果セルD2にガーネット、D3に熱愛と出るようにしたいのです。

【31000】Re:配列に関するマクロ
発言  かみちゃん  - 05/11/8(火) 23:01 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>それでSheet1で月と日を例えば1月1日から1月31日の間で数字を入力して
>結果セルD2にガーネット、D3に熱愛と出るようにしたいのです。

それであれば、日(B3セル)を入力しても、その値にかかわらず、月(B2セル)
によって「メッセージ」は決まるということでいいのでしょうか?
それであれば、awuさんが配列を使わない方法を提示されており、参考になるかと
思いますが、もしかして、何かの課題で「配列を使うこと」を要求されているのでしょうか?

【31001】Re:配列に関するマクロ
質問  nikuo  - 05/11/8(火) 23:03 -

引用なし
パスワード
   ▼awu さん:
>こんな感じで如何でしょうか。
>
>Sub ボタン1_Click()
>Dim N As Integer
>With Sheets("Sheet2")
>  If IsNumeric(Range("B1").Value) And _
>      Range("B1").Value <> "" Then
>    N = Range("B1").Value Mod 12
>    Range("D1").Value = .Range("A1").Offset(N).Value
>  Else
>    Range("D1").Value = ""
>  End If
>  If Range("B2").Value >= 1 And _
>      Range("B2").Value <= 12 Then
>    Range("D2").Value = _
>      .Range("B1").Offset(Range("B2").Value - 1).Value
>    Range("D3").Value = _
>      .Range("C1").Offset(Range("B2").Value - 1).Value
>  Else
>    Range("D2:D3").Value = ""
>  End If
>End With
>End Sub

あのこれでできたのですが、IsNumericがわからなくてちょっとどうしてもFor文を使ってやりたいのですがお願いします。

【31002】Re:配列に関するマクロ
発言  かみちゃん  - 05/11/8(火) 23:09 -

引用なし
パスワード
   こんちには。かみちゃん です。

>あのこれでできたのですが、IsNumericがわからなくてちょっとどうしてもFor文を使ってやりたいのですがお願いします。

配列を使わなくていいのなら、awuさんのコードで十分だと思います。
IsNumeric関数は、ヘルプで調べられませんか?きちんと解説されていますよ。
あと、なぜ、For 〜 Next でしたいのですか?
その必要性が感じられません。(課題とかなら、まだしも・・・)

【31003】Re:配列に関するマクロ
発言  nikuo  - 05/11/8(火) 23:23 -

引用なし
パスワード
   >配列を使わなくていいのなら、awuさんのコードで十分だと思います。
>IsNumeric関数は、ヘルプで調べられませんか?きちんと解説されていますよ。
>あと、なぜ、For 〜 Next でしたいのですか?
>その必要性が感じられません。(課題とかなら、まだしも・・・)

あの実はこれ学校の課題なんです。なのでどうしてもForNext文でやりたいんです。

【31006】Re:配列に関するマクロ
発言  かみちゃん  - 05/11/9(水) 0:14 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>あの実はこれ学校の課題なんです。なのでどうしてもForNext文でやりたいんです。

ほら〜、そうでしょ?思ったとおりです。
それなら、そうと初めからハッキリそう言いませんか?
そうすると、コメントの書き方も変わってきますから・・・

で、本当は、答えを丸々書きたくないのですが、とりあえず、以下のような感じ「でも」できます。
もっと配列らしいコードの書き方があるでしょうけど、それこそ、「答え」になってしまいますので。

Private Sub CommandButton1_Click()
 Dim Eto(11), Isi(11) As String
 Dim n As Integer

 For n = 0 To 11 Step 1
  Eto(n) = Sheet2.Cells(n + 1, 1).Value
  Isi(n) = Sheet2.Cells(n + 1, 2).Address '←セル番号を配列に取得
 Next n
 
 With Sheet2.Range(Isi(Range("B2").Value - 1))
  Range("D1:D3").Value = Application.Transpose(Array(Eto(Range("B1").Value Mod 12), .Value, .Offset(, 1).Value))
 End With
End Sub

コードの詳細は、ヘルプで調べましょう。

【31007】Re:配列に関するマクロ
質問  nikuo  - 05/11/9(水) 0:57 -

引用なし
パスワード
   >Private Sub CommandButton1_Click()
> Dim Eto(11), Isi(11) As String
> Dim n As Integer
>
> For n = 0 To 11 Step 1
>  Eto(n) = Sheet2.Cells(n + 1, 1).Value
>  Isi(n) = Sheet2.Cells(n + 1, 2).Address '←セル番号を配列に取得
> Next n
> 
> With Sheet2.Range(Isi(Range("B2").Value - 1))
>  Range("D1:D3").Value = Application.Transpose(Array(Eto(Range("B1").Value Mod 12), .Value, .Offset(, 1).Value))
> End With
>End Sub

あのまた追加で申し訳ないんですけどもForNext文でArray関数を使わなくてもできる方法はありませんか?すいません。わがままなことをいってしまって。

【31008】Re:配列に関するマクロ
発言  かみちゃん  - 05/11/9(水) 6:33 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>Array関数を使わなくてもできる方法

なぜ使ってはいけないのでしょうか?
そういう課題なのですか?
「使ってはいけない」という制約条件が明記されていないなら、使っても正解だと思いますよ。

With Sheet2.Range(Isi(Range("B2").Value - 1))
 Range("D1").Value = Eto(Range("B1").Value Mod 12)
 Range("D2").Value = .Value
 Range("D3").Value = .Offset(, 1).Value
End With

【31022】Re:配列に関するマクロ
発言  Jaka  - 05/11/9(水) 13:53 -

引用なし
パスワード
   因みに(あまり検証してないけど)

C1
=INDIRECT("Sheet2!A" & MOD(A1,12)-3+4)
C2
=INDIRECT("Sheet2!B" & A2)
C3
=INDIRECT("Sheet2!C" & A2)

マクロでやると
bb = Range("A1").Value Mod 12 - 3 + 4
MsgBox Sheets("Sheet2").Range("A" & bb).Value
MsgBox Sheets("Sheet2").Range("B" & range("A2")).Value
MsgBox Sheets("Sheet2").Range("C" & range("A2")).Value

【31029】Re:配列に関するマクロ
お礼  nikuo  - 05/11/9(水) 15:09 -

引用なし
パスワード
   すいません。これで大丈夫だと思います。ありがとうございました。

8816 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free