みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAで順番にこんなことは?

お知恵をお貸しください。

Sheet1上に貼り付けた「テキストボックス」をSheet2のセルA1にリンクさせてあります。

Sheet1上に設置したフォームのボタンをクリックすると、
Sheet2のB1セルの文字列をSheet2のA1に貼り付け(=テキストボックスに表示される。)、
さらにボタンを押すとSheet2のC1の文字列をSheet2のA1に貼り付け、
さらにボタンを押すとSheet2のD1の文字列をSheet2のA1に貼り付け、
さらにボタンを押すとSheet2のA1を空白にする。

こういうことをやりたいのです。

For i = 1 To 3
Sheets("Sheet2").Range("A1").Value = Sheets("Sheet2").Cells(1, i + 1).Value
Next

では、当然ながら一度のクリックで終ってしまいます。
良い方法をご教示ください。

投稿日時 - 2005-04-27 13:24:35

QNo.1354917

困ってます

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

こんにちは。
こういう時が質問者の大好き?な、Staticステートメントの出番です。(^^;;;

-----------------------------------------------
Sub ボタン1_Click()

 Static Kaisu As Integer

 Kaisu = Kaisu + 1

 With Worksheets("Sheet2").Range("A1")

   If Kaisu < 4 Then
   .Value = .Offset(, Kaisu).Value
   Else
   .Value = ""
   Kaisu = 0
   End If

 End With

End Sub
-----------------------------------------------

以上です。

投稿日時 - 2005-04-27 14:41:44

お礼

taocatさま

いつもありがとうございます。
そうですねStatic関数を利用しない手はないですね!

ありがとうございました、ばっちりです♪

投稿日時 - 2005-04-27 17:49:12

ANo.5

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

すでに回答があった様なので、不要かと思いますが、ご参考までに

Public Clc As Long

Private Sub CommandButton1_Click()
With Worksheets("Sheet2")
Select Case Clc
Case 0
.Range("A1") = .Range("B1")
Clc = Clc + 1
Case 1
.Range("A1") = .Range("C1")
Clc = Clc + 1
Case Else
.Range("A1") = ""
Clc = 0
End Select
End With
End Sub

投稿日時 - 2005-04-27 14:07:46

お礼

ありがとうございます。

やったことのない方法ですが、これがパブリック変数というものでしょうか?

投稿日時 - 2005-04-27 17:50:51

ANo.3

このような内容ではいかがでしょう。
ボタンを押すたびに Sheet2 の A1 に
B1→C1→D1→空白→B1→C1→D1 の順にコピーされます。
'
Sub ボタン1_Click()
Select Case Sheets(2).Range("A1").Value
Case Is = Sheets(2).Range("B1").Value
Sheets(2).Range("A1") = Sheets(2).Range("C1").Value
Case Is = Sheets(2).Range("C1").Value
Sheets(2).Range("A1") = Sheets(2).Range("D1").Value
Case Is = Sheets(2).Range("D1").Value
Sheets(2).Range("A1") = ""
Case Else ' =""
Sheets(2).Range("A1") = Sheets(2).Range("B1").Value
End Select
End Sub

投稿日時 - 2005-04-27 14:04:09

お礼

なるほど、むずかしく考えなくてもこういう方法もありますね。
勉強になりました。
ありがとうございます。

投稿日時 - 2005-04-27 17:52:00

ANo.2

テキストボックスがなんなのかは分かりませんでしたが、コントロールツールのテキストボックスとしました。Buttonのカウントには、いろいろな方法がありますが、Sheet2を使わない方法にしました。

フォームボタンにマクロの登録をしてください。
シート1のモジュールが最適かと思います。

Sub FormButtunTest()
 Dim ButtonCount As Range
 Set ButtonCount = Range("AA1") 'テンポラリー・セル
 'ButtonCount は、Static 変数でもよいが、なくしやすい。
 '他に、CustomDocumentDocumentPropertiesなどがある。
 With Sheet2
  If ButtonCount < 3 Then
   .Range("A1").Value = .Cells(1, ButtonCount + 2).Value
   Sheet1.TextBox1.Value = .Cells(1, ButtonCount + 2).Value
   ButtonCount.Value = ButtonCount.Value + 1
   Else
   .Range("A1").ClearContents
   ButtonCount.ClearContents '3回行ったら消します。
  End If
 End With
 Set ButtonCount = Nothing
End Sub

投稿日時 - 2005-04-27 14:02:50

お礼

Wendy02さま
いつもおせわになりありがとうございます。

テキストボックスって、ワークシートの下に方の図形なんかのちかくにある普通のテキストボックスです。

コントロールツールのじゃないです。

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

投稿日時 - 2005-04-27 17:57:13

ANo.1

Sheet2のA3にカウント用の数字を入れておく。最初は1。後は次のコードで順番にクリックすればカウントが増えますので、順にB,C,Dのセルの値がA1にコピーされます。
これでどうですか?

Private Sub CommandButton1_Click()
Dim i As Integer
i = Worksheets("Sheet2").Cells(3, 1).Value
i = i + 1
If i > 4 Then
i = 1
Worksheets("Sheet2").Cells(1, 1).Value = Worksheets("Sheet2").Cells(1, i + 1).Value
Else
Worksheets("Sheet2").Cells(1, 1).Value = Worksheets("Sheet2").Cells(1, i + 1).Value
End If

Worksheets("Sheet2").Cells(3, 1).Value = i
End Sub

投稿日時 - 2005-04-27 13:49:12

お礼

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

ただ、極力作業用セルを設定したくなかったものですから。

投稿日時 - 2005-04-27 17:53:37

あなたにオススメの質問