ちょっとした小技です。
同じ文字を一度に複数セルに入力したい時、
1つ目のセルにまずは入力し、そのセルを他のセルにコピーでもできますが、少し手数の少ない方法を紹介させて頂きます。
①一度に入力したい範囲を選択
②文字を入力
③「Ctrl」キーを押しながら「Enter」キーを押下
VLOOKUP 関数等を利用している場合、スポット的に直接値を入れたいケースがあると思います。
直接入れた値の削除時にもともと設定してあったVLOOKUP関数を再セットするプログラムを作成します。
①マクロを使えるようにする
「マクロを使えるようにする」を参照
②VLOOKUP関数の参照元、先を作成
③「Alt + F8」を押して表示される以下の画面で「マクロ名」を「FunctionDisplayOnDeletion」として「作成」を押す
④ Microsoft Visual Basic for Applications」にて以下のコードを記載
Sub FunctionDisplayOnDeletion() Dim searchValueRow As Integer: searchValueRow = 1 '★検索値列 Dim startFuncRow As Integer: startFuncRow = 2 '★VLOOKUP関数設定開始行 Dim startFuncCol As Integer: startFuncCol = 2 '★VLOOKUP関数設定開始列 Dim endFuncCol As Integer: endFuncCol = 3 '★VLOOKUP関数設定終了列 Dim c As Range, i As Long For Each c In Selection If c.Row >= startFuncRow _ And c.Column >= startFuncCol _ And c.Column <= endFuncCol Then c.Value = "=IFERROR(VLOOKUP(" & Cells(c.Row, searchValueRow).Address(False, False) & ",品目情報!$A$2:$C$5," & c.Column & ",FALSE),"""")" Else c.Value = "" End If Next c End Sub Sub AutoActivateSheet_Name() 'DeleteKeyを押すと「FunctionDisplayOnDeletion」マクロ実行 Application.OnKey "{Delete}", "FunctionDisplayOnDeletion" Application.OnKey "^{Delete}", "FunctionDisplayOnDeletion" End Sub Sub AutoDeactivateSheet_Name() 'DeleteKeyへの割り当て解除 Application.OnKey "{Delete}" Application.OnKey "^{Delete}" End Sub Sub Auto_Open() '「見積り入力」シートがアクティブになったら「AutoActivateSheet_Name」マクロ実行 Worksheets("見積り入力").OnSheetActivate = "AutoActivateSheet_Name" '「見積り入力卸」シート以外がアクティブになったら「AutoDeactivateSheet_Name」マクロ実行 Worksheets("見積り入力").OnSheetDeactivate = "AutoDeactivateSheet_Name" End Sub
Excelで実地棚卸を管理するプログラムを作成します。
①マクロを使えるようにする
「マクロを使えるようにする」を参照
②実地棚卸の表を作成
③ 「Alt + F8」を押して表示される以下の画面で「マクロ名」を「SearchGoods_InputInventoryQuantity」として「作成」を押す
④ Microsoft Visual Basic for Applications」にて以下のコードを記載
Public enterFlg As Boolean Sub SearchGoods_InputInventoryQuantity() '検索文字入力行・列 Dim searchValueRow As Integer: searchValueRow = 1 '★ Dim searchValueCol As Integer: searchValueCol = 2 '★ '検索対象列 Dim searchTargetCol As Integer: searchTargetCol = 2 '★ '検索文字' Dim searchValue As String: searchValue = Cells(searchValueRow, searchValueCol).Value '棚卸数量入力行・列 Dim inventoryQuantityRow As Integer: inventoryQuantityRow = 2 '★ Dim inventoryQuantityCol As Integer: inventoryQuantityCol = 2 '★ '棚卸数量転記対象列 Dim copyQuantityTargetCol As Integer: copyQuantityTargetCol = 8 '★ '商品コード未入力メッセージ' Dim codeNotEnteredMessage As String: codeNotEnteredMessage = "商品コードを入力してください" '★ '重複メッセージ' Dim duplicateMessage As String: duplicateMessage = "既に入力があります" '★ '開始行 Dim startRow As Integer: startRow = 5 '★ '終了行 Dim lastRow As Integer: lastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 'アクティブCellが商品コードまたは棚卸数量欄でなければアクティブセルの移動のみ Dim activeRow As Integer: activeRow = ActiveCell.Row Dim activeCol As Integer: activeCol = ActiveCell.Column '商品コード検索 If activeRow = searchValueRow And activeCol = searchValueCol Then For i = startRow To lastRow Step 1 If Cells(i, searchTargetCol).Value <> searchValue And searchValue <> "" Then Rows(i).Hidden = True Else Rows(i).Hidden = False End If Next Cells(activeRow + 1, activeCol).Select '棚卸数量入力(1回目) ElseIf activeRow = inventoryQuantityRow And activeCol = inventoryQuantityCol And enterFlg = False And Cells(inventoryQuantityRow, inventoryQuantityCol) <> "" Then If Cells(searchValueRow, searchValueCol).Value = "" Then MsgBox codeNotEnteredMessage Cells(searchValueRow, searchValueCol).Select Exit Sub End If For i = startRow To lastRow Step 1 If Cells(i, copyQuantityTargetCol).Value = "" And Rows(i).Hidden = False Then Cells(i, copyQuantityTargetCol).Value = Cells(inventoryQuantityRow, inventoryQuantityCol) ElseIf Cells(i, copyQuantityTargetCol).Value <> "" And Rows(i).Hidden = False Then MsgBox duplicateMessage Exit Sub End If Next enterFlg = True '棚卸数量入力(2回目) ElseIf activeRow = inventoryQuantityRow And activeCol = inventoryQuantityCol Then For i = startRow To lastRow Step 1 Rows(i).Hidden = False Next Cells(inventoryQuantityRow, inventoryQuantityCol) = "" Cells(searchValueRow, searchValueCol).Select enterFlg = False Else Cells(activeRow + 1, activeCol).Select Exit Sub End If End Sub Sub Auto_Open() '「実地棚卸」シートがアクティブになったら「AutoActivateSheet_Name」マクロ実行 Worksheets("実地棚卸").OnSheetActivate = "AutoActivateSheet_Name" '「実地棚卸」シート以外がアクティブになったら「AutoDeactivateSheet_Name」マクロ実行 Worksheets("実地棚卸").OnSheetDeactivate = "AutoDeactivateSheet_Name" End Sub Sub AutoActivateSheet_Name() 'Enterを押すと「SearchGoods_InputInventoryQuantity」マクロ実行 Application.OnKey "~", "SearchGoods_InputInventoryQuantity" Application.OnKey "{Enter}", "SearchGoods_InputInventoryQuantity" End Sub Sub AutoDeactivateSheet_Name() 'テンキーのEnterへの割り当て解除 Application.OnKey "{Enter}" '大きいEnterへの割り当て解除 Application.OnKey "~" End Sub
VBAを利用して、随時更新されるcsvファイルをリアルタイムで読み取るプログラムを作成しました。
随時更新される売上データを題材に作成しています。
「マクロを使えるようにする」を参照
※ボタンの追加方法は「以前の記事」を参考
ボタン配置時の以下の画面で「マクロ名」を「Addup_Click」として「新規作成」を押す
必要に応じて「★」のついた箇所を変更
Sub Addup_Click() Call ReadCSV End Sub Function ReadCSV() '★読み込み対象ファイルの絶対パスを指定 Dim filePass As String: filePass = "C:\SalesData.csv" '★書き込みを開始する行・列を指定 Dim startRow As Integer: startRow = 2 Dim startCol As Integer: startCol = 1 '★定期実行する間隔を指定 Dim waitSec As Single: waitSec = 5 Dim targetRow As Integer: targetRow = startRow Dim targetCol As Integer: targetCol = startCol Dim rowBuf As String Dim cellBufList As Variant Open filePass For Input As #1 '全行読み込み終わるまで繰り返し Do Until EOF(1) '1行読み込み Line Input #1, rowBuf '読みこんだ1行をカンマで区切り配列化 cellBufList = Split(rowBuf, ",") '配列分繰り返し For Each cellBuf In cellBufList Cells(targetRow, targetCol).Value = cellBuf '次の列へ targetCol = targetCol + 1 Next cellBuf '次の行へ targetCol = startCol targetRow = targetRow + 1 Loop Close #1 'ピボットテーブルの更新 Dim pvt As PivotTable For Each pvt In ActiveSheet.PivotTables pvt.PivotCache.Refresh Next '待機処理 Dim Tm As Single Tm = Timer Do DoEvents Loop Until Timer > Tm + waitSec '再帰 Call ReadCSV End Function