アンケート調査の調査票などは、まずはワークシートに原票をつくって、集計したりグラフ化したりすることになりますが、100問の設問に2000人が回答・・・などというスケールになると、原票の管理だけで大変な作業になります。
たとえば、表頭に設問、表側に回答者という2次元の原票があって、ある人のある設問の回答がちょっとおかしい、などという時に、その欄をスクロールして探すだけでも手間です。そこで、表頭の記号か番号と表側の回答者番号を指定すれば、一気に該当欄を表示する、というプログラムを作ってみました。
実際には、原票の入力を二人が別々に独立して行い、できあがった二つのファイルを照合して入力ミスを発見する、という仕組みの一環として作ったものの一部です。本体のプログラムは「どこそこに齟齬があるよ」と教えてくれるのですが、その欄にたどりつくのが苦労だったので、助け舟として追加したものです。
ユーザーフォーム JumpCellForm
'--- コマンドボタンによる JumpCell() の起動 Private Sub HeadCommandButton_Click() JumpCell True, HeadTextBox.text End Sub Private Sub SideCommandButton_Click() JumpCell False, SideTextBox.text End Sub '--- フォームの開閉時に最後の検索語を取得/保存 Private Sub UserForm_Activate() HeadTextBox.text = LastHeadText SideTextBox.text = LastSideText End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) LastHeadText = HeadTextBox.text LastSideText = SideTextBox.text End Sub
標準モジュールには、OpenJumpCellForm() と JumpCell() のふたつのパブリックなマクロを記載します。いずれもそんなに複雑ではありませんので、コードをご覧ください。
標準モジュール JumpCell(), OpenJumpCellForm()
'--- 見出しの行/列と先頭列番号/先頭行番号を定義 Private Const headRow = 2 Private Const headStartColumn = 3 Private Const sideColumn = 2 Private Const sideStartRow = 4 '--- 最後の検索語を記憶 Public LastHeadText As String Public LastSideText As String
'--- ワークシートのスイッチで実行するマクロ Public Sub OpenJumpCellForm() JumpCellForm.Show vbModeless End Sub
'--- フォームのスイッチで実行するマクロ Public Sub JumpCell(headOrSide As Boolean, searchText As String) ButtonChick Select Case headOrSide Case True: jumpColumn searchText Case False: jumpRow searchText End Select End Sub '--- 列(表頭)の検索 Private Sub jumpColumn(searchText As String) Dim searchRange As Range Dim targetCell As Range '検索するセル範囲を設定 Set searchRange = Range(Cells(headRow, headStartColumn), Cells(headRow, Cells.Columns.count)) '検索した結果で該当セルを選択 Set targetCell = findCell(searchText, searchRange) If Not targetCell Is Nothing Then _ ActiveSheet.Cells(Selection.row, targetCell.column).Select End Sub '--- 行(表側)の検索 Private Sub jumpRow(searchText As String) Dim searchRange As Range Dim targetCell As Range '検索するセル範囲を設定 Set searchRange = Range(Cells(sideStartRow, sideColumn), Cells(Cells.Rows.count, sideColumn)) '検索した結果で該当セルを選択 Set targetCell = findCell(searchText, searchRange) If Not targetCell Is Nothing Then _ ActiveSheet.Cells(targetCell.row, Selection.column).Select End Sub '--- 検索する共通関数 Private Function findCell(searchText As String, searchRange As Range) As Range If Len(searchText) = 0 Then Exit Function Set findCell = searchRange.Find(what:=searchText, LookIn:=xlValues, lookat:=xlWhole) If findCell Is Nothing Then _ MsgBox searchText & vbCrLf & "が見つかりません。", vbOKOnly, "ジャンプしようとしたけど" End Function
このユーザーフォーム JumpCellForm と上のふたつのパブリックなマクロのはいった標準モジュールを追加し、原票となるワークシートの隅に OpenJumpCellForm() を起動するスイッチを貼り付ければ、これは、汎用に使えます。ただし、その際には、標準モジュール内の最初の4行にある定数を原票の仕様にあわせて変更してください。