Excel VBA質問箱 IV

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

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


2488 / 13645 ツリー ←次へ | 前へ→

【67712】列数の取得について bakadeus 11/1/3(月) 9:01 質問[未読]
【67713】Re:列数の取得について かみちゃん 11/1/3(月) 9:30 発言[未読]
【67714】Re:列数の取得について bakadeus 11/1/3(月) 10:41 お礼[未読]

【67712】列数の取得について
質問  bakadeus E-MAIL  - 11/1/3(月) 9:01 -

引用なし
パスワード
   下記のコード中の「レコード数取得」でデータ範囲の列数を取得するようにしているのですが、なぜか取得してくれません。改良法をご教示ください。

現象→「34/89」(34は表示列により可変)となるべきところが「34/0」と表示されます。


Dim TBL(1 To 149) As Control
Dim データ範囲 As Range

Private Sub UserForm_initialize()

Worksheets("○○").Select

省略

Spin移動.Max = レコード数取得 + 1

Set データ範囲 = Range("a1").CurrentRegion
If データ範囲.Columns.Count = 1 Then
Else
データ表示 2
End If

End Sub

Public Function レコード数取得() As Integer

 レコード数取得 = Range("a1").CurrentRegion.Columns.Count - 1

End Function

Public Sub データ表示(列数 As Integer)

Dim Cnt As Integer
For Cnt = 1 To 149

  
  TBL(Cnt).Value = データ範囲.Cells(Cnt, 列数).Value

Next

Textレコード.Value = Spin移動.Value - 1 & "/" & レコード数取得

End Sub

Private Sub Spin移動_change()

If データ範囲.Columns.Count <> 1 Then
データ表示 (Spin移動.Value)
End If

End Sub

Private Sub button追加_click()
'/////////////////////////////重複追加チェック

Dim vntData As Variant

Worksheets("年調DATA").Select

'氏名を取得
vntData = Text氏名.Value

'D列に同じ氏名の個数を取得
If WorksheetFunction.CountIf(Range("2:2"), vntData) > 0 Then
MsgBox "この人は、すでに登録されています。" & vbNewLine & _
"確認してください!", vbExclamation, "重複警告"

'使用済変数の破棄
Set vntData = Nothing

データ表示 (Spin移動.Value)

Exit Sub

End If
'/////////////////////////////////////

Dim Addrow As Integer
Addrow = データ範囲.Columns.Count + 1
データ書き込み (Addrow)

Textレコード.Text = Spin移動.Value - 1 & "/" & レコード数取得
Set データ範囲 = Range("a1").CurrentRegion
Spin移動.Max = データ範囲.Columns.Count
Spin移動.Value = データ範囲.Columns.Count
データ表示 (Addrow)

End Sub
Private Sub Button更新_Click()
  
  データ書き込み (Spin移動.Value)

End Sub
Public Sub データ書き込み(列数 As Integer)
Dim Cnt As Integer
For Cnt = 1 To 149

  
  データ範囲.Cells(Cnt, 列数).Value = TBL(Cnt).Value

Next

End Sub

Private Sub Button終了_Click()
 
Dim myBtn As Integer
myBtn = MsgBox("年末調整処理の個人別入力作業を終了しますか?", vbQuestion + vbOKCancel)
If myBtn = vbOK Then
Application.DisplayAlerts = False
  ActiveWorkbook.Save
  Unload Me
End If

'終了してメニューに戻る
Worksheets("menu").Select
Range("A1").Select
Application.GoTo reference:=ActiveCell, Scroll:=True

End Sub

【67713】Re:列数の取得について
発言  かみちゃん E-MAIL  - 11/1/3(月) 9:30 -

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

>下記のコード中の「レコード数取得」でデータ範囲の列数を取得するようにしているのですが、なぜか取得してくれません。

どのタイミングのときの取得がおかしいのでしょうか?

・UserFormを初期化したとき
・Spin移動の値が変わったとき
・ button追加をクリックしたとき

これらのタイミングで

Public Function レコード数取得() As Integer
 レコード数取得 = Range("a1").CurrentRegion.Columns.Count - 1
End Function

のコードが実行されているのですが、
このときの
Range("a1").CurrentRegion
で得られるセル範囲が1列しかないのだと思います。

CurrentRegion
で得られる範囲は、「空白行と空白列で囲まれたセル範囲」ですので、
そのコードが実行されるときのアクティブシートのB列がまったく入っていない
のではないでしょうか?

ご自身が期待しているシートが、実行される時点でのアクティブシートになって
いるかどうかも含めて確認してみてください。

また、レコード数取得となっていますが、行数ではなく、列数の取得でいいのですよね?

なお、特定のシートの列数を取得したいならば、

Public Function レコード数取得() As Integer
 レコード数取得 = Worksheets("○○").Range("a1").CurrentRegion.Columns.Count - 1
End Function

などとしてみてもいいかもしれません。

【67714】Re:列数の取得について
お礼  bakadeus E-MAIL  - 11/1/3(月) 10:41 -

引用なし
パスワード
   ▼かみちゃん さん:
早速のご教示ありがとうございます。

>ご自身が期待しているシートが、実行される時点でのアクティブシートになって
>いるかどうかも含めて確認してみてください。
このご指摘で、はた!と気づき、「msgbox レコード数取得」と追記して確認したところ、ちゃんと列数を表示したのですが、OKを押すとすぐに「0」と表示しました。その時のフォームの背景シートが別シートになっていたのでご教示いただいたコードに修正して、シートと特定したところ、バッチリうまく表示できました。
>Public Function レコード数取得() As Integer
> レコード数取得 = Worksheets("○○").Range("a1").CurrentRegion.Columns.Count - 1
>End Function
Worksheets("○○")で作業しているものだと思い込んでいたので気づきませんでした。
的確なご教示本当にありがとうございました。
この関係のコードで別件で質問させていただきますので、懲りずにまたご教示お願いします。

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