- ベストアンサー
マイクロソフト・エクセル97(マクロ)
マイクロソフト・エクセル97 sheet1上で作った『ユーザー入力フォーム(VB)』を sheet2からマクロの実行をしても、ユーザー入力フォームのデータがsheet2のものになっています。 sheet2からマクロを実行しても、きちんとsheet1のデータを反映させた(データ表示)いのですが、方法がわかりません。 sheets(sheet1).Select の記述をしてはみたのですが…。 とりあえず上の記述でうまくいくのですが、この方法でセーブし終了すると、『不正な処理をしたために…プログラムを強制的に終了します』が出てしまします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
提示されたコードにはPrivate、Publicが種々あり、コードがシート1かユーザーフォームか、またはモジュールのどのコードウインドウに書かれたのか不明で、コードも部分的と思えますし、起動方法も分からないのでかなりの部分は想像で書いています。100%理解できていません。 少しでも進展すればいいですが・・・。試してみて下さい。 ●Dim トト結果記録, TBL(1 To 57) As Control Dim データ範囲 As Range ↓ 2行はコメント行にする。 標準モジュールに(を追加し)、以下を追加。この57個のコントロールの意味は分かりません。 Public トト結果記録, TBL(1 To 57) As Control Public データ範囲 As Range Public ws1 As WorkSheet ●Private Sub UserForm_Initialize() Comboチーム011.AddItem "-------J1" : Set データ範囲 = Range("A1").CurrentRegion ↓ Private Sub UserForm_Initialize() Set ws1 = WorkSheets("Sheet1") '追加 Comboチーム011.AddItem "-------J1" : Set データ範囲 = ws1.Range("A1").CurrentRegion '修正 ●Public Function レコード数取得() As Integer レコード数取得 = Range("A1").CurrentRegion.Rows.Count - 1 ↓ レコード数取得 = ws1.Range("A1").CurrentRegion.Rows.Count - 1 '修正 ●Public Sub データ表示(行数 As Integer) Dim トト結果記録, Cnt As Integer ↓ Dim Cnt As Integer '修正、二重定義になっている?
その他の回答 (1)
- nishi6
- ベストアンサー率67% (869/1280)
どのようなコードをかかれているか分かりませんが、UserForm_Initialize を例にして、TextBox1にSheet1のセルA1を表示するには Private Sub UserForm_Initialize() With Worksheets("Sheet1") TextBox1 = .Range("A1") End With End Sub のようにSheet1のセル範囲ということを明記したらどうでしょうか。該当シートをACTIVEにする必要は無いような気がします。 また、例でいえばTextBox1のControlSourceに"A1"(Sheet1のつもり)をセットされていれば、"Sheet1!A1"とすればいいと思います。 保存も問題なくできるはずです。
補足
> With Worksheets("Sheet1") でやってみたのですが、うまくいきませんでした。 マクロの記述は書きのとおりです。 (一部省略) アドバイス、お願いします。 ---------------- Dim トト結果記録, TBL(1 To 57) As Control Dim データ範囲 As Range Private Sub UserForm_Initialize() Comboチーム011.AddItem "-------J1" Comboチーム011.AddItem "市原" Comboチーム011.AddItem "磐田" Comboチーム011.AddItem "浦和" Spinトト節.Max = レコード数取得 + 1 Set TBL(1) = Textトト節 Set TBL(2) = Comboチーム011 Set TBL(3) = Frame結果1 Set TBL(4) = Comboチーム012 Set データ範囲 = Range("A1").CurrentRegion If データ範囲.Rows.Count = 1 Then Else データ表示 2 End If End Sub Public Function レコード数取得() As Integer レコード数取得 = Range("A1").CurrentRegion.Rows.Count - 1 End Function Public Sub データ表示(行数 As Integer) Dim トト結果記録, Cnt As Integer For Cnt = 1 To 57 Select Case Cnt Case 3 If データ範囲.Cells(行数, Cnt).Value = "H○" Then Option試合結果011.Value = True Else If データ範囲.Cells(行数, Cnt).Value = "H△" Then Option試合結果010.Value = True Else Option試合結果012.Value = True End If End If Case Else TBL(Cnt).Value = データ範囲.Cells(行数, Cnt).Value End Select Next Textトト節.Value = Spinトト節.Value - 1 End Sub Private Sub Spinトト節_Change() If データ範囲.Rows.Count <> 1 Then データ表示 (Spinトト節.Value) End If End Sub Private Sub Button追加_Click() Dim AddRow As Integer AddRow = データ範囲.Rows.Count + 1 データ書き込み (AddRow) Textトト節.Text = Spinトト節.Value - 1 & "/" & レコード数取得 Set データ範囲 = Range("A1").CurrentRegion Spinトト節.Max = データ範囲.Rows.Count Spinトト節.Value = データ範囲.Rows.Count データ表示 (AddRow) End Sub Public Sub データ書き込み(行数 As Integer) Dim Cnt As Integer For Cnt = 1 To 57 Select Case Cnt Case 3 If Option試合結果011.Value = True Then データ範囲.Cells(行数, Cnt).Value = "H○" Else If Option試合結果010.Value = True Then データ範囲.Cells(行数, Cnt).Value = "H△" Else データ範囲.Cells(行数, Cnt).Value = "H×" End If End If Case Else データ範囲.Cells(行数, Cnt).Value = TBL(Cnt).Value End Select Next End Sub Private Sub Button登録書込み_Click() データ書き込み (Spinトト節.Value) End Sub Private Sub Button終了_Click() トトデータ.Hide End Sub
お礼
おかげで解決しました。 ありがとうございました。 今後ともよろしくお願いします。