Excel VBA質問箱 IV

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

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


6193 / 13644 ツリー ←次へ | 前へ→

【46253】特定列の削除について Isogai 07/1/28(日) 11:32 質問[未読]
【46254】Re:特定列の削除について かみちゃん 07/1/28(日) 12:03 発言[未読]
【46255】Re:特定列の削除について りん 07/1/28(日) 12:04 回答[未読]
【46258】Re:特定列の削除について Isogai 07/1/28(日) 19:24 質問[未読]
【46259】Re:特定列の削除について かみちゃん 07/1/28(日) 20:29 発言[未読]
【46261】Re:特定列の削除について Isogai 07/1/28(日) 20:47 質問[未読]
【46667】Re:特定列の削除について Isogai 07/2/11(日) 16:18 お礼[未読]
【46262】Re:特定列の削除について りん 07/1/28(日) 22:03 回答[未読]

【46253】特定列の削除について
質問  Isogai  - 07/1/28(日) 11:32 -

引用なし
パスワード
   こんにちは、特定の列を削除したいと思って、いろいろと試してみましたが、うまくいかなくて、ここの掲示板へ投稿しました。

Excelファイルの特定列(科目II、科目IV)
を削除するため、以下のコード(自動記録)で削除できましたが、
誤って重複マクロ「削除0127」を実行すると、削除してはいけない列も
削除される可能性があります。

本当は削除の指定列
Range("F:F,H:H").Selectのではなく、列の名称(科目II、科目IV)を使いたいが、
その高度なマクロ作成知識を持っていませんので、教えていただけませんか?
ご伝授ください。

Sub 削除0127()
  Range("F:F,H:H").Select
  Range("H1").Activate
  Application.CutCopyMode = False
  Selection.Delete Shift:=xlToLeft
End Sub

A   B  C   D    E   F    G   H   I    J
学級 名前 性別 生年月日 科目I 科目II 科目III 科目IV    科目V 科目VI

【46254】Re:特定列の削除について
発言  かみちゃん  - 07/1/28(日) 12:03 -

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

>本当は削除の指定列
>Range("F:F,H:H").Selectのではなく、列の名称(科目II、科目IV)を使いたい

以下のような感じになるかと思います。
なお、削除対象の判断となる列の名称は、1行目に入力されているものとします。
また、列の削除は、右のほうから削除、ちなみに行の削除は下のほうから削除して
いくのが定石となっています。

Sub Del_Column0127()
 '削除0127
 Dim intMaxColumn As Integer
 Dim intCol As Integer
 
 intMaxColumn = Cells(1, Columns.Count).End(xlToLeft).Column
 For intCol = intMaxColumn To 1 Step -1
  With Cells(1, intCol)
   If .Value = "科目II" Or .Value = "科目IV" Then
    .EntireColumn.Delete
   End If
  End With
 Next
End Sub

【46255】Re:特定列の削除について
回答  りん E-MAIL  - 07/1/28(日) 12:04 -

引用なし
パスワード
   Isogai さん、こんにちわ。

>こんにちは、特定の列を削除したいと思って、いろいろと試してみましたが、うまくいかなくて、ここの掲示板へ投稿しました。
>
>Excelファイルの特定列(科目II、科目IV)
1行目のセルの内容について、科目IIまたは科目IVのものを変数にセットし、列全体を削除します。
該当セルを絞るのにFindメソッドを使う方法もありますが、今回は総当りで。

Sub test()
  Dim r1 As Range, Cmax As Long, CC As Long
  With Application.ActiveSheet '現在表示中のシート
   Cmax = .Range("IV1").End(xlToLeft).Column 'データが入った列の一番右
   For CC = 1 To Cmax '列方向に繰り返し
     Select Case Trim(.Cells(1, CC).Value) '念のため前後の空白消去
      Case "科目II", "科目IV" 'この文字がセルに入っていると削除対象
        If r1 Is Nothing Then
         Set r1 = .Cells(1, CC) '1つめのセルをセット
        Else
         Set r1 = Application.Union(r1, .Cells(1, CC)) 'セル追加
        End If
     End Select
   Next
   'ここで処理
   If Not r1 Is Nothing Then
     r1.EntireColumn.Delete '列全体を削除
   Else
     MsgBox "該当文字列なし", vbExclamation '該当の文字列がなかった
   End If
  End With
  Set r1 = Nothing
End Sub

こんな感じです。

【46258】Re:特定列の削除について
質問  Isogai  - 07/1/28(日) 19:24 -

引用なし
パスワード
   かみちゃんさん
りんさん
ありがとうございます。
列の削除について、クリアできました。
一応変換後の結果をC:\WINDOWS\デスクトップ\変換後.csvへEXPORTしてみました。
問題ありません。

C:\WINDOWS\デスクトップ\変換前.csvがありますので、以下のコードで変換前.CSVを
取り込んで、後は列の削除を行って、その結果を変換後.CSVへ出力したいです。
変換前.CSVを取り込むため、どうすればいいでしょうか?
ご伝授ください。

Sub test()
  Dim r1 As Range, Cmax As Long, CC As Long
  With Application.ActiveSheet '現在表示中のシート
   Cmax = .Range("IV1").End(xlToLeft).Column 'データが入った列の一番右
   For CC = 1 To Cmax '列方向に繰り返し
     Select Case Trim(.Cells(1, CC).Value) '念のため前後の空白消去
      Case "科目II", "科目IV" 'この文字がセルに入っていると削除対象
        If r1 Is Nothing Then
         Set r1 = .Cells(1, CC) '1つめのセルをセット
        Else
         Set r1 = Application.Union(r1, .Cells(1, CC)) 'セル追加
        End If
     End Select
   Next
   'ここで処理
   If Not r1 Is Nothing Then
     r1.EntireColumn.Delete '列全体を削除
   Else
     MsgBox "該当文字列なし", vbExclamation '該当の文字列がなかった
   End If
  End With
  Set r1 = Nothing
  '削除後の結果をCSVデータ出力する
  ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\変換後.csv", _
  FileFormat:=xlCSV, CreateBackup:=False
End Sub

【46259】Re:特定列の削除について
発言  かみちゃん  - 07/1/28(日) 20:29 -

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

>変換前.CSVを取り込むため、どうすればいいでしょうか?

まず、一般操作では、できませんか?
一般操作でできて、それをマクロでしたいのならば、その操作を「マクロの記録」
で記録すれば、ある程度のコードは得られます。

また、変換前.CSVから特定の列を除いて、変換後.CSVを生成したいのならば、
Excelシートに取り込まなくてもできます。
その場合は、変換前.csvのサンプルを提示していただくと方法を説明します。

【46261】Re:特定列の削除について
質問  Isogai  - 07/1/28(日) 20:47 -

引用なし
パスワード
   かみちゃん さん
こんばんは。

変換前.CSV
学級 名前    性別 生年月日 科目I 科目II 科目III 科目IV 科目V 科目VI

科目II、科目IVを削除する

変換後.CSV
学級 名前    性別 生年月日 科目I 科目III 科目V 科目VI

【46262】Re:特定列の削除について
回答  りん E-MAIL  - 07/1/28(日) 22:03 -

引用なし
パスワード
   Isogai さん、こんばんわ。

>C:\WINDOWS\デスクトップ\変換前.csvがありますので、以下のコードで変換前.CSVを
>取り込んで、後は列の削除を行って、その結果を変換後.CSVへ出力したいです。
>変換前.CSVを取り込むため、どうすればいいでしょうか?
>ご伝授ください。

ブックを開き、その開いたシートを処理の対象にします。
Sub test()
  Dim r1 As Range, Cmax As Long, CC As Long, wb As Workbook
  '
  Set wb = Application.Workbooks.Open("C:\WINDOWS\デスクトップ\変換前.csv")
  '
  With wb.Worksheets(1) '新たに開いたブックの一つ目のシート
   Cmax = .Range("IV1").End(xlToLeft).Column 'データが入った列の一番右
   For CC = 1 To Cmax '列方向に繰り返し
     Select Case Trim(.Cells(1, CC).Value) '念のため前後の空白消去
      Case "科目II", "科目IV" 'この文字がセルに入っていると削除対象
        If r1 Is Nothing Then
         Set r1 = .Cells(1, CC) '1つめのセルをセット
        Else
         Set r1 = Application.Union(r1, .Cells(1, CC)) 'セル追加
        End If
     End Select
   Next
   'ここで処理
   If Not r1 Is Nothing Then
     r1.EntireColumn.Delete '列全体を削除
   Else
     MsgBox "該当文字列なし", vbExclamation '該当の文字列がなかった
   End If
  End With
  Set r1 = Nothing
  '削除後の結果をCSVデータ出力する
  With wb
   'テキスト出力
   .SaveAs Filename:="C:\WINDOWS\デスクトップ\変換後.csv", _
       FileFormat:=xlCSV, CreateBackup:=False
   'アラート無しで閉じる
   .Saved = True
   .Close
  End With
  Set wb = Nothing
End Sub

こんな感じです。
デスクトップのフルパス名はWin2K以降はC:\Documents and Settings〜とか何とかの長い名前になっているはずなので、注意が必要です。

↓ちなみにデスクトップフォルダの取得方法の例
h t t p://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=44958;id=excel

【46667】Re:特定列の削除について
お礼  Isogai  - 07/2/11(日) 16:18 -

引用なし
パスワード
   りんさん
かみちゃんさん
こんにちは。
問題解決となりましたので、ありがとうございました。

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