トップページtech
1002コメント361KB

Excel VBA 質問スレ Part41©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2016/04/27(水) 04:11:46.79ID:Nk+oP5xR
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part40
http://echo.2ch.net/test/read.cgi/tech/1455817784/

※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 122
http://echo.2ch.net/test/read.cgi/bsoft/1461287268/
0233デフォルトの名無しさん2016/05/14(土) 02:36:02.98ID:TfiX7v5Q
Sheet4を追加して、下のように変えて実行してみたらわかるかも

With Sheet3.Range(
0234デフォルトの名無しさん2016/05/14(土) 02:37:26.14ID:TfiX7v5Q
Sheet4を追加して、下のように変えて実行してみたらわかるかも

With Sheet3.Range("A1").CurrentRegion
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheet2.Range("A1").CurrentRegion, copytorange:=Sheet4.Range("A1")
End With

xlFilterInPlace→xlFilterCopy に変えて
コピー先をSheet4.Range("A1")に指定

Sheet3の表に、Sheet2のフィルタ条件で、フィルタした結果をSheet4にコピーする
0235デフォルトの名無しさん2016/05/14(土) 02:40:15.99ID:KpaRNRq2
>>232
Sheet3にしか存在しない行だけ色無しになりました。
0236デフォルトの名無しさん2016/05/14(土) 02:42:52.92ID:TfiX7v5Q
フィルタが掛かっている状態かもしれないから
フィルタをクリアしてから実行した方が良い
0237デフォルトの名無しさん2016/05/14(土) 02:49:28.56ID:TfiX7v5Q
シート2の1行目はシート3の列名と等しくなっているはず
シート2の列名の下にフィルタ条件が書かれる
コードを実行すると
シート3の表にフィルタが掛けられる
その条件はシート2に書いた列でその下の値を持つ行だけが表示される

.SpecialCells(xlCellTypeVisible).Clear
をしているから、フィルタを掛けた後表示されているセルはクリアされる

その後、showallしてるからフィルタがクリアされる

結果として、フィルタ条件に合わなかった行が残る
0238デフォルトの名無しさん2016/05/14(土) 02:50:25.32ID:NImZCMbB
表示 > マクロ > マクロの表示
で開いているブックのsubが一覧表示されますが、
ここにaddinしているxlaの関数を表示させることはできないでしょうか。

fileName.xla!subName形式で直接入力すれば起動できることは知っています。
0239デフォルトの名無しさん2016/05/14(土) 02:50:51.66ID:KpaRNRq2
>>234
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheet2.Range("A1").CurrentRegion, copytorange:=Sheet4.Range("A1")

で型が一致しませんとでます。
0240デフォルトの名無しさん2016/05/14(土) 03:04:50.16ID:KpaRNRq2
>>237
フィルターはかかってなかったのでそのまま実行できました。
入力間違いがありました。失礼しました。
0241デフォルトの名無しさん2016/05/14(土) 03:12:37.15ID:TfiX7v5Q
>>235
元のコードで
clearしてるコードをコメントアウトして実行すると
フィルタした後に、showalldataするから何も変化しないはず

今度は、showalldataをコメントアウトしたらフィルタが掛かった状態のままになるはず
0242デフォルトの名無しさん2016/05/14(土) 03:15:34.80ID:KpaRNRq2
>>237
なんとなくわかった気がします。
Sheet2の見出しより下が検索条件になり、
Sheet3の中のSheet2にある行だけがSheet4にコピーされました。
それが可視セルになりSheet3の中のそれを消せば、Sheet2に無い行が残るわけですね。
0243デフォルトの名無しさん2016/05/14(土) 03:21:50.26ID:TfiX7v5Q
>>238
public sub xlacall()
call fileName.xla!subName
end sub
みたいなのを作るとか
0244デフォルトの名無しさん2016/05/14(土) 03:32:07.92ID:KpaRNRq2
>>241
.ShowAllDataをコメントアウトして実行してから、またコメントアウトをとったら、
実行時エラー 1004 ShowAllDataメソッドは失敗しました。Worksheetオブジェクト
と出るようになてしまいました。
0245デフォルトの名無しさん2016/05/14(土) 07:39:07.00ID:hiszDsJf
>>217
エスパー回答してみると

イントラとインターネットゾーン等でのIE8以降機能の整合性レベルが切り替えにたいする考慮をしていない
 対策:Set objIE = CreateObject("InternetExplorer.Application")を
     Set objIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")にする。
0246デフォルトの名無しさん2016/05/14(土) 10:13:09.39ID:NImZCMbB
>>243
せっかくいろんなファイルで利用できるようにライブラリ化したのに、
毎回それつくるっていうのが面倒で質問に来ました。
xla化せずに必要な関数をすべて入れたブックを毎回開けばよくはあるのですが、
xlaってこんなに不便なものか?何かやりようがあるんじゃないか?と思って
調べたもののまったく見つからずにいます。
0247デフォルトの名無しさん2016/05/14(土) 10:17:33.94ID:TfiX7v5Q
>>246
xlaの方でアドイン先のブックにxlaのプロシージャを呼び出すボタンとかを作る様にすれば良いのでは?

ブックにアドインしたら、そのブックにボタンが作成される感じ
0248デフォルトの名無しさん2016/05/14(土) 10:57:07.14ID:psfsGv+B
>>246
VBE窓からだったら
ツール (T) > マクロ (M) > マクロの場所(A) で アドインを選べばいいんだけどね
シートからだとわからん
0249デフォルトの名無しさん2016/05/14(土) 12:37:14.30ID:GIbFGwdT
>>246
俺はアドインに関数を呼び出すフォームのリボンを作ってる
02502462016/05/15(日) 00:45:01.97ID:YpwUXGuD
みなさんありがとうございます。

>>249
こういう方法があったんですね。
調べてみましたが、これで希望通りの挙動にできそうです。
ありがとうございました。
0251デフォルトの名無しさん2016/05/15(日) 14:26:01.12ID:WcH5yz8P
特定のセルに
2016/05/15
という年月日が入っています。
このセルを含むシートをVBAを使ってCSVに吐き出すと
#2016-05-15#
この様に表示されてしまうのですが、
そのまま年月日で吐き出されるようにコントロールできませんでしょうか。
0252デフォルトの名無しさん2016/05/15(日) 15:19:13.14ID:CrVPkhRD
>>251
何を使ってCSV出力しているか知らないから
Write ステートメントを使用していると仮定して・・・
日付型 (Date) のデータは、共通日付形式を使用して
書き込まれるので日付型を文字列にする必要がある

セル表示形式のテキストをそのまま出力したいなら
Range.ValueではなくRange.Textプロパティを使う

FileNumber = FreeFile
Open "d:\test.csv" For Output As #FileNumber
Write #FileNumber, Cells(1, 1).Text
Close #FileNumber
0253デフォルトの名無しさん2016/05/15(日) 15:19:48.19ID:ghf3z0AO
そりあえずそのコードを貼ってよ
0254デフォルトの名無しさん2016/05/15(日) 15:38:07.34ID:WcH5yz8P
>>252-253
ネットにあったコードをコピペをそのまま使って試してみました。
Cells(i, 3)が年月日で、上手く表示されません。

Sub writeCSVFile_Click()
  '変数宣言
  Dim filePath As String
  Dim i As Long
  Dim maxRow As Long
  Dim fileNo As Integer

  '初期値設定
  filePath = ActiveWorkbook.Path & "\data.csv"
  maxRow = Range("A1").End(xlDown).Row '最終行取得
  fileNo = FreeFile 'FreeFile関数で使用可能なファイル番号取得

  'ファイル開く
  Open filePath For Output As #fileNo

  '最終行までループ
  For i = 1 To maxRow
    '列の数は決め打ち
    Write #fileNo, Cells(i, 1), Cells(i, 2), Cells(i, 3)
  Next i

  'ファイル閉じる
  Close #fileNo
End Sub
0255デフォルトの名無しさん2016/05/15(日) 15:44:13.67ID:tUFMlsQK
>>254
出力じゃなくて表示なの?
意味がわからない
0256デフォルトの名無しさん2016/05/15(日) 15:47:23.68ID:WcH5yz8P
>>255
わかりにくくてすみません。
上記でExcelからCSVに書き出した時に # が入ってしまいます。
0257デフォルトの名無しさん2016/05/15(日) 15:53:44.82ID:6V2nRwSD
>>254
>>252で答えが出てる
0258デフォルトの名無しさん2016/05/15(日) 16:09:42.68ID:UAuTMPBr
ところがTextプロパティには致命的な弱点が
0259デフォルトの名無しさん2016/05/15(日) 16:13:29.08ID:WcH5yz8P
>>257
ありがとうございました。
Cells(i, 3).Text
該当箇所をこの様に書き換えただけで直りました!
0260デフォルトの名無しさん2016/05/15(日) 20:06:14.39ID:ghf3z0AO
Excelで機械のデータシート表を作っていましてカッコ付きに変換するマクロを書きましたが

数字だとマイナスに  ex. 123 -> -123
和暦だと西暦に
0261デフォルトの名無しさん2016/05/15(日) 20:10:37.37ID:ghf3z0AO
Excelで機械のデータシート表を作っていまして楽をするためにカッコ付きに変換するマクロを書きましたが
数字だとマイナスに  ex. 123 -> -123
和暦だと西暦に  ex.平成28年1月1日 -> (2016/01/01)
なってしまいます
文章文字列などならうまくいくのですがどのようにマクロを書いたらいいのでしょうか

Sub 括弧()
ActiveCell.Value = "(" & ActiveCell.Value & ")"
End Sub
0262デフォルトの名無しさん2016/05/15(日) 21:15:44.76ID:+ceGV5qA
>>261
Sub 括弧()
With ActiveCell
  txt = .Text  '書式変更前の表示テキスト確保(通貨など)
  If IsNumeric(.Value) Then
    .NumberFormat = "@"
  End If
  .Value = "(" & txt & ")"
End With
End Sub
0263デフォルトの名無しさん2016/05/15(日) 21:26:13.47ID:ghf3z0AO
>>262
めっちゃスマートに書いてくださってありがとうございます
日付の場合数字の場合など複雑に考えて手をこまねいていました
0264デフォルトの名無しさん2016/05/15(日) 21:33:39.41ID:iEYIRe/o
すいませんエスパーの方お願いします。

ボタンをクリックしたらあるセルをハイパーリンクにしたいのですが
Cells(2, "B") = "=HYPERLINK('test')"

これだけで400エラーが出ます。なぜなのでしょうか
0265デフォルトの名無しさん2016/05/15(日) 21:39:01.79ID:U6OCYZVH
B2セルに直接 =HYPERLINK('test') と入力してもエラーになりませんか
0266デフォルトの名無しさん2016/05/15(日) 22:09:37.23ID:iEYIRe/o
>>265
ありがとうございますm(__)m
シングルクォーテーションがいけなかったんですね
ほんとは変数を付けてURL作ってたので他言語の癖でダブルとシングル両方使わないといけないと思ってました
0267デフォルトの名無しさん2016/05/17(火) 19:14:32.23ID:Ju7Z8cl/
If文が大量になってしまいまとめたいのですが、

For i To Lastrow ※Sheet3の最終行
 Set fnd = (Sheet2.Columns(2).Find(Sheet3.Cells(i,2)))
if Not (fnd Is Nothing) Then
  if Sheet3.Cells(i,1) = Sheet2.Cells(fnd.Row,1) Then
Else
Sheet3.Cells(i,1)interior.ColorIndex = 3
End if
 if Sheet3.Cells(i,2) = Sheet2.Cells(fnd.Row,2) Then
Else
Sheet3.Cells(i,2)interior.ColorIndex = 3
End if
 if Sheet3.Cells(i,3) = Sheet2.Cells(fnd.Row,3) Then
Else
Sheet3.Cells(i,3)interior.ColorIndex = 3
End if

         ・

  if Sheet3.Cells(i,20) = Sheet2.Cells(fnd.Row,20) Then
Else
Sheet3.Cells(i,20)interior.ColorIndex = 3
End if
  Else
  Sheet3.Cells(i,2).EntireRow.Interior.ColorIndex = 4
End If
Next i
という風にしているのですが、もう少しまとめらないかと思いました。
まとめられるのでしょうか?
0268デフォルトの名無しさん2016/05/17(火) 19:17:20.83ID:Ju7Z8cl/
if Sheet3.Cells(i,2) = Sheet2.Cells(fnd.Row,2) Then
Else
Sheet3.Cells(i,2)interior.ColorIndex = 3
End If
はいらなかったです。失礼しました。
0269デフォルトの名無しさん2016/05/17(火) 20:15:20.61ID:YEbHD3bH
switch文使うとか?
0270デフォルトの名無しさん2016/05/17(火) 20:24:22.15ID:Ju7Z8cl/
>>269
switch文とはどのように使うのでしょうか?
今調べて見てるのですが・・・
0271デフォルトの名無しさん2016/05/17(火) 20:33:31.31ID:uw1YLM9D
>>267
せめて Then Else は条件逆にしたら?

> For i = ? To Lastrow ※Sheet3の最終行
>  Set fnd = Sheet2.Columns(2).Find(Sheet3.Cells(i,2))
>  If Not (fnd Is Nothing) Then
>  If Sheet3.Cells(i,1) <> Sheet2.Cells(fnd.Row,1) Then
>    Sheet3.Cells(i,1).Interior.ColorIndex = 3
>   End If
>  If Sheet3.Cells(i,2) <> Sheet2.Cells(fnd.Row,2) Then
>    Sheet3.Cells(i,2).Interior.ColorIndex = 3
>   End If
>  If Sheet3.Cells(i,3) <> Sheet2.Cells(fnd.Row,3) Then
>    Sheet3.Cells(i,3).Interior.ColorIndex = 3
>   End if
>      ・
>      ・
>      ・
>   If Sheet3.Cells(i,20) <> Sheet2.Cells(fnd.Row,20) Then
>    Sheet3.Cells(i,20).Interior.ColorIndex = 3
>   End if
>  Else
>   Sheet3.Cells(i,2).EntireRow.Interior.ColorIndex = 4
> End If
> Next i
0272デフォルトの名無しさん2016/05/17(火) 20:35:42.07ID:Ju7Z8cl/
>>271
そうでした。申し訳ありません。
わざわざ=で、Elseを入れる意味はないですね。
その上で、このIf文をもう少しまとめる方法はないでしょうか?
0273デフォルトの名無しさん2016/05/17(火) 21:09:16.27ID:Bh5kVr4X
この内容だと単純にループで回せば出来そうだけど

For i = 1 To Lastrow '※Sheet3の最終行
  Set fnd = (Sheet2.Columns(2).Find(Sheet3.Cells(i, 2)))
  If Not (fnd Is Nothing) Then
    For j = 1 To 20 '★1列目から20列目まで?
      If Sheet3.Cells(i, j) <> Sheet2.Cells(fnd.Row, j) Then
        Sheet3.Cells(i, j).Interior.ColorIndex = 3
      End If
    Next
  Else
    Sheet3.Cells(i, 2).EntireRow.Interior.ColorIndex = 4
  End If
Next i
0274デフォルトの名無しさん2016/05/17(火) 21:29:43.68ID:kv5Z22Gc
>>270
switch文はif then elsif elsif ...
に相当するものだった

列も2〜20までforで回したら?
for i to lastrow
for j = 2 to 20
if 条件 then
endif
next j
next i
0275デフォルトの名無しさん2016/05/17(火) 21:35:27.61ID:Ju7Z8cl/
>>273
Set fnd = (Sheet2.Columns(2).Find(Sheet3.Cells(i, 2)))
  If Not (fnd Is Nothing) Then
の部分をFor j = 1 To 20 の中に入れてましたが、
よく考えたら、一度検索して見つかったらその行を確認していってるので、
中に入れてたら、何度もヒットさせる余計な処理になってしまってました。
ありがとうございました。
0276デフォルトの名無しさん2016/05/17(火) 21:42:55.17ID:Ju7Z8cl/
>>274
ありがとうございました。
それだけでよかったですね。
0277デフォルトの名無しさん2016/05/19(木) 15:21:44.50ID:hJ/G9SOx
FindのAfterという引数を変数で指定した場合、変数にはセルの値が入っているとして、
その値が入っているセルの位置情報が記憶され、そこから検索がかかるという認識で
よいのでしょうか?
0278デフォルトの名無しさん2016/05/19(木) 16:33:50.64ID:oZsWPLv6
ここに書いてある通り
https://msdn.microsoft.com/ja-jp/library/office/ff839746.aspx
google とかでexcel vba find とか検索すれば出てくる
0279デフォルトの名無しさん2016/05/20(金) 17:13:57.06ID:P6F1ZDVP
>>278
ID変わりましたが、返信遅くなりました。
そこは見ているのですが、何故変数にはセルの値が入っているのに、セルの場所を指定した事になるのかと思いまして、質問させていただきました。
0280デフォルトの名無しさん2016/05/20(金) 18:50:53.92ID:gsWAgsom
>>279
FindのAfterは値じゃなくて、セル範囲の情報なども含むRangeオブジェクトだよ
Findの戻り値も同じくRangeオブジェクトになる

Rangeオブジェクト
https://msdn.microsoft.com/ja-jp/library/office/ff838238.aspx
0281デフォルトの名無しさん2016/05/20(金) 21:49:54.04ID:d/ZNR8o9
コンソールで
?"a"&"b"

ab
と出力されますが
?"a"&1

a 1
と出力されます
なぜ半角スペースが交じるのでしょうか?
0282デフォルトの名無しさん2016/05/20(金) 22:04:33.27ID:RvnBIaae
>>281
? "a"&10
a 8
? "a"&100
a 64
? "a"&1000
a 512

後はわかるな?
0283デフォルトの名無しさん2016/05/20(金) 22:14:31.20ID:d/ZNR8o9
>>282
すいません、さっぱりわかりません。
? 100
100
? "a" & 100
a100
?"a"&100
a 64
?"a100"
a100
?"b"&100
b 64
?"x"&100
x 64

010が2byteで64かなーというのは想像できますが、
何故こうなるのでしょうか
0284デフォルトの名無しさん2016/05/20(金) 22:20:25.08ID:Pie8/Dil
>>281
?"a"&1  を
?"a" & 1 のように
&の前後に空白を入れてやれば"a1"と出力される

試しにコード上で
Debug.Print "a"&1   と&の前後に空白なしで記述すると
Debug.Print "a"; &O1 に自動変換されるので

おそらく文字型と数値型の2つの型のデータが出力されている
数値型データの場合、先頭に空白が入る模様
0285デフォルトの名無しさん2016/05/20(金) 22:33:41.48ID:d/ZNR8o9
>>284
なるほど
&N01
&P01
ではだめで
&O01
でいいのは何ででしょう?
0286デフォルトの名無しさん2016/05/20(金) 22:39:11.93ID:Pie8/Dil
先頭 &O の数値は8進数
先頭 &H の数値は16進数
0287デフォルトの名無しさん2016/05/20(金) 22:39:59.19ID:RMEVZVQK
>>285
&O は8進数
0288デフォルトの名無しさん2016/05/20(金) 22:50:42.69ID:d/ZNR8o9
>>286-287
ありがとうございます!
こういうのは数値リテラルというのでしょうか?
0289デフォルトの名無しさん2016/05/20(金) 23:18:49.15ID:V/0gJxiW
?"a"&100*-1
a-64
0290デフォルトの名無しさん2016/05/21(土) 01:56:41.84ID:DHWj1BOs
>>284
>数値型データの場合、先頭に空白が入る模様
先頭は符号。正の符号が空白で表されてる
0291デフォルトの名無しさん2016/05/21(土) 18:06:47.94ID:8UwytgDT
質問です。
Min,max関数で最小、最大値を求める作業を複数のcsvファイルで行いたい場合どのようにすべきでしょうか?
具体的には=max(a2:a56)という動作をを1000個のcsvファイルに対してまとめて行い、各csvファイルの最大値を1つのファイルにまとめる動作を行いたいです。
1000個csvファイルのデータの位置(a2:a56)は同じです。
このような動作を行うマクロは組むことができるのでしょうか?
Vba始めてばかりなので間違いなどあればすみません。
0292デフォルトの名無しさん2016/05/21(土) 18:31:55.59ID:3PJd0Iym
>>291
マクロの記録をしてそれを繰り返せば良い
0293デフォルトの名無しさん2016/05/21(土) 19:00:55.32ID:2DvXotsF
>>280
またIDが変わってしまったのですが質問者です。
申し訳ありません。そのセル範囲を含む情報が含まれるということは、
どういうことなのでしょうか?
例えば、1列目を指定してFindで検索し、
検索した結果見つかったセルの値をaに入れたとします。
1列目に検索したいものが複数あり再検索したい場合、
再度、Findを記述するかFindNextでAfterにaを指定すると思いますが、
そのaのセル範囲を含む情報というのは、何を示しているのでしょうか?
0294デフォルトの名無しさん2016/05/21(土) 21:23:45.26ID:a3pocFu9
>>293 ('A`)

Dim a As Range
Set a = Range("A1:A10").Find("検索文字列")
 ↑で、A1のセルがヒットしたとする場合
 ↓下記と同義のRangeオブジェクトが変数aに設定される
Set a = Range("A1")

Range プロパティ (Excel)
https://msdn.microsoft.com/ja-jp/library/office/dn301006.aspx

で、Rangeオブジェクトにはセルに関するいろんなプロパティを保持している
a.Value   '<-セルの値(既定プロパティ)
a.Address  '<-セルの参照範囲
a.Row    '<-セルの行番号
a.Column  '<-セルの列番号


Findメソッドがどのプロパティを参照しているかは知らないが
Afterに指定されたセル(※Rangeオブジェクト)の行番号、列番号
もしくはアドレスから次の検索セルを判断していると思われる
0295デフォルトの名無しさん2016/05/21(土) 21:53:40.84ID:2DvXotsF
>>294
F8やF5で実行を止めながら確認しても、aには値しか見えないですが、
実はRangeオブジェクトが入っているという事なのですね。

それはExcelの仕様という事なのでしょうか?
0296デフォルトの名無しさん2016/05/21(土) 22:46:05.51ID:a3pocFu9
>>295
変数の詳細な内容が見たいなら
ローカルウィンドウ なり ウォッチウィンドウ で確認するといい

Excel VBA 入門講座 ローカルウィンドウ
http://excelvba.pc-users.net/fol8/8_2.html
Excel VBA 入門講座 ウォッチウィンドウ
http://excelvba.pc-users.net/fol8/8_3.html
0297デフォルトの名無しさん2016/05/21(土) 22:47:52.19ID:DHWj1BOs
>>295
それデフォルトプロパティが見えてるだけ
ちゃんとウォッチ式追加してウォッチウィンドウで見てみろ
0298デフォルトの名無しさん2016/05/21(土) 23:20:54.65ID:2DvXotsF
>>296 
>>297
了解しました。ありがとうございます。
今確認してみてるのですが、
列指定してFindし、その結果を元に再検索に再度FindのAfterで
最初の検索結果を指定しその次から検索していますが、
空白が指定された場合、ちゃんと表の範囲内を検索し、
先頭に戻ってくれているのは確認できました。
結果としては非常にありがたいのですが、何故そうなるのかがわかりません。
列は指定しましたが、表の範囲は指定していないのに・・・
0299デフォルトの名無しさん2016/05/22(日) 01:20:39.82ID:RVVHScN0
この先延々と質問が続くのかな
0300デフォルトの名無しさん2016/05/22(日) 01:38:56.00ID:vMk8bbvq
もちのロン
0301デフォルトの名無しさん2016/05/22(日) 02:16:59.30ID:aOwEm8Rg
>>299
>>300
質問者ですが、この件に関してはこれで最後にします。
申し訳ありません。
0302デフォルトの名無しさん2016/05/22(日) 09:40:44.20ID:vMk8bbvq
質問スレなんだから、
質問すればよろし

回答するスレではないんで、
回答するのは気分次第だけどな
0303デフォルトの名無しさん2016/05/22(日) 10:36:35.32ID:F3XVlBde
ググったり色んな本読んで調べたんですが、解決しなかったんで質問させてください

Application.Dialogs(xlDialogSendMail).〜

でアクティブブックをそのまま.xlsmとして添付メールすることはできるのですが、送り先にxlsに変換して送りたいです
FileFormat的な処理をしてワンクッション無しでそういった事を、するのは可能でしょうか?
宜しくお願いします
0304デフォルトの名無しさん2016/05/22(日) 11:40:55.24ID:viRK9kIz
>FileFormat的な処理をして
>xlsに変換して
>アクティブブックを〜ことはできる
>ワンクッション無しで

ワンクッションとは?
0305デフォルトの名無しさん2016/05/22(日) 12:37:39.34ID:F3XVlBde
>>304
コマンドボタンワンクリックで済ませたいので、一つのイベントプロシージャに収めたいという事です
もし別の処理をしないと不可能だという事でしたら、もう一つボタンを追加したりして対応したいと思いますが、何かいい方法がありましたらご教授お願いします
0306デフォルトの名無しさん2016/05/22(日) 12:55:07.15ID:MkPG05kK
>>291
素人だけど書いてみた Excel2003/Vistaで動作確認
http://codepad.org/h9iBcEZo
1列目のある範囲の最大値だけなんでCSVをワークシートへは取り込んでない
動作おかしかったらリスト読んで適当に直して
0307デフォルトの名無しさん2016/05/22(日) 14:00:36.34ID:uwOrwjCq
>>305
SaveAsで一旦.xls(xlExcel8形式あたり)で保存してから送信すれば行けるんじゃね
0308デフォルトの名無しさん2016/05/23(月) 19:14:37.25ID:+L6Gybj9
ExcelでInterfaceを使用して多重実装って行うことは出来ますか?
0309デフォルトの名無しさん2016/05/23(月) 20:04:34.59ID:fFz6fB8+
>>308
あんた・・・それは
やめた方が
いいな!
0310デフォルトの名無しさん2016/05/23(月) 23:02:51.54ID:EBQbKa6e
>>309
自己解決したのですが
ちなみに止めた方がいい理由って何ですか?
気になります
0311デフォルトの名無しさん2016/05/23(月) 23:05:46.46ID:OgrQhKAM
どう解決したかの方が気になります
0312デフォルトの名無しさん2016/05/23(月) 23:40:18.70ID:fFz6fB8+
>>310
もう考えない方がいい
どうしてもだ!
スレの住人として
忠告する!
じゃあ俺は
これで・・・またな
0313デフォルトの名無しさん2016/05/23(月) 23:44:12.90ID:zjNqCcoU
>>311
結論からいうとできました
Implements は複数設定できるので
後はそれぞれのインターフェースを
実装すれば良いだけでした
0314デフォルトの名無しさん2016/05/25(水) 19:58:38.92ID:vZFTiHPJ
>>292
亀レスすみません。
マクロの記憶だと作業中のファイルのみしかマクロが機能しないのでは無いでしょうか?
また、1000個のファイルに対して一つ一つマクロ実行するのは大変なので、1000個のcsvファイルの最大値を一つのファイルにまとめる作業を、一度に出来る方法は無いのでしょうか?
0315デフォルトの名無しさん2016/05/25(水) 20:22:35.58ID:tfoRBKUB
>>314
対象が同じフォルダに入っているファイル全部とかだったら別にどうってことなくね?
0316デフォルトの名無しさん2016/05/25(水) 20:48:22.69ID:RqoGasre
作りの簡単なcsvっぽいしExcel使うよりJSとかVBSとかPoweSellとかPythonとかRuby使った方が早そう
0317デフォルトの名無しさん2016/05/25(水) 21:45:43.06ID:1qBlGVzr
>>315
レスありがとうございます。
315さんの言う通り、対象は同じフォルダに入ってるファイルすべてです。
どうってこと無いというのは、やり方が簡単という事でしょうか?
宜しければ、マクロの記憶を繰り返す以外にもう少し具体的に教えていただければ幸いです。簡単な例文や使用すればいい関数など...
最近vbaを始めたばかりで、まだrangeやif文を習った程度の知識でして...
あと、拡張子にcsvが付いてたのでcsvファイルと言ってたのですが、対象となるのは普通のエクセルのファイルです。


>>316
ありがとうございます。
検討してみます。
0318デフォルトの名無しさん2016/05/25(水) 22:41:50.45ID:enDBv6qD
>>317
拡張子がcsvのファイルをテキストエディタで開いてみたら?

excel vba for
をググって繰り返しのやり方を調べる

試しに3個のファイルを対象にして作ってみる
0319デフォルトの名無しさん2016/05/25(水) 23:17:20.71ID:CznCF+TX
>>314
1度にやる方法は無いかと言われれば
無いこともないけど、本当にその方法が有効かはまた別問題。

例えばADO接続でCSVファイルからSQLで値を取得するときは
フォルダがDB、その中にある各CSVファイルがテーブル扱いになるので、
そのフォルダ内の対象になるCSVファイル名を先に全て取得しておいて
SQLでUNIONで繋げておけばできるけど、
本当にそれが速くて簡単かは相当疑問が残るよね。
0320デフォルトの名無しさん2016/05/25(水) 23:21:01.56ID:Uf48Qhpg
>>317
とりあえず、1つのファイルに対する処理を完成させる

後はループ処理で更新するファイルを変えつつ↑の処理を繰り返す

ところでループ処理は判ってんの?
do until とか
0321デフォルトの名無しさん2016/05/25(水) 23:39:18.00ID:tfoRBKUB
> そのフォルダ内の対象になるCSVファイル名を先に全て取得

もしかしてこれがネック?
03223172016/05/25(水) 23:42:26.41ID:1qBlGVzr
レス頂いた方々、ありがとうございます。
ご回答いただいた方法で試してみます。
0323デフォルトの名無しさん2016/05/26(木) 00:10:51.15ID:tOkM+sU0
>>314
306に書いたんだけど動かなかったの?
ファイル名の取得は306のプロシージャでできるはず
csvじゃなくてxlsを読むならfunctionのところを自分なりに書き換えろ
0324デフォルトの名無しさん2016/05/26(木) 03:19:58.19ID:tOkM+sU0
>>314
xls読込みの追加と306でのcsv読込関数の訂正をあげとく
http://codepad.org/syUhdaGh
ExecuteExcel4Macro って命令使うともっと早くなるらしいけど
俺にはうまく使えなかった
CSVの方が早いので用意できるならCSVファイルで処理した方がいいと思う
他の人も言ってる様にスクリプトなんかも使いやすいし
0325デフォルトの名無しさん2016/05/26(木) 07:35:57.45ID:yzIVgV2w
>>324
>ExecuteExcel4Macro って命令使うともっと早くなるらしいけど

Microsoftからとっくにサポート打ち切られているようなの持ち出すのやめれ
0326デフォルトの名無しさん2016/05/26(木) 08:48:16.33ID:EV8ndBzb
2007あたりでマクロの記録で一部ExecuteExcel4Macroが記録される
ってあったようだけど、今は無くなってる?
0327デフォルトの名無しさん2016/05/26(木) 10:01:25.13ID:tOkM+sU0
>>325
>Microsoftからとっくにサポート打ち切られているようなの
ここなんかは Office 2013 and later って書いてるけど今は打ち切られたのか?
https://msdn.microsoft.com/ja-jp/library/office/ff193589.aspx
0328デフォルトの名無しさん2016/05/26(木) 14:46:41.03ID:TLCYm3V6
最近VBAを勉強し始めた初心者です。
参考書に、離れた行や列を非表示にするにはRangeプロパティのあとにEntireを使いましょうとあります。
RangeプロパティのあとにいきなりRows.Hidden=Trueとしても意図していた作業ができるのですが、Entireはなぜ必要なのでしょうか。
0329デフォルトの名無しさん2016/05/26(木) 15:31:24.30ID:UrTJJdUS
>>325
>>327書いたんだけど ExecuteExcel4Macro って互換性維持の為だけにあるみたいなんだね
後々使えなくなるって意味で言ってたって事がようやく理解できた
変な事書いてすまんかった
0330デフォルトの名無しさん2016/05/26(木) 15:44:42.47ID:Dvh4dhBn
>>328
安全のためだからできるんならいらないんじゃね
0331デフォルトの名無しさん2016/05/26(木) 20:16:50.15ID:lgiuDAuh
>>328
Rowsは連続した行しか指定できないけど、EntireRowsは離れた行を指定できるからじゃね。
0332デフォルトの名無しさん2016/05/27(金) 01:04:42.25ID:gB8QuuHH
>>328
Hiddenに関しては特に問題ないだろうけど、
部分的なセル範囲を含む“行全体”を厳密に扱いたいなら
EntireRowの方が安全かな

Debug.Print Range("A1:A3").EntireRow.Address
 → $1:$3
Debug.Print Range("A1:A3").Rows.Address
 → $A$1:$A$3
Debug.Print Rows("1:3").Address
 → $1:$3
■ このスレッドは過去ログ倉庫に格納されています