出産前後の痔にはご注意!

Excel vba で標準モジュールをインポートしたいのですが、ファイル名がすべて
module1,module2になります。

①ThisWorkbook.VBProject.VBComponents.Import "C:\test1.bas"

②vbaエディタで ファイルのインポート

①②どちらの方法でも 標準モジュール名が module1 になります。
この場合、test1 の名前でインポートされたいです。

インポートしたファイル名が標準モジュール名になるにはどうすればよいでしょうか。

どうぞアドバイスをお願いいたします。

A 回答 (1件)

出力された bas ファイルの中の以下の部分を書き換え、"test1" にすればよいと思います。



Attribute VB_Name = "test1"
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
できました。

お礼日時:2017/08/07 23:17

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

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

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

QVBA、マクロについて、どなたか知恵をお貸し願います!

VBA独学中の初心者です。
ある問題に躓いており、どうしても動かない部分があるため、皆様のお力添えをいただきたいです。
説明が稚拙で分かりづらいかもしれませんが、宜しくお願いいたします。

① 2つのbook(book1/book2)があるとし、登録したマクロはbook2に設置する。
book2のsheet2に以下のような表を作る。
 ※枠線がズレてしまっていますが、それぞれが1つのセルと考えてください。
  人物・情報と入力されたセルは見出しです。
  また、1人の人物のデータに対し、その人の情報が3つあるとします。
  
______________
|人物   |   情報   |
_______________

|B君 |  |  |  |
_______________
|C君   | | | |
_______________
|A君 | | | |
_______________


② book1のsheet3に、同じ表があるとする。ただし、情報のセルは記入されている。
 
________________
|人物   |   情報     |
_______________

|A君 |長男|中学生|14歳|
_______________
|B君   |次男|小学生|10歳|
_______________
|C君 |長男|高校生|16歳|
_______________

③book2に設置しているマクロを実行すると、book1/sheet3のデータを読み込み、book2/sheet2の該当する人物のデータに表示されるようにする。但し、①②をみてわかるように、人物の名前の順番は同じではない。



・・・というものです。
最初に作ったプログラムでは、以下のように考えました。

book1/sheet3のUsedRangeから”A君”という文字列を

Set A君1 = Cells.Find(what:="A君", lookat:=xlPart)
で探し、
Selection.Offset(Columnoffset:=1).Select
で1つとなりのセルをActiveにし、
そのActivecellを"A君情報1"という変数にし、Do loopを使ってbook1/sheet3の"情報"セルがが空白になるまで1つずつ右に移動/変数を設定し、その値をbook2/sheet2の該当セルに代入していく・・・・(book2/sheet2の表からも、同じ工程で"A君"を探し、隣のセルに変数を設定する)というものです。そして、C君までの情報を全て出力し終えるというプログラムを作りたいのです。

ちなみに、book2からbook1の呼び出しはできました。

以下が作ってみたプログラムです。↓




'型があっていないとエラーになるため、とりあえずすべてVariant型にしています
Dim SorceFile As Variant, OpenFile As Variant
Dim A君1 As Variant, B君1 As Variant, C君1 As Variant
Dim A君情報1 As Variant, B君情報1 As Variant, C君情報1 As Variant
Dim A君情報2 As Variant, B君情報2 As Variant, C君情報2 As Variant

'現在開いているbook2の名前をSorceFileという変数にする
Set SorceFile = ThisWorkbook
'ファイル(book1)を選択して開く
OpenFile = Application.GetOpenFilename
If OpenFile <> fales Then
Filename = Dir(OpenFile)
MsgBox Filename
Workbooks.Open OpenFile
Else
MsgBox "キャンセルされました"
End If

'開いたファイル(book1)から、"A君"という文字列を探す。見つかったら、1つ隣のセルに移動し、"A君情報1"という変数を設定する。
ActiveSheet.UsedRange.Select
Set A君1 = Cells.Find(what:="A君", lookat:=xlPart)
A君1.Select
A君1.Offset(columnoffset:=1).Select
A君情報1 = ActiveCell

'マクロが設置されているbook2をアクティブにし、同様に"A君"という文字列を探す。見つかったら、1つ隣のセル(空白)に移動し、その空白のセルに"A君情報2"という変数を設定する。
ThisWorkbook.Activate
ActiveSheet.UsedRange.Select
Set A君2 = Cells.Find(what:="A君", lookat:=xlPart)
A君2.Select
A君2.Offset(columnoffset:=1).Select
A君情報2 = ActiveCell




・・・と、ここまではステップインをしながら変数の値を確認できています。、
このあとbook2の空白のセル"A君情報2"にbook1の"A君情報1"の値を代入したいのですが、

ThisWorkbook.Worksheets("sheet2").A君情報2.value = Workbooks(SorceFile).Worksheet("sheet1").A君情報1.value

↑ではコンパイルエラーになります。book2の表、A君の空白の情報で"長男"~"14歳"まで、book1から抽出/出力ができたら、次はB君C君・・・としていきたいのですが、「型が一致しない」や「インデックスが有効範囲にありません」となってしまいます。
この値だけ代入することができれば、私の力でもプログラムを最後まで作成することができるのですが・・・

分かりづらく、しかも玄人の方からすれば何だこのマクロは!!となるかもしれませんが、
どうかアドバイスの程、宜しくお願いいたします。

VBA独学中の初心者です。
ある問題に躓いており、どうしても動かない部分があるため、皆様のお力添えをいただきたいです。
説明が稚拙で分かりづらいかもしれませんが、宜しくお願いいたします。

① 2つのbook(book1/book2)があるとし、登録したマクロはbook2に設置する。
book2のsheet2に以下のような表を作る。
 ※枠線がズレてしまっていますが、それぞれが1つのセルと考えてください。
  人物・情報と入力されたセルは見出しです。
  また、1人の人物のデータに対し、その人の情報が3つあると...続きを読む

Aベストアンサー

こんばんは。

要するに、ソースファイル(データファイル)から情報を取り出す内容なのですね。
それをあえてFind メソッド指定なのかな?

>ActiveSheet.UsedRange.Select
だったら、以下は、Cells ではなくて、Selection でしょうね。

> Cells.Find(what:="A君", lookat:=xlPart)
なぜ、xlPart になっているのでしょうか?表記の乱れがあるということでしょうか?
変数の使い方とか、初歩的なところがまだ出来ていません。

>玄人の方からすれば何だこのマクロは
Findメソッド は、常連さんの某氏の専売特許のようなものですが、私だと、配列からMatch関数を利用しいるのだろうとは思います。玄人的なら、ADODBでしょう。ファイルを直接開けないで可能だからです。もちろん、Excel関数での処理もありますが、あまり格好がよくありません。

私が書くと、こんなコードにしてしまいます。

person info1 info2 info3
A君 長男 中学生 14歳
B君 次男 小学生 10歳
C君 長男 高校生 16歳
D君 三男 大学生 18歳 * 新たな情報が加わった場合も、D君のものだけを取るようにしています。

一旦取得した後に、D君の資料を取り寄せる
B君 次男 小学生 10歳
C君 長男 高校生 16歳
A君 長男 中学生 14歳 
D君 



'//標準モジュール
Sub GetDataAll()
 Dim wb1 As Workbook 'データのソースファイル
 Dim AcSh As Worksheet 'アクティブシート(データを受け取る側)
 Dim c As Range
 Dim r As Range
 Dim startRw As Long '検索文字列の最初の行
 Dim FindArea As Range 'データ・ソースの被検索場所
 Const FNAME As String = "myDATABook.xlsx" 'Thisbook と同フォルダーのファイル名
 Set AcSh = ThisWorkbook.Worksheets("Sheet2")
 
 On Error GoTo ErrHandler
 Set wb1 = Workbooks(FNAME) 'オブジェクトとして認識できるか?できなければ、ErrHandlerに飛ぶ
 
 Set FindArea = wb1.Worksheets("Sheet1").Columns(1) 'ソースファイルの1列目を検索
 With AcSh
  Application.Goto AcSh.Range("A1") 'データをインポートするシートに戻る

  'データに空きがないか調べ、データ検索の初期値の行を求める
  If .Cells(Rows.Count, 1).End(xlUp).Row > .Cells(Rows.Count, _
    2).End(xlUp).Row Then
    startRw = .Cells(Rows.Count, 2).End(xlUp).Row + 1
  Else
    MsgBox "データの取得の必要がありません。", vbExclamation
    Exit Sub
  End If
  
  '単語検索は、ワイルドカードを加える, c.Value & "*" ->LookAt:=xlWhole となる
  For Each c In .Range(.Cells(startRw, 1), .Cells(Rows.Count, 1).End(xlUp))
   If c.Value <> "" Then
    Set r = FindArea.Find(What:=c.Value & "*", LookIn:=xlValues, _
      LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, _
      MatchByte:=False)
    If Not r Is Nothing Then
     '配列の受け渡し(非推奨)
     c.Offset(, 1).Resize(, 3).Value = r.Offset(, 1).Resize(, 3).Value
    End If
   End If
  Next
 End With
 Exit Sub
ErrHandler:
 'エラーの発生の場合
 If Err.Number = 9 Then
  If Dir(FNAME) <> "" Then
   Workbooks.Open FNAME
   Resume 'エラーを発生した所まで戻る
  Else
   MsgBox "ファイルが見つからないか、パスを指定してください。", vbExclamation
   Exit Sub
  End If
 Else
  MsgBox Err.Number & " :" & Err.Description & " :" & Erl
 End If
End Sub

'//

 '配列の受け渡し
 c.Offset(, 1).Resize(, 3).Value = r.Offset(, 1).Resize(, 3).Value

入門・初級レベルでは、Copy メソッドのほうが良いでしょう。
r.Offset(, 1).Resize(, 3).Copy c.Offset(, 1)

こんばんは。

要するに、ソースファイル(データファイル)から情報を取り出す内容なのですね。
それをあえてFind メソッド指定なのかな?

>ActiveSheet.UsedRange.Select
だったら、以下は、Cells ではなくて、Selection でしょうね。

> Cells.Find(what:="A君", lookat:=xlPart)
なぜ、xlPart になっているのでしょうか?表記の乱れがあるということでしょうか?
変数の使い方とか、初歩的なところがまだ出来ていません。

>玄人の方からすれば何だこのマクロは
Findメソッド は、常連さんの某氏の専売特許の...続きを読む

Q【VBA】 for next 繰り返し処理の入れ子の処理速度について

こんにちわ
マクロを作成しております。
入れ子した繰り返し処理に躓いております、
もしよろしければ高速化のアドバイスをいただければと思います。


B2から下方向に値をいれております。
C1から横方向に同じ値をいれております。
B1-C1,B1-D1,B1-E1・・・最終まで
、というようにリーグ戦の総当たり結果表のような
結果を出力しようとしています。
値は数値で差分を整数で出すだけで、
重複した結果は不要ですので階段状に出力させています。

B列70行程で処理に40秒程かかってしまう状態です。
何か余計な処理や修正したほうがよさそうな箇所ははありますでしょうか?

excel2013
win8 メモリ4G

_______________
Sub test3()

Dim sh As Worksheet
Dim m As Long, i As Long, j As Long

Application.ScreenUpdating = False '非表示

Set sh = Worksheets("test")

m = sh.Cells(Rows.Count, "B").End(xlUp).Row

For i = 1 To m - 1
For j = i To m - 1

sh.Cells(j + 1, i + 2) = _
Application.WorksheetFunction.RoundDown( _
Abs(sh.Cells(1, 2).Offset(i, 0).Value - sh.Cells(1, 2).Offset(0, j).Value), 0)
      ’小数点切り捨てなど入れてます。
      ’単純にi+jにしても処理時間は変わりませんでした。
Next j
Next i


End Sub
_______________

以上です、よろしくお願いします。

こんにちわ
マクロを作成しております。
入れ子した繰り返し処理に躓いております、
もしよろしければ高速化のアドバイスをいただければと思います。


B2から下方向に値をいれております。
C1から横方向に同じ値をいれております。
B1-C1,B1-D1,B1-E1・・・最終まで
、というようにリーグ戦の総当たり結果表のような
結果を出力しようとしています。
値は数値で差分を整数で出すだけで、
重複した結果は不要ですので階段状に出力させています。

B列70行程で処理に40秒程かかってしまう状態です。
...続きを読む

Aベストアンサー

コードをそのままで、B列200行程度実行しても一瞬で終わります。

コードの問題では無いですね。
PC環境かエクセルの問題だと思います。

そもそも、そのエクセルに直接文字入力した場合、入力の度に待たされる事は有りませんか?

Qエクセル マクロについて

今画像のようなAからC列をそのままシート2に移し、なおかつC列の中の日本語のみ日本語があったセルの日本語のみ右隣のセルに移すと言うマクロを組んでいたのですが、

Sub 言語判別()
Dim 実行結果 As Object
Dim 判別 As Range

Worksheets("Sheet2").Cells.Clear


Set 実行結果= Worksheets("sheet2")
Worksheets("sheet1").Columns("A:C").Copy Destination:=実行結果.Columns
("A:C")


Set 実行結果 = CreateObject("VBScript.Regexp")
実行結果.Pattern = "[一-龠ぁ-んァ-ンァ-ンパピプペポ]+"

For Each 判別 In Range("C2:C65536")

If 実行結果.test(判別.Value) Then 判別.Offset(, 1).Value =
実行結果.Execute(判別.Value)(0)

Next

Set 実行結果 = Nothing


MsgBox "判別終了しました。", vbInformation, cnsTITLE

End Sub

でやって見たのですがただコピーされるだけで上手くいきません。
シート2に移さずシート1で実行した場合は上手くいきました。
なぜシート2に移したら上手くいかなくなるのかわかりません。
教えてください。

今画像のようなAからC列をそのままシート2に移し、なおかつC列の中の日本語のみ日本語があったセルの日本語のみ右隣のセルに移すと言うマクロを組んでいたのですが、

Sub 言語判別()
Dim 実行結果 As Object
Dim 判別 As Range

Worksheets("Sheet2").Cells.Clear


Set 実行結果= Worksheets("sheet2")
Worksheets("sheet1").Columns("A:C").Copy Destination:=実行結果.Columns
("A:C")


Set 実行結果 = CreateObject("VBScript.Regexp")
実行結果.Pattern = "[一-龠ぁ-んァ-ンァ-ンパピプペポ...続きを読む

Aベストアンサー

プログラム内で複数のシートを扱う場合、CellsやRangeはどのシートのものかを指定する必要があります。省略した場合には、アクティブなシートに対して処理が行われます。

 ※なのでコピー後にSheet2をアクティブにするという方法もありますが、
  ちゃんとシートを指定したほうが良いと思います。

あとワークシートと正規表現を同じ変数で使いまわしていますが、ワークシートの方はWorksheet型の変数を使用した方が良いと思います。


Dim 実行結果シート As Worksheet

Set 実行結果シート = Worksheets("sheet2")
実行結果シート.Cells.Clear
Worksheets("sheet1").Columns("A:C").Copy Destination:=実行結果シート.Columns("A:C")

For Each 判別 In 実行結果シート.Range("C2:C65536") ' ←どのシートのRangeかを明確に指定する

QEXCEL VBAとワークシート関数の混同は邪道なのでしょうか?

前任者が作成したEXCELファイルがあります。

VBAとユーザーフォームを作成して、ACCESSのようにまったくEXCELを知らない人でもルーティン作業ができるようになっています。
ただACCESSと違って、それを修正するのが大変です。
項目が1列又は1行増えるだけで、修正する箇所が何箇所も出てきます。

そこで少し作り変えようと思っているのですが、VBAと関数の混同は良くないのでしょうか?
① Application.WorksheetFunction.sum ではなく、
② シート作業列にSUM関数を入れる
②の場合では、他のモジュールやフォームからも参照できます。
又、変更するたびに①を実行させる必要もありません。

VBAとシート上の関数の混同は不都合はあるのでしょうか?
教えて下さい。

Aベストアンサー

「VBAとワークシート関数の混同は邪道」ではないと思います。

ただ次の点を注意する必要があるかと思います。

1.一番大きいのは「処理速度」です。
 ・セルに計算式を設定されていると、EXCELはセルに値を設定するごとに【再計算】が行われしまうことが、処理速度が大幅に低下
  することがあります。
  そのため、プログラムを実行する場合【自動計算】を一時的にストップさせています。
   Application.Calculation = xlManual
   ※処理完了後は「Application.Calculation = xlAutomatic」にします。
 ・ただ注意しないといけないのは「計算を手動」にした場合、関数で計算した値をプログラムで参照したい場合【再計算が必要】かも
  知れません。そのときは一時的に再計算をした方が間違いないかと思います。
   Range("B12").Calculate  … 特定セルだけ再計算
   Worksheets(1).Calculate  … 特定シートだけ再計算
   Application.Calculate    … 開いているすべてのブックを再計算

2.処理ロジック
  上記1.のように「再計算」を都度行う必要がある場合、漏れなく(ミス無く)対応が必要です。
  そのため、過去のプログラムを修正する場合はミスが無いようにしっかりとプログラム内容を理解することが求められます。
  ※しっかりテストすれば良いのかも知れませんが…

3.セルにプログラムで毎回計算式を設定するのなら…
 もしプログラムでセルに毎回計算式を設定するのなら「Application.WorksheetFunction」で計算した方が良いかも知れません。
 初めから計算式を設定するのなら「ユーザに式を触らせないようにシート保護」した方が良いかと思います。
 その場合、プログラムでセルに値を設定する場合、セルに書き込みできるように「シートの保護解除」等が必要になります。

◆VBAとワークシート関数の混同は邪道ではないですが、色々な問題点を意識して、プログラムを作成しないと思わぬ所で
 落とし穴があるかも知れませんので注意が必要ですね。

色々と大変だと思いますが頑張ってください。

「VBAとワークシート関数の混同は邪道」ではないと思います。

ただ次の点を注意する必要があるかと思います。

1.一番大きいのは「処理速度」です。
 ・セルに計算式を設定されていると、EXCELはセルに値を設定するごとに【再計算】が行われしまうことが、処理速度が大幅に低下
  することがあります。
  そのため、プログラムを実行する場合【自動計算】を一時的にストップさせています。
   Application.Calculation = xlManual
   ※処理完了後は「Application.Calculation = xlAutomatic」にしま...続きを読む

QVBA IF文でORを使ったとき後ろの条件が実行されない

下記VBAは特定の行だけ取り出すために組んだマクロの一部ですが、
なぜか.Value Like "W*"の部分が実行されません、
ORの前と後ろを逆にするとやはり前だけしか実行されません。

どこが問題なのでしょうか?
また、"J*"か"W*"以外の行を削除するという文はどう書くのでしょうか?

よろしくお願いします。


For j = Range("A1").End(xlDown).Row To 2 Step -1
With Cells(j, "AB")

If Not .Value Like "J*" Or .Value Like "W*" Then
.EntireRow.Delete
End If

End With

Next j

Aベストアンサー

>If Not .Value Like "J*" Or .Value Like "W*" Then
["J*"か"W*"以外の行を削除する]

これは、排他的論理積の内容ですね。
英米人は、何の問題もなく答えられるけれども、日本人などは、どうしても戸惑ってしまいます。英語には、こういう表現がありますが、日本語には、そういう表現があっても、言葉には正確に表す論理がありません。もし、本格的なプログラミングをおやりになるなら、是非、学ばれたほうがよいです。ベン図を書いて試してみるとよいです。

["J*"*か*"W*"以外の行を削除する]
「か=or(和)」が否定になると「and(積)」に変わると覚えていればよいです。

If Not (UCase(.Value) Like "J*" Or Not UCase(.Value) Like "W*" Then
または
If Not UCase(.Value) Like "J*" And Not UCase(.Value) Like "W*" Then

このように演算子が変わります。

Qボタン一個で表示非表示切り替えマクロについて教えてください。 長文失礼します。マクロ初心者です。 ま

ボタン一個で表示非表示切り替えマクロについて教えてください。
長文失礼します。マクロ初心者です。
まず画面は以下の通りです。

ー A B C ・・
1 取引名 区分 費目
2 ◯システム 前期 円
3 空白 後期 円
4 空白 実績
ーーーーーーーーーーーーーーーーーーーーー
5 ▲システム 前期
6 空白 後期
7 空白 実績
ーーーーーーーーーーーーーーーーーーーーー

・ (★3行ずつ×10〜15コ分続く)
・ (★取引名がないとこは3行とも空白)
ーーーーーーーーーーーーーーーーーーー
20 小計 前期計
21 後期計
22 合計
23 実績計 (★小計欄は4行)
ーーーーーーーーーーーーーーーーーーーーーー
ここまでで1項目、(運用、保守などで区切っています)
次は保守の、同じのが。という風に1000行以上続きます。

別のファイルの取引no.と一致したら費目金額を反映させるマクロを取り込みボタンに設定中なので、
このフォーマットは変えられません。

そして、今回作成しなければならないのが、
表示非表示切り替えボタンです。
3行の一番上に取引名が入り、下2行は空白です。
一番上に取引名が入ってなかったら、以下の3行まとめて非表示/表示を切り替えたいんです。
現状、基本は1項目につき3行ずつ×10ですが
取引名が多数あるものはその分増やしているので統一はしていません。

また、各項目1つでも取引名があれば小計欄は非表示しない。
0だったら小計欄も非表示にする。
というルールです。


先方のお願いは
ボタン一個で、表示をクリックしたら表示され、ボタンの名前は非表示に変わり、非表示をクリックしたら非表示になり、名前は表示に、ということなのですが、


全然できてないのですが、
私が今考えていたコードは

If 切り替え.Caption = ”表示” Then
For i = 2 To LastRow Step 3
★まずここで、3行ずつ回すも、小計欄は4行なのでどうしたらいいのか
続き

If Cells(i,1) <> ”” And _
Cells(i,1) <> ”小計” Then
icnt = icnt + 1
EndIf
値があったらカウントし
後に、icnt>=1 Then
小計欄は残す、という流れをイメージしたのですが…


If Cells(i,1)= ”” Then
Rows(i).Hidden

If Cells(i,1) = ”小計” Then
If icnt>=1 Then
という流れにする場合、
もし残すなら、
次の項目からまたスタートとなるにはどうすればいいのか…
非表示の場合まとめて4行はアクティブセル+3という式にしたらいいのか、、
すみませんがもしよろしければコードをご教示ください。

ボタン一個で表示非表示切り替えマクロについて教えてください。
長文失礼します。マクロ初心者です。
まず画面は以下の通りです。

ー A B C ・・
1 取引名 区分 費目
2 ◯システム 前期 円
3 空白 後期 円
4 空白 実績
ーーーーーーーーーーーーーーーーーーーーー
5 ▲システム 前期
6 空白 ...続きを読む

Aベストアンサー

こんにちは

ご質問文で一番わからないのが、項目と次の項目の間は隙間なく連続しているのか、空白行や再度タイトルが記されていたりしないのかといったことでしょうか。
空白行がある場合は、きちんと行数が決まっているのか、気まぐれに1行だったり2行だったりするのかということ。


はっきりしないので、コードは示せませんが、少しは考え方のヒントにでもなれば・・・

方法はいろいろあると思いますが、ひとまとまりで考える行数が一定ではないので、ご提示のようにFORループで一律にStep 3としたのではうまくいかないと思います。

一例として、調べる対象の行(先頭行)を変数rwとして、順に見ていくものと考えた場合

 rw = 2 '←対象行の初期値
 Do While rw <= LastRow
  If Cells(rw, 1).Value = "小計" Then
   '小計の場合の処理
   ' ~~~
   rw = rw + 4 '←次の行(4でよいのか不明ですが)
  Else
   '3行セットの場合の処理
   ' ~~~
   rw = rw + 3 '←次の行
  End If
 Loop

のような考え方にすれば、対象の行数が異なる場合でも、条件分けして処理をすることで、次に参照する行までの行数を変えることが可能です。
上の例では、小計欄の4行の1行目には必ず「小計」と記されていて、それで識別しても良いとの保証があるものと仮定しています。(取引名には「小計」というものは絶対に存在しないなど)

こんにちは

ご質問文で一番わからないのが、項目と次の項目の間は隙間なく連続しているのか、空白行や再度タイトルが記されていたりしないのかといったことでしょうか。
空白行がある場合は、きちんと行数が決まっているのか、気まぐれに1行だったり2行だったりするのかということ。


はっきりしないので、コードは示せませんが、少しは考え方のヒントにでもなれば・・・

方法はいろいろあると思いますが、ひとまとまりで考える行数が一定ではないので、ご提示のようにFORループで一律にStep 3としたのではうま...続きを読む

Q【エクセル VBA】CSVファイルの結合

以前同じ質問をさせて頂いたのですが、説明不足であったため再投稿いたします。

【エクセル VBA】
VBAを使って複数のCSVを結合させたいのですが、コンマ区切りの値がデータ上に存在するため上手くまとまりません。

バッチ等でまとめる方法ではなく、どうしてもVBAでやらなければならないので、その方法をご教授下さい。

また、結合するCSVはエクセルを開いた時に選択できるようにしたいです。
(特定のファイル上を対象等では無く。)



現在使用しているVBAは以下のものになります。
-----------------------------------------------------

Sub CsvIn()
'CSVファイルの読み込み
Dim CsvFileName As Variant
Dim Li As String
Dim Bf() As String
Dim R As Long
Dim ShMain As Worksheet
Dim FlNo As Integer
Dim FFlNo As Integer

With ThisWorkbook 'シート&パスの設定
Set ShMain = .Worksheets("Sheet1")
ChDrive .Path
ChDir .Path
End With
'複数のファイルの選択を可に設定
CsvFileName = Application.GetOpenFilename _
(filefilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイル選択", MultiSelect:=True)
If VarType(CsvFileName) = vbBoolean Then Exit Sub 'キャンセル時の処置
R = 1 '行の初期値
For FlNo = 1 To UBound(CsvFileName) 'ファイル数分ループ
FFlNo = FreeFile '---使用可能なファイル番号取得
Open CsvFileName(FlNo) For Input As #FFlNo
Do Until EOF(FFlNo) '最終行までループ
Line Input #FFlNo, Li '一行読み込み
Bf = Split(Li, ",") 'カンマで分割し配列に代入
If UBound(Bf) >= 0 Then '空白行の処理を飛ばす
With ShMain '1行分のデータをセルに出力
.Range(.Cells(R, 1), Cells(R, UBound(Bf) + 1)).Value = Bf
End With
End If
R = R + 1
Loop
Close #FFlNo
Next FlNo
End Sub

-----------------------------------------------

参考になりそうなサイト
http://excel-ubara.com/excelvba5/EXCELVBA257.html



よろしくお願いします。

以前同じ質問をさせて頂いたのですが、説明不足であったため再投稿いたします。

【エクセル VBA】
VBAを使って複数のCSVを結合させたいのですが、コンマ区切りの値がデータ上に存在するため上手くまとまりません。

バッチ等でまとめる方法ではなく、どうしてもVBAでやらなければならないので、その方法をご教授下さい。

また、結合するCSVはエクセルを開いた時に選択できるようにしたいです。
(特定のファイル上を対象等では無く。)



現在使用しているVBAは以下のものになります。
------------...続きを読む

Aベストアンサー

No.13 に対する補足コメントについて

ですから!
そのダメな所のデータを数行抜き出したものでCSVファイルを作成して実験してみてください。
それでも症状が出るならばその数行のデータを提示してください。

大変申し訳ないのですが、こちらはそちらの状況が見えないので「特段ルールが異なるようなことはございませんでした。」は、あなたが気づかないだけの場合が多いのでそれを提示していただきたいのです。
「同じ列に似た値があると上書かれてしまうということはありませんでしょうか?」については1文字ずつ「"」「,」が有った時だけ特別な作業をしているだけなので考えにくいです。

もしかしての考えられそうなものとして
・文字コードのせいで1つの2バイト文字が「"」や「,」と何かに分解されてしまっている可能性も有るかもしれません。
・1つの行中で「"」が偶数個でないと誤動作する可能性はあります。
・CSVファイルに特殊な制御コードになりそうな文字が含まれている。
・これは故意にしているのですが空白だけの行は削除していますが問題ないですよね?

とにかく、こちらではそちらの状況が見えないので、ダメな状況を具体的に提示していただけないと実験などが出来ないのです。もしも具体的な提示が出来ないのならばそう言ってください。あなたの事は無視するようにします。
よろしくお願いいたします。

No.13 に対する補足コメントについて

ですから!
そのダメな所のデータを数行抜き出したものでCSVファイルを作成して実験してみてください。
それでも症状が出るならばその数行のデータを提示してください。

大変申し訳ないのですが、こちらはそちらの状況が見えないので「特段ルールが異なるようなことはございませんでした。」は、あなたが気づかないだけの場合が多いのでそれを提示していただきたいのです。
「同じ列に似た値があると上書かれてしまうということはありませんでしょうか?」については1文...続きを読む

QExcelのマクロは管理者でないと実行できませんか

マクロに関してほぼわからないのですが、質問です。

マクロは詳しいけどPCのことはあまり詳しくない人から「マクロは、ユーザーアカウントに管理者権限が付与されていないと実行できないのか」「管理者である事が必要な、何らかのメッセージが表示されて、マクロが実行できない」と質問を受けました。

これは、「マクロの様々な命令のうち、管理者権限を必要とする命令の実行には、管理者権限が必要です」と読み替えて正しいのでしょうか。
なので、管理者権限を必要としないマクロの命令も有る、ということで認識は合っていますでしょうか。

Aベストアンサー

>「マクロは、ユーザーアカウントに管理者権限が付与されていないと実行できないのか」
いいえ。そんなことはありません。VBAマクロは、そういうモードは作れません。
何か、その方は誤解されているように思います。セキュリティの権限は管理者権限ではなく、デジタル署名です。

しかし、古いVBAマクロのように、Program Files のOfficeフォルダに書き込むスタイルは、管理者権限が必要になりますが、特にメッセージはでません。保存されないか、エラーが発生するだけです。

>「管理者である事が必要な、何らかのメッセージが表示されて、マクロが実行できない」
セキュリティの簡易のデジタル署名や、一番高いクラスを通す、デジタル署名(CA付き =商用の証明機関 )のことだと思います。

>「マクロの様々な命令のうち、管理者権限を必要とする命令の実行には、管理者権限が必要です」
私の知っている範囲内では、VBAマクロには、管理者権限で実行する[RUN AS ADMIN]モードは存在しません。

また、デジタル署名(CA付き)は、年間10万円は取られますので、個人ではなかなかコスパが合いません。

>「マクロは、ユーザーアカウントに管理者権限が付与されていないと実行できないのか」
いいえ。そんなことはありません。VBAマクロは、そういうモードは作れません。
何か、その方は誤解されているように思います。セキュリティの権限は管理者権限ではなく、デジタル署名です。

しかし、古いVBAマクロのように、Program Files のOfficeフォルダに書き込むスタイルは、管理者権限が必要になりますが、特にメッセージはでません。保存されないか、エラーが発生するだけです。

>「管理者である事が必要な、何らか...続きを読む

QシフトJISのCSVファイルをUFT-8(BOMなし)のCSVに変換したい

素人ですが、職場で必要に迫られ模索中です。
ご教授お願いします。

ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。
バッチが不可能であればVBスクリプト?(まったくわからないけど)でも結構です。

最終的にはタスクスケジューラに仕込んで毎日定時に、チェックしてシフトJISであった場合、変換をするという動作が理想ですが、とりあえず変換するバッチが作れないので話になりません(;;

敷居が高いかもしれませんが、ファイルがUTF-8であってもエラーとならないように作れるとチェックして云々は不要と思っています。

よろしくお願いします(><

Aベストアンサー

#4の回答者です。

nkf でも、Wscript でも、UTF-8 BOMなし変換は出来ましたが、

Wscript 側は、かなり面倒です、といっても、書いた本人が言うだけで、コピー&ペーストーするだけの話ですが。

結局、#2さんの言う通りになってしまいましたね。(^^;

>ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。

これだけで良いのでは?
-----------------------
Rem to_utf8.bat
@echo off
nkf.exe -w --overwrite %1
echo on
-----------------------SJISで保存すること----
戻すオプションは、 -s です。(sjis) %1の所はファイル名でも可

nkf.exe のありか。
http://www.vector.co.jp/soft/win95/util/se295331.html

》Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
》Copyright (C) 1996-2010, The nkf Project.

富士通がクレジットしているとは知りませんでしたね。

#4の回答者です。

nkf でも、Wscript でも、UTF-8 BOMなし変換は出来ましたが、

Wscript 側は、かなり面倒です、といっても、書いた本人が言うだけで、コピー&ペーストーするだけの話ですが。

結局、#2さんの言う通りになってしまいましたね。(^^;

>ユーザ情報.csvというシフトJISのファイルを、同じフォルダで同一名のファイル、ユーザ情報.csv(UFT-8(BOMなし)に変換するバッチファイルを作成したいです。

これだけで良いのでは?
-----------------------
Rem to_utf8.bat
@echo off
nkf.exe -w --ove...続きを読む

Qexcel vba クラスモジュール 教えて

お世話になります。
excel vba でクラスモジュールを使って処理したいのですが、標準モジュールのクラスのSetのところで、エラー91オブジェクト変数またはwithブロックが設定されていませんのエラーが出て、インスタンスがうまくいかないです。
クラスを使って組むのは初めてなもので、詳しい方のご教示をお願いいたします。
以下コードです。

クラスモジュール
Option Explicit
Dim i As Long
Dim j As Long
Public sh1 As Worksheet

Sub Mycls()
Application.ScreenUpdating = False

i = 8
j = 9

Set sh1 = Worksheets(1)

For i = 8 To 400
Do Until sh1.Cells(i, "F") < sh1.Cells(7, j)
j = j + 1
If sh1.Cells(i, "F") = sh1.Cells(7, j) Then
sh1.Cells(i, j) = "★"
Exit Do
End If
Loop

j = 9

Do Until j = 132
j = j + 1
If sh1.Cells(i, j) = "☆" Then
sh1.Cells(i, j) = ""
Exit Do
End If
Loop

j = 9

Do Until sh1.Cells(i, "G") < sh1.Cells(7, j)
j = j + 1
If sh1.Cells(i, "G") = sh1.Cells(7, j) Then
sh1.Cells(i, j) = "☆"
Exit Do
End If
Loop

j = 9

Next i

End Sub

標準モジュール
Option Explicit
Sub Module1()
Dim ss As New Mycls
Dim sh1 As Worksheet

Set sh1 = Worksheets(1)
Set ss = New Mycls
Set ss = Nothing

End Sub

お世話になります。
excel vba でクラスモジュールを使って処理したいのですが、標準モジュールのクラスのSetのところで、エラー91オブジェクト変数またはwithブロックが設定されていませんのエラーが出て、インスタンスがうまくいかないです。
クラスを使って組むのは初めてなもので、詳しい方のご教示をお願いいたします。
以下コードです。

クラスモジュール
Option Explicit
Dim i As Long
Dim j As Long
Public sh1 As Worksheet

Sub Mycl...続きを読む

Aベストアンサー

クラスモジュールのオブジェクト名を指定してください。
クラスモジュールを開く。
左側、クラスモジュールのプロパティ、オブジェクト名に「Mycls」を設定。

で、標準モジュールの方で、

Set ss = New Mycls
ss.Mycls
としてモジュールを呼び出します。

--
クラスメイトモジュール名が同じは紛らわしいので、特に意味無いなら止めた方が良いかも。
インスタンス作成と同時に、コンストラクタとして処理を行うのであれば、

Public Sub Class_Initialize()
 ~処理~
End Sub

の中で行って下さい。


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

人気Q&Aランキング