重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

列 A B C D

1 T1 あ 1 2
2 T2 い 4 5
3 T3 う 7 5

分かりにくいかもしれませんが、上記のような表があるとします。ファイル名:AA.xlsとします。
”行1”の「T1」や「あ」等はファイルにより違うとします。
1つのファイルの1シートにこういった表が改ページにより(ある領域で1,2ページとしている)たくさんあります。

これを必要な行、列をVBAで作成されたボックス?に入力方式で行、列を入力して、入力された例えば"B"列が削除され、その部分は左詰にされ、そのファイルが新しく別のファイル名で例えばAB.xlsが自動的に作成することは可能でしょうか?

手順としては

ファイルにより必要、不要な列・行が違うのであらかじめ削除する列・行を確認する。(このファイルをA1.xlsとする)


実行したいファイルを参照で(任意のフォルダに進めるよう)読み込めるようにしたVBAを開き、A1.xlsを選択する。


削除したい列・行を入力できる窓があり、そこに打ち込む。


削除した列・行のスペース分左詰め、上詰めにされたA2.xlsというファイルが同一フォルダ内に作成される。

VBAは全くの初心者で、インターネットで勉強を始めようとしている青二才です。
最終的にはこれ以上のことをしたいですが、まずは最低限これをしたいです。

余談ですが、これができるようになるためにはやはり一から勉強をするしかないのでしょうか?
今したいことがずばり載っている入門書のそのページだけ勉強しても不可能でしょうか?

・PS3のあるゲームのキャラクターの必殺技のコマンドを覚えても、まずPS3をどうやって起動するのか?
という考えと一緒でしょうか?

A 回答 (3件)

まず、質問に対してですが、比較的容易に実現できます。



やろうとしてる事は、ファイルダイアログでファイルを選択して開き、
フォームを表示し、指定した行・列を削除した後、別名で保存です。

サンプルコードを書いときます。

準備するもの
(1)UserForm1という名前のフォームを追加
(2)UserForm1内にTextBoxを二つ、CommandButtonを一つ、Labelを一つ追加。
(3)CommandButtonのクリックイベント内に下記コード追記
***************
If IsNumeric(Me.TextBox1.Value) Then
DeleteRow = CLng(Me.TextBox1.Value)
End If

If IsNumeric(Me.TextBox2.Value) Then
DeleteCol = CLng(Me.TextBox2.Value)
End If

Unload Me
***************

(4)標準モジュールの追加
(5)標準モジュール内に下記コード追記
***************
Option Explicit
Public DeleteRow As Long '削除行位置
Public DeleteCol As Long '削除列位置


Sub ColDelete()
Dim MyBook As Workbook
Dim MySheet As Worksheet
Dim SavePath As String
Dim SaveName As String
With Application.FileDialog(msoFileDialogFilePicker)
.Filters.Add "エクセルブック", "*.xls"
.Title = "エクセルファイルを開く"
.Show
If .SelectedItems.Count = 1 Then
Set MyBook = Application.Workbooks.Open(.SelectedItems(1))
Else
Exit Sub
End If
End With


For Each MySheet In MyBook.Worksheets
DeleteRow = 0
DeleteCol = 0

MySheet.Activate

Load UserForm1
UserForm1.Label1.Caption = "シート名:" & MySheet.Name
UserForm1.Caption = "削除行・列を指定"
UserForm1.Show

If DeleteRow <> 0 Then '削除行の指定があれば
MySheet.Rows(DeleteRow).Delete
End If

If DeleteCol <> 0 Then '削除列の指定があれば
MySheet.Columns(DeleteCol).Delete
End If

Next
SavePath = MyBook.Path & "\" '選択したファイルの絶対パスを取得
SaveName = MyBook.Name 'ファイル名を取得
SaveName = Mid(SaveName, 1, InStrRev(SaveName, ".") - 1) 'ファイル名から拡張子を抜いた名前を取得

MyBook.SaveAs SavePath & SaveName & Format(Now, "hhmmss") & ".xls"
MyBook.Close False
End Sub
************

以上です。

それとこれから習得するとの事ですが、
ネットだけだと意図する答えを探す手間が発生する事を考慮して下さい。
そして必ず意図する答えを得られる保障はない事も忘れてはいけません。

なので、初心者向けの入門書を購入し
とりあえず何かを作ってみるってのが
一番の近道かと思います。

あと、マクロ自動記録機能の活用、
入手できるなら、他人が作ったツールなどのコードを見る事です。

ExcelVBAとAccessVBAは若干の相違点があるなど、奥が深い世界なので、
地道にがんばってください。
    • good
    • 0

>要な行、列をVBAで作成されたボックス?に入力方式で行、列を入力して


の部分が良くわからないのですが。
基本の部分を一から勉強されることをお勧めします。例えば
http://excelvba.pc-users.net/index.html
のサイトなどを一通り目を通してみてください。そんなに日数はかからないと思います。
>実行したいファイルを参照で(任意のフォルダに進めるよう)読み込めるようにしたVBAを開き、A1.xlsを選択する。

Sub ボタン1_Click()
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
If OpenFileName <> "False" Then
Workbooks.Open OpenFileName
End If
End Sub
このことではないかなと察します。試してみてください。
一応のことが理解できれば、質問の仕方も変わってきます。
他の人にわかりやすい質問の仕方が出来るようになります。
    • good
    • 0

出来ますよ。


EXCELであればマクロレコーダを起動しておいて上記の操作を行えばマクロに記録されます。このマクロを参考にすればかなり楽になります。

0から作るのは困難でもある程度のものがあればできると思います。

入力についても専用の画面(VBAのFORM)を使わないで、別途シートを作成して入力させればこれもマクロ記録されます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!