エクセル2000を使っているのですが,マクロの使い方がよくわかりません.
コピーペーストしてきた大量の文字行列の先頭末尾に余分な空白があって正しくソートされません.そこで,Trimを使おうと思ったのですが,使い方がいまいちよくわからず,エラーが出て実行できません.
また,重複した内容のセルを抽出・削除もしたいのです.

どうぞ教えてくださいm(_ _)m

このQ&Aに関連する最新のQ&A

A 回答 (5件)

空白を削除するセルを選択して、下記のマクロを実行します。

空白を除いた文字に書き換えます。
蛇足ですが、セルを選択する時は、先頭セルを選択して、Shift+Ctrl+↓等で連続エリアが選択できます。
また、Ctrlキーを押しながらマウスで飛び飛びに選択できます。

Sub 空白を除去()
Dim rg As Range 'セル
For Each rg In Selection
rg = Trim(rg) '左右の空白を削除
Next
End Sub

Trimに関する関数には以下のものがあります。必要なものを使い分けてください。
  Trim(rg) 左右の空白を削除(VBA)
  RTrim(rg) 右の空白を削除(VBA)
  LTrim(rg) 左の空白を削除(VBA)
  Application.Trim(rg) 左右、途中の空白を削除(ワークシート関数)
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

そう、これです、もう、とっても感謝します(^^)

お礼日時:2001/07/02 14:19

選択範囲(単一列)に同じ値があると2つ目以降について、その行を削除してしまいます。



重複を調べる列のデータ範囲を選択して、下のマクロを実行します。
標準モジュールに貼り付ければ、どのシートについても実行できるはずです。質問の意味はこういうこと?

Sub 同一値がある行の削除()
Dim rg As Range '選択範囲
Dim cot As Long 'カウンタ
Set rg = Selection
Application.ScreenUpdating = False
With rg
For cot = .Count To 1 Step -1
If Application.CountIf(Range(.Cells(1, 1), .Cells(cot, 1)), .Cells(cot, 1)) > 1 Then
Rows(.Cells(cot, 1).Row).Select: Selection.Delete Shift:=xlUp
End If
Next
.Cells(1, 1).Select
End With
Application.ScreenUpdating = True
End Sub
    • good
    • 0
この回答へのお礼

たびたびありがとうございました。
おかげさまで、勉強もできましたし、目的も達成できましたm(__)m

お礼日時:2001/07/06 01:35

同一データの削除については、A1から下方向にデータがあるとすると、B1に


=IF(COUNTIF($A$1:A1,A1)>1,"*","")
として、データ分コピーします。あとはオートフィルタを使い「*」だけを出して削除すれば重複データを除けます。これもマクロで行いたい?

この回答への補足

マクロで出来るなら、教えてほしいと思います。。。度々すみません(^^;)

補足日時:2001/07/02 14:19
    • good
    • 1

Masazo-さんに便乗です。



下方向へのコピーが大量なら、セルB1の右下の■(フィルハンドルという)を
ダブルクリックするとOKです。(途中に空白があったらだめですけど)

確認にはCtrlキーを押したまま、↓キーを押すと最終行までジャンプできます。

> がいまいちよくわからず,エラーが出て実行できません.
このエラーが何なのか、気になります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
フィルハンド、知りませんでした。便利ですね!覚えておきます。

VisualBasicEditorでマクロを作ろうと思い、

Sub 空白を除去
(ここをどうにかしてセルの内容をTrimしたものと置き換えたい)
End Sub

をどうにかこうにかしたのですが、技術力不足のせいで出来ません(;;)

お礼日時:2001/07/02 11:44

Trimだけなら・・・。


A1に貼り付けた値に対して、B1に「=Trim(A1)」を設定します。
後は下方向にコピーする。

Trimだけなら、マクロではなく、ワークシート関数の方が楽です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
それでも出来ることは出来るのですが、文書が大量に(A~Zまで26個)あるので、マクロで出来たら便利かなと思っています。それに、=Trimでやると、Trimされたセルの内容をTrimされる前の内容とをコピペで置き換えられないんです(私には)。

他に方法はないでしょうか?

お礼日時:2001/07/02 11:39

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルでVBAで範囲に対してTRIM関数を適用したい

他のソフトから取り込んだデータなどに、各データの前後に不要なスペースがついている場合があります。
これをワークシート関数のTRIM同様前後のスペースだけ(文字列中のスペースは残す)削除したいのですが、データが多いのでFor~Nextは避けたいと思っています。
何かよい方法はありますか?

Aベストアンサー

こんにちは。KenKen_SP です。

ループ処理は必須ですね。ただ、時間を短縮させることは可能です。

【POINT】

1. UsedRange や CurrentRegion、SpecialCells などで処理対象のセルを
  限定させ、ループ数を減らす

  全てのセルが選択された状態で考えてみます(Selection が Cells のとき)

  For Each c in Selection ...といったコードは良く見かけますが、この
  ままでは、65536×256 のループ処理になります。通常、処理が必要なのは、
  何らかのデータが存在するセルのみなので、

  For Each c in Intersect(Selection,Activesheet.UsedRange)

  のようにすると、ループ回数が激減するはずです。同様に、置換処理などでは
  数式のあるセルでは置換処理は無意味ですから、

  For Each c In Selection.SpecialCells(xlCellTypeConstants, xlNumbers Or xlTextValues)

  として定数のセルのみループさせます。数式の置換なら数式のあるセル
  だけですね。

  ループ回数を減らすだけで、随分と処理速度が改善します。


2. オブジェクトへの参照を減らす

  Excel VBA で処理速度を落とす要因のひとつに、オブジェクトへの参照
  があります。これをなるべく減らす様にコーディングすると良いでしょう。

  具体的には配列を使用します。

  For Each c in Selection で Range コレクションをループさせた場合、
  ループの度にセルへの参照が行われます。これが非常に遅い。

  オブジェクトの参照が遅いのは、数多くのプロパティーを同時に取得する
  からですね。例えば、セルのフォントや罫線、色、書式等々。

  全セル選択時だとフリーズ、、または非常に長い時間がかかります。

  大半の処理で必要なのは Value プロパティーだけだったりします。
  では、配列を使用してみます。

  Buffer = Selection.Value
  For Each vntElement in Buffer
  Next

  この場合、セルの参照は1回だけで、取得するプロパティーは Value のみ
  です。

  全てのケースで配列が有効なわけではありません。特に、セルの選択範囲
  が飛び飛びの場合だと Areas コレクションでブロック毎に切り分け処理が
  必要になりますし。

以上を検証するために、7万セル(10,000行×7列)に "aaa " のデータをセットし、
実際に計測してみました。

左が Test1 で、右が Test2 の結果です。単位はミリ秒。ロジックの違いで
10倍以上の差が発生します。

      Test1  Test2
1回目:= 1038  10427
2回目:= 1039  10427
3回目:= 1043  10439
4回目:= 1034  10424
5回目:= 1041  10456


Sub Test1()
  
  Dim rngTarget As Range
  Dim Buffer  As Variant
  Dim lngRowCnt As Long
  Dim lngColCnt As Long
  Dim i As Long, j As Long
  
  Set rngTarget = Range("A1").CurrentRegion
  
  Buffer = rngTarget.Value
  lngRowCnt = UBound(Buffer)
  lngColCnt = UBound(Buffer, 2)
  
  For i = 1 To lngRowCnt
    For j = 1 To lngColCnt
      Buffer(i, j) = Trim$(Buffer(i, j))
    Next j
  Next i
  rngTarget.Value = Buffer
  Set rngTarget = Nothing

End Sub

Sub Test2()
  
  Dim rngTarget As Range
  Dim C As Range
  
  Set rngTarget = Range("A1").CurrentRegion
  
  For Each C In rngTarget
    C.Value = Trim$(C.Value)
  Next
  
  Set rngTarget = Nothing
  
End Sub

こんにちは。KenKen_SP です。

ループ処理は必須ですね。ただ、時間を短縮させることは可能です。

【POINT】

1. UsedRange や CurrentRegion、SpecialCells などで処理対象のセルを
  限定させ、ループ数を減らす

  全てのセルが選択された状態で考えてみます(Selection が Cells のとき)

  For Each c in Selection ...といったコードは良く見かけますが、この
  ままでは、65536×256 のループ処理になります。通常、処理が必要なのは、
  何らかのデータが存在するセルのみなの...続きを読む

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む

QVBAで文字列を数値に変換したい

A列とE列の文字列になってしまった数値を
数値に変換したく、以下のようなものを作ったのですが、
文字の無いセルまで、数値に変換しようとするので
時間がかなりかかります。
何かよい方法は無いでしょうか?
よろしくお願いいたします。


Sub 数値に変換()
Range("A:A,E:E").Select
For Each xCell In Selection
xCell.Value = xCell.Value
Next xCell
End Sub

使用ソフトEXCEL2000orEXCEL2003

Aベストアンサー

>Range("A:A", "E:E")
これは、A、B,C,D,E列のことなので
A列とE列であれば質問者のようにRange("A:A,E:E")です。

ま、それはそれとして、回答。

Sub Test()
 Range("A:A").Value = Range("A:A").Value
 Range("E:E").Value = Range("E:E").Value
End Sub

以上。
 

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QエクセルVBAのIf,Then 構文でOr条件とAnd条件の結合方法?

ワークシート関数で書けば
=IF(OR(F18=0,AND(F15>0,F16>0)),TRUE)です。
これをVBAで書こうとして

If Sheet1.Range("F18") = 0 Or Sheet1.Range("F15") > 0 And Sheet1.Range("F16") > 0 Then
MsgBox True
Else
MsgBox False
End If

とやってみたのですが、正しくないようです。
どのように書けばいいのでしょうか?

Aベストアンサー

>とやってみたのですが、正しくないようです。

式は正しいと思いますよ

ANDとORは、ANDが先に演算されます。/*と+-では、/*が先に演算されるようなものです。

でも、わかり易くするために、#1のかたのように括弧をつけるほうが良いですね。

QExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。

以下のようなプログラムをVBAで作成したいと考えています。

A1のセルに値があれば、その値をB1に返す。
次にA2のセルに値があれば、その値をB2に返す。
A行に値がある一番下のセルまで同じようなことをさせたいと考えています。

VBAは初心者です。
どなかた宜しくお願い致します。

Aベストアンサー

#2さんと似たものですが・・・・参考にしてください。

Sub test001()
Dim i As Long
i = 1
Do While Cells(i, 1) <> ""
Cells(i, 2) = Cells(i, 1)
i = i + 1
Loop
End Sub

Qエクセル VBA セルの個数を所得する

いつも皆様には大変お世話になっております。

早速の質問ですが、

    A    B     C     D     E
1
2       123
3       123
4       123
5       123
6
7       123
とエクセルのセルがなっている場合の
上のB2から下のB7までのセルの個数を所得したいのです
B8以降にも数字が入る場合があるのと間に空白が入る場合があるので
困っています。
B2のセルは固定となっているのでB2からの判別で問題ない状況です。
どうぞ皆様お知恵をお借りしたく思っておりますのでよろしくお願いいたします。

Aベストアンサー

質問が非常に不明確なのですが・・・

所得?取得ですよね?

単にB2:B7のセルの個数をVBAで取得するなら
MsgBox Range("B2:B7").Count

B2:B7の空白でないセルの個数なら
MsgBox Application.CountA(Range("B2:B7"))

B7まででなくB2からB列のデータがある最後までのセル個数なら
MsgBox Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Count

B2からB列のデータがある最後までの空白でないセル個数なら
MsgBox Application.CountA(Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row))

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QエクセルVBA 別シートの複数のセルの値をコピーする方法

いつもお世話になります。

Dim sh1, sh2 As Worksheet
Set sh1 = Worksheets("sheet1")
Set sh2 = Worksheets("sheet2")

sh1.Range("C6").Value = sh2.Range("F5").Value
として、1つのセルの値ならコピーできるのですが、
sh1.Range("C6:C10").Value = sh2.Range("F5;F9").Value
としても、セルの値を持ってくることができません。
どのように書けば良いのでしょうか?

ちなみに今は、
sh2.Range("F5:F9").Copy
sh1.Range("C5:C9").PasteSpecial Paste:=xlValues
としているのですが、上記だとセルを範囲指定してしまって作業が見えるのでカッコ悪いのです。

Aベストアンサー

7-samuraiの質問ですみません。
No5のimogasiさん、いつもお世話様です。

Sub test01()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("sheet2")
Set sh2 = Worksheets("sheet1")
sh1.Range("c1:c5").Value = sh2.Range("A1:A5").Value
End Sub

で、うまくいきますよ。
複数セルの場合Valueは省略できないようです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング