vba の 操作

タグの編集
投稿者 あああ  (社会人) 投稿日時 2008/12/17 00:35:49
vbaでカウントしていってカウントが10になったらセルA1からtextboxにセルA1の内容を入れる
またカウントが0になり10までカウントしたら今度はセルB1から同じtextboxに内容が入る
というようなマクロを教えてください。
投稿者 あああ  (社会人) 投稿日時 2008/12/17 01:05:38
ちなみに条件になる時にこのマクロをじっこうするようにしています
Dim y As Integer
    Dim x As Integer
        y = 2
        x = 1
   
    UserForm1.TextBox6.Text = ActiveSheet.Cells(y, x).Value 

    y = y + 2

2番目行こう拾ってくれない。
投稿者 るしぇ  (社会人) 投稿日時 2008/12/17 01:52:05
> ちなみに条件になる時にこのマクロをじっこうするようにしています
このコードを1つの関数内に書いてるなら、毎回 y は 2 で初期化
されて y = y + 2 は意味が無いのでは?

モジュールレベルの変数を用意してみては?
投稿者 あああ  (社会人) 投稿日時 2008/12/17 03:51:38
モジュールレベル変数をおこないましたがダメでした。
他に変数が初期化されない方法はありますか?
投稿者   (社会人) 投稿日時 2008/12/17 07:46:38
変数の初期化はどこでやってるの?
まさかそのマクロ内でやってないよね?
投稿者   (社会人) 投稿日時 2008/12/17 18:15:56
補足。
変数の初期化をそのプロシジャ内でやってないよね?ってこと。
投稿者 あああ  (社会人) 投稿日時 2008/12/17 18:51:28
変数の初期化ってどういうことですか?
初心者なんですいません
投稿者   (社会人) 投稿日時 2008/12/17 19:40:09
>y = 2
>x = 1
これが初期化。わかっててやってると思ったけど。
TextBoxに入れる前に毎回これをやってて、その後で

>y = y + 2
とかしても意味がないってこと。
投稿者 あああ  (社会人) 投稿日時 2008/12/17 21:06:50
y = 2
x = 1
が初期化ですか。
変数の中身のつもりだったのですが。
y = 2
x = 1
をぬくとセルの始めの位置をどう打てば良いのでしょうか?
投稿者   (社会人) 投稿日時 2008/12/17 21:31:53
こんにちは。

とりあえずnさんが説明してくれたことについては
理解していただけたんですよね?

y = 2
x = 1


の部分を

y = 1
x = x + 1


みたいな感じにすればいいのではないのでしょうか。
最初はセルA1を対象にして、次はB2を対象にするのだから
増やすのはxですよね?
投稿者   (社会人) 投稿日時 2008/12/17 21:33:08
>最初はセルA1を対象にして、次はB2を対象にするのだから
すみません、「B2」ではなくて「B1」でした。
投稿者 (削除されました)  () 投稿日時 2008/12/17 22:05:47
(削除されました)
投稿者   (社会人) 投稿日時 2008/12/17 22:41:06
じゃなくてぇ・・・。

変数に初期値を入れることが「変数の初期化」なのよね。
君の提示しているコードで判断したんだけど。

何をカウントしてるのかも分からないし、そもそも提示しているコードが
マクロ内の何処に記述されているのかも分からない。
想像で同一プロシジャの中に書かれてると思って回答しているんだけど。

Private count As Long
Private x As Long
Private y As Long

Private Sub Macro1()
    If count = 0 Then x = x + 1
    y = 1
    
    UserForm1.Textbox6.Text = ActiveSheet.Cells(y, x).Value
    count = count + 1
    If count > 9 Then count = 0
End Sub


あんまし良くないコードだけど今の情報でつくってみた。
ひょっとしてカウント方法がわからなかっただけ?
#VBAってコンストラクタとかって概念ないのねorz
投稿者 るしぇ  (社会人) 投稿日時 2008/12/17 23:09:14
うん。まぁ、面倒臭そうなのでこんなのを
ThisWorkbook に記述して勉強してみるとか。
Private TargetSheet As Worksheet
Private y As Integer
Private x As Integer
Private Const RowMax As Integer = 10
Private Const ColMax As Integer = 20

Sub StartProgram()
    Set TargetSheet = GetSheet("Sheet1")
    If TargetSheet Is Nothing Then Exit Sub
    
    Call SetTestCellData(TargetSheet)
    y = 1
    x = 1
    UserForm1.Show vbModeless
    
    Call Output
End Sub

Public Function GetSheet(ByVal SheetName As String _
            , Optional ByVal MsgFlag As Boolean = TrueAs Worksheet
    Dim wAns As Worksheet
    On Error GoTo ErrMsg
    Set wAns = ThisWorkbook.Sheets(SheetName)
    Set GetSheet = wAns
    Exit Function
ErrMsg:
    Set GetSheet = Nothing
    If MsgFlag Then
        MsgBox SheetName & " シート(or グラフシート)が存在しません。"
    End If
End Function

Private Sub SetTestCellData(st As Worksheet)
    Dim row As Integer
    Dim col As Integer
    Dim Data(1 To RowMax, 1 To ColMax) As Variant
    For row = 1 To UBound(Data, 1)
        For col = 1 To UBound(Data, 2)
            Data(row, col) = CStr(row) & "," & CStr(col)
        Next
    Next
    st.Range("$A$1").Resize(UBound(Data, 1), UBound(Data, 2)).Value = Data
End Sub

Private Sub Output()
    UserForm1.TextBox6.Text = TargetSheet.Cells(y, x).Value
    y = y + 1
    If y > RowMax Then
        y = 1
        x = x + 1
        If x > ColMax Then Exit Sub
    End If
    
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Output"
End Sub
投稿者 あああ  (社会人) 投稿日時 2008/12/18 08:06:12
正確には、USBのやつで電気信号をもらって、1個2個ってカウントしていって
目標の回数に達したらexcelのシートから情報(文字を)カウントとは別のテキストボックスに入れたいのです。
そしてまたカウントして次に目標の回数に達したらまた、一つしたのせるから情報を入れたいのです。
自分が上に書いたものは標準モジュールにぶち込んであります。
素人なのでご迷惑おかけしてすいません。