Excel VBA 質問スレ Part64

■ このスレッドは過去ログ倉庫に格納されています
2019/12/02(月) 23:43:54.18ID:ngrqyTy20
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part63
https://mevius.5ch.net/test/read.cgi/tech/1568630099/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/12/04(水) 13:01:40.27ID:T2HYa+hHx
>>18
返す
直線を代入
このあたりの表現の曖昧さでひっかかるかどうかが初心者に留まる人と上級者になれる人の違いってことだわな
2019/12/04(水) 14:05:40.23ID:95sMFvbJ0
>>21
スクショ取った後じゃないとダメなの?
別にスクショ取らなくても取得できるんだが。
勿論スクショ取った後に、そのスクショの任意座標の画素値も取得できる。
2019/12/04(水) 14:06:26.73ID:95sMFvbJ0
>>21
シートに画像貼り付けとか必要無い。
2019/12/04(水) 18:01:03.06ID:pTwF3wZxd
>>23
やりたいこととしては、囲碁やオセロなどのゲーム中に、盤面をリアルタイムにスクショ等をして、そこから各座標の色を読み込むことで盤面をデータ化するという流れなのですが、画像保存の手間を省けるのであれば教えて頂きたいです。
dataobjectだとgettextでテキストのクリップボードは読み込めるのですが、スクショだとできませんでした、、
2019/12/04(水) 20:05:12.18ID:RAKlTKsZ0
>>25
いちいちクリップボードにスクショを入れなくても、ゲーム画面のデバイスコンテキストがわかれば、自由にピクセルの色を調べたり、逆にピクセルを書き込んだりできる
http://excel.syogyoumujou.com/memorandum/get_dc.html
2019/12/04(水) 20:36:16.46ID:M9X3+qe90
>>26
デバイスコンテキストなるものがあるのですか、、知らない概念でした、、
スクショ取るのは余計なステップだったのですね。素人にはこの発想しかなかったです
難しそうでまだざっとみただけですが、画面の画像認識系の自動化はこのやり方が基本なのですかね。
ゆっくり読んでやってみます!ありがとうございます
2019/12/04(水) 20:46:11.63ID:M9X3+qe90
ちなみにスクショでも可能とありましたが、その際はdataobjectではなく同様にwin32apiの何かを使うことになるのでしょうか
2019/12/04(水) 21:17:45.91ID:le08Bijgx
gdiplus.dllを使う感じかな
2019/12/04(水) 21:46:06.48ID:z+3QCMVld
>>27
>>26のリンク先に殆ど書いてある。
指定座標のピクセル値を取得するなら他にGetPixelを使う。
ただ、こいつは遅い。
大量に取得するならgdiplus系のGetPixel使った方が速いけど、そこまでする必要は無いかと思う。
どっちにしてもこの辺が自在に扱えるなら間違いなく上級者だね。

>>29
>>26のリンク先の内容で行くならgdiplusじゃない。
2019/12/04(水) 21:57:16.24ID:M9X3+qe90
>>29>>30
ある程度の範囲の取得になると方針が変わるのですね、、
とりあえずまずはリンク先のやり方を勉強してみることにしてみます。
ご丁寧にありがとうございます。
2019/12/06(金) 08:56:17.67ID:jTNEW24Lx
VBAスレの方でも質問させていただいたのですが、こちらのスレにも詳しい方がいらっしゃるようなので、質問させてください

Exchange / Outtlook VBAの質問です
初歩的な質問で申し訳ありません

任意の名前を持つ配布リストや連絡先グループに属するExchangeユーザーのSMTPアドレスの一覧を取得するにはどうしたら良いのでしょうか

配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません

なお配布リスト、連絡先グループいずれも個人ユーザーのみが登録されている前提なので、再帰によるメンバー取得は不要な状況です
2019/12/06(金) 12:30:08.82ID:G0zfLpZEM
>>32
> 配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません
その部分のコード貼れよ
2019/12/06(金) 18:27:30.78ID:c6fF/5cl0
yokokara
2019/12/06(金) 20:54:35.91ID:Nvs1NFCt0
>>32
先に質問した方でちゃんと断ったん?
2019/12/06(金) 21:19:32.34ID:CNjj6fiz0
outlookを使わなければならないような身の上には同情する
さすがに人少なそうだしいいんじゃないかな
俺はoutlook自体持ってないから良くわからないや。あれまだあるのか
2019/12/06(金) 21:25:37.04ID:I1is1QTTM
今のOutlookは使いやすくなってるよ
俺の中のOutlookは2000で止まってたから久々に使うことになってびっくりした
もはや別物
2019/12/06(金) 21:33:39.56ID:CNjj6fiz0
そうなのか?
大変そうだしoutlook入ってるし使ってみるか、と思ったらメールアドレスが必要なので諦めた
頑張って!
2019/12/06(金) 22:46:30.30ID:Nvs1NFCt0
2013時点ではまだ使いにくい…
40デフォルトの名無しさん (オッペケ Src1-paXL)
垢版 |
2019/12/08(日) 04:18:02.80ID:b513l43Er
正直メール関係でマクロは怖いな
ローカルでサーバ建ててテストするならともかくExchangeでいきなり本番環境でしょ?
2019/12/08(日) 09:25:05.41ID:om5egmGHx
アカウント情報やOutlookアイテムの読み取り、アイテムダウンロードだけならExchange環境でのマクロ使用を恐れる理由はないかと思う
2019/12/08(日) 16:03:51.58ID:Bl/pyruh0
すみません、お力を貸して頂きたいです。超初心者です。

固定長形式テキストデータを読み込んでExcelに落としたいのですが、ファイルの名前がその時によって違うので、下記のようにファイル名固定ではなく、
”C:\test\"をオープンさせてその中から選択したテキストデータを読み込むようにしたいです。
試行錯誤しているのですが、作成完了まで時間がなく基礎的な知識も足りず、、 そのように書き換えて頂けないでしょうか;;

Sub READ_test()
Const cnsFILENAME = "\test1.txt"
Dim FSO As New FileSystemObject ' FileSystemObject
Dim TS As TextStream ' TextStream
Dim GYO As Long ' 収容するセルの行
Dim strREC As String ' レコードを収容する変数

' 指定ファイルをOPEN(入力モード)
Set TS = FSO.OpenTextFile(ThisWorkbook.Path & cnsFILENAME, ForReading, False)
' 2行目から開始
Rows("2:65536").ClearContents
GYO = 2
Do Until TS.AtEndOfStream
' レコードの読み込み(改行発見までの可変長⇒Ascii変換)
strREC = StrConv(TS.ReadLine, vbFromUnicode)
' 1レコード分のセルへのセット
Call GP_EDIT_FixLngRec(strREC, GYO)
' 行を加算
GYO = GYO + 1
Loop
' 指定ファイルをCLOSE
TS.Close
Set TS = Nothing
Set FSO = Nothing
End Sub
2019/12/08(日) 16:05:10.30ID:Bl/pyruh0
続き

Private Sub GP_EDIT_FixLngRec(strREC As String, GYO As Long)
Cells(GYO, 1).Value = FP_GET_REC_To_String(strREC, 1, 5)
Cells(GYO, 2).Value = FP_GET_REC_To_String(strREC, 6, 5)
End Sub

Private Function FP_GET_REC_To_String(strREC As String, _
lngStrPos As Long, _
lngLngs As Long) As String
Dim strREC2 As String
strREC2 = Trim(StrConv(MidB(strREC, lngStrPos, lngLngs), vbUnicode))
FP_GET_REC_To_String = strREC2
End Function

Private Function FP_GET_REC_To_Numeric(strREC As String, _
lngStrPos As Long, _
lngLngs As Long) As Currency
Dim strREC2 As String
strREC2 = StrConv(MidB(strREC, lngStrPos, lngLngs), vbUnicode)
FP_GET_REC_To_Numeric = CCur(strREC2)
End Function
2019/12/08(日) 16:14:11.41ID:/kMCly/xM
目がチカチカするから大文字変数関数やめろ
COBOLかよ
2019/12/08(日) 16:57:19.39ID:om5egmGHx
' 指定ファイルをOPEN(入力モード)
Dim cDir As String
Dim srcName As String
srcName = "C:\test"

With Application.FileDialog(msoFileDialogFilePicker)
  .InitialFileName = srcName
  .Show
  If .SelectedItems.Count = 0 Then Exit Sub
  srcName = .SelectedItems(1)
End With

Set TS = FSO.OpenTextFile(srcName, ForReading, False)
' 2行目から開始


ファイル名指定の箇所だけ一部書き換えてみたので試してみて
ちなみにこの手のcsv読み込み作業は一からvbaでスクラッチするよりも今やQueryTable使った方が早いと思うので、暇があったら調べるといいよ
2019/12/08(日) 17:19:26.73ID:Bl/pyruh0
>>45
できました…!!
本当に助かりました、ご親切にありがとうございます!!;;
時間が出来たらQueryTableも調べてみます!
2019/12/08(日) 17:46:46.44ID:om5egmGHx
>>46
動いてよかった
急いで書いたからDim cDirの行とか要らない行が入ってたわ、ごめんね
テキスト読み込みなのにCSVどうこうとか言っちゃってるし
適当にコード直してつかってね
2019/12/08(日) 18:05:03.89ID:Bl/pyruh0
>>47
了解です。
頂いたコードは今後勉強する時にも参考にさせていただきます…!
本当にありがとうございました!
2019/12/08(日) 20:46:43.66ID:m4NCsCKi0
教えて下さい。
役所のWeb公開している、DL済みxlsxファイルの「前回更新日時」を取得して
自book特定セルに落とそうと、
Webを漁って以下のVBAを書いてみた。
※ なんでわざわざプロパティの「前回更新日時」を取得するのかというと
ただの「更新日時」では、自分がDLした日時になってしまうから。

Public Sub getFileLastSaveTimeButton()
With CreateObject("Excel.Application")
.Visible = False
With .Workbooks.Open(Cells(8, 1).Value)
Cells(8, 2).Value = .BuiltinDocumentProperties("Last save time").Value
End With
.Quit
End With
End Sub

Cell(8,1).Value の(8, 1)=A8セルに
目的のファイルのフルパスを入力済みなんだけど、
ここを定義された名前に置き換えたい。

Worksheetで普通に
A8 = R_TargetFullPath
と名前を定義して
VBA上で
 With .Workbooks.Open(R_TargetFullPath)
としたら
 実行時エラー '1004':
 申し訳ございません。が見つかりません。
 名前が変更されたか、移動や削除が行われた可能性があります。
と出てしまうのは、なんでだろ?
Public Subだから?
2019/12/08(日) 21:02:19.63ID:m4NCsCKi0
教えて下さい。
役所のWeb公開している、DL済みxlsxファイルの「前回更新日時」を取得して
自book特定セルに落とそうと、Webを漁って以下のVBAを書いてみた。
※ なんでわざわざプロパティの「前回更新日時」を取得するのかというと
 ただの「更新日時」では、自分がDLした日時になってしまうから。

Public Sub LastSaveTime()
With CreateObject("Excel.Application")
.Visible = False
With .Workbooks.Open(Cells(8, 1).Value)
Cells(8, 2).Value = .BuiltinDocumentProperties("Last save time").Value
End With
.Quit
End With
End Sub

これ自体は上手くいくんだけど、
目的のファイルのフルパスが入力済みの、
Cell(8,1).Value の(8, 1)=A8セルを
定義された名前に置き換えたい。

Worksheet上で普通に
 $A$8 = R_TargetFullPath
と名前を定義して
VBA上で
 With .Workbooks.Open(R_TargetFullPath)
としたら
 実行時エラー '1004':
 申し訳ございません。が見つかりません。
 名前が変更されたか、移動や削除が行われた可能性があります。
と中途半端なエラーが出てしまうのは、なんでだろ?
Public Subだから?
2019/12/08(日) 21:04:30.92ID:m4NCsCKi0
ごめん。

専ブラ不調で
>>49,50と、
二重投稿になってしまった。
2019/12/08(日) 21:11:35.36ID:uIaXKQtl0
>>50
Range(名前).Value
2019/12/08(日) 21:38:38.38ID:m4NCsCKi0
>>52
ありがとう。やってみた。
・・・

 実行時エラー '1004':
 'Range' メソッドは失敗しました: '_Global' オブジェクト

だって。
2019/12/08(日) 22:06:19.10ID:ick2zDgR0
yokokara
2019/12/08(日) 22:10:45.88ID:qsJQUXNgx
>>53
違うブックや違うシートがアクティブになっているとかで、名前付きセルが見つけられなくてエラーが返ってきてるんじゃないの
ブック名を指定して式を書き起こせば問題なく動くと思うが
2019/12/08(日) 22:49:12.52ID:uIaXKQtl0
>>53
Rangeにブックやシートの指定してる?
2019/12/08(日) 23:01:44.63ID:gCiRV9kE0
MsgBox R_TargetFullPath

で何が表示されるか見てみたら?
2019/12/08(日) 23:04:27.84ID:m4NCsCKi0
>>55
ありがとう。

フォルダパスも名前を定義しているんだけど、
まずはその定義名を使わず、以下でやってみた。

With .Workbooks.Open(R_TargetFullPath)
 ↓
With .Workbooks.Open(Range("E:\Excel研究\前回保存日時の取得\○○の場合\'Last save timeを得るVBA.xlsm'!R_TargetFilePath").Value)

コンパイルは通った。
で、立ち上げているのは自bookだけなのを確認して
マクロを実行した結果、

 実行時エラー '1004':
 'Range' メソッドは失敗しました: '_Global' オブジェクト

むぅ・・・
2019/12/08(日) 23:18:37.85ID:m4NCsCKi0
>>56
ありがとう。

>>55 はシート名を飛ばしているけど、
定義名があるシート名も入れ込もうとしたら
どう書いたら良いのだろう?

「ファイル選択」がシート名なんだけど、
・・・\'Last save timeを得るVBA.xlsm'!ファイル選択!R_TargetFilePath
でも、
・・・\['Last save timeを得るVBA.xlsm']!ファイル選択!R_TargetFilePath
でも、結果は
 実行時エラー '1004':
 'Range' メソッドは失敗しました: '_Global' オブジェクト
だった。
60デフォルトの名無しさん (ワッチョイ 0d8e-pptj)
垢版 |
2019/12/08(日) 23:23:11.19ID:zBnJIcph0
>>59
死ね
2019/12/08(日) 23:31:46.83ID:m4NCsCKi0
>>57
ありがとう。

目的のファイル指定は取りあえず置いといて
画面抑止のままのこの主旨でいいのかな?

Public Sub LastSaveTime2()
With CreateObject("Excel.Application")
.Visible = False
MsgBox R_TargetFullPath
End With
End Sub

で、MSGの結果は、中身がブランク。
2019/12/08(日) 23:32:04.18ID:m4NCsCKi0
>>60
どうぞお幸せに。
2019/12/08(日) 23:35:44.03ID:uIaXKQtl0
>>59
普通にシート指定すればよい
はっきり理解できてないのにブックもシートも指定せずセルを扱うなんて危険なことはやめた方がいい

ところでR_TargetFullPathはセル名と言ってなかったかな?
>Workbooks.Open(R_TargetFullPath)
これが通るってR_TargetFullPathの中にフルパスが入ってるとしか思えない
2019/12/08(日) 23:50:05.28ID:m4NCsCKi0
>>63
> 普通にシート指定すればよい

その「普通」がよく分からなくて。
>>59 で試行したように、
sheet上での関数に他のbookから参照させるのとは
勝手が違うようだ。

> ところでR_TargetFullPathはセル名と言ってなかったかな?

は、>>50 で書いたとおり、
Worksheet上で普通に
 $A$8 = R_TargetFullPath
と名前を定義して
としただけ。
2019/12/09(月) 00:26:53.00ID:JYKNIWO60
>>64
シート指定とか調べず勘でやってるのか?
基本が無いのに勘で文法は書けないよ、知らないならちゃんと調べた方がいい

名前を定義とは、$A$8セルに「R_TargetFullPath」という名前を付けたと言ってる?
ちなみにVBAでR_TargetFullPathという名前の変数か定数作ったりしてない?
2019/12/09(月) 00:28:16.96ID:s6MuVJyT0
R_TargetFullPathに何を入れたいのかもう一度よく考えてコードを見直せ
2019/12/09(月) 18:07:53.39ID:Z8IKnDOY0
いろいろ考えてくれた皆さん、どうもありがとう。
自分の考えを上手く伝えられず、申し訳ない。

自分なりの考えで、確証は得られていないけど、
・"BuiltinDocumentProperties" を使った「前回更新日時」の取得は、対象ファイルをいちいち開かないと取得出来ないため、Public Subでやるしかない。
・が、Range(定義名)では、例えアクティブな自sheet内の定義名でもなぜか上手く取得出来ない。
・ただし、アクティブなセルをCells(行数, 列数)なら値取得が出来る。
ということかと。

ならば、「1つのファイルの日時を取得するのに定義名を使う」考え方を変えて、
・Cells(行数, 列数)を活かして、フォルダにDLした .xl* ファイルの、全ての前回更新日時を取得する。
としたら、出来た。

3つめの "Public Sub LastSaveTime3()" をボタンにマクロ登録
https://i.imgur.com/19QWsrZ.png

Power Queryで取得したフォルダ内.xl*ファイル一覧表(タイトルが黄緑色の列)の右列に
上記VBAで「前回更新日時」を取得した結果(タイトルが深緑色の列)
https://i.imgur.com/jegG0b5.png
2019/12/09(月) 19:47:30.76ID:FU5EvZBv0
ここには北海道のグラサンスーパーハゲザーこないのー?
2019/12/09(月) 20:06:58.60ID:JYKNIWO60
>>67
ブックとシートを指定せずにセルを指定してるから取得できないと何度…
指定してないからアクティブなシートを拾いに行く
アクティブなシートに名前の定義がなければ当然名前の定義を取得できるわけがない
2019/12/09(月) 20:26:18.92ID:e1eF5taTx
>>67
Public Subによる制御フローじゃないとドキュメントプロパティを参照できないなんていう制約は存在しないと思う
2019/12/09(月) 20:35:27.90ID:Z8IKnDOY0
>>70
ただのSubに変えたら、ダメだった。
2019/12/09(月) 20:37:14.17ID:Z8IKnDOY0
>>69
仰いますけど、
参照しようとした定義名は、自bookのアクティブsheet内だす。
2019/12/09(月) 20:45:36.21ID:Z8IKnDOY0
>>71
参考にしたのはMSコミュニティのこれ↓

https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_other-mso_2010/%E5%89%8D%E5%9B%9E%E4%BF%9D%E5%AD%98%E6%97%A5/97f992ad-416d-e011-8dfc-68b599b31bf5?messageId=33ce5330-cb6f-e011-8dfc-68b599b31bf5&;auth=1
2019/12/09(月) 21:50:46.52ID:TvnOkFVF0
Range("R_TargetFullPath").Value
2019/12/09(月) 22:19:06.53ID:JYKNIWO60
>>72
そのシートがアクティブになっていれば取得できる
なってなければ取得できない
取得できないということはアクティブだと思い込んでるだけか、名前が間違ってるか、指定が間違ってるか
2019/12/09(月) 22:21:49.68ID:ZJISTsUc0
>>72
シートは一つ?別のシートにも同名範囲があって特定できないとか?
2019/12/09(月) 22:23:12.83ID:JYKNIWO60
>>74
それだと1004エラーが出たらしい
2019/12/10(火) 00:08:00.24ID:IGUOZi3/x
>>73
これはサブルーチン呼び出しの都合でPublicスコープにしているだけで、BuildinDocumentPropertiesの仕様とは関係ないのでは
2019/12/10(火) 00:18:53.99ID:IGUOZi3/x
名前付き範囲のスコープの問題もありそう
2019/12/10(火) 06:11:01.50ID:1SW8Wt4N0
>>77
その時は
Range(R_TargetFullPath).Value
としたんじゃないか?>>52-53
2019/12/10(火) 11:53:22.18ID:Snrdoe410
ページに設定しているフィルターの解除をする場合

Range("E5").Select
Selection.AutoFilter

といった具合にRangeとセットで使うしか無いのでしょうか?
ここでは、VBAで「E5」を指定していますが、中のデータが入力により空になる事もある為
Range指定する事なくフィルタを解除したいです。
2019/12/10(火) 20:17:21.65ID:78OD2uofx
>>81
ページって何?シートのこと?
それとも印刷範囲のこと?
2019/12/10(火) 21:36:21.94ID:ntdCbZOy0
シート1のJ1〜J220のセルをシート2に行で張り付けて
それをどんどん繰り返して1〜48400の列を220*220の表にしたいんだけど、forに対するnextが無いと怒られます
3つのforに対してnextが足りてないのはわかるのですが、適当な場所においてもエラーが出ます
どうしたら解決するでしょうか?

Sub TEST4()
Dim S1 As Worksheet, S2 As Worksheet
Dim i As Integer, y As Integer, z As Integer

For i = 1 To 220
For y = 1 To 48181 Step +220
For z = 220 To 48400 Step +220

Set S1 = Worksheets("Sheet1")
Set S2 = Worksheets("Sheet2")
S2.Range("A" & i & ":" & "HL" & i).Value = S1.Range("J" & y & ":" & "J" & z).Value
Next

End Sub
2019/12/10(火) 21:54:10.27ID:bwWsAejd0
>>83
Sub TEST4()
  Dim S1 As Worksheet, S2 As Worksheet
  Dim r1 As Long, r2 As Long

  Set S1 = Worksheets("Sheet1")
  Set S2 = Worksheets("Sheet2")
  r2 = 1

  For r1 = 1 To 48400 Step 220
    S2.Range("A" & r2 & ":HL" & r2) = WorksheetFunction.Transpose(S1.Range("J" & r1 & ":J" & r1 + 219))
    r2 = r2 + 1
  Next
End Sub
2019/12/10(火) 21:58:10.86ID:blXuValB0
>>83
間違った場所に置くからエラーが出るんでしょうな
2019/12/10(火) 22:05:06.97ID:bwWsAejd0
Sub TEST4()
  Dim S1 As Worksheet, S2 As Worksheet
  Dim r1 As Long, r2 As Long
  Set S1 = Worksheets("Sheet1")
  Set S2 = Worksheets("Sheet2")
  r2 = 1
  For r1 = 1 To 48400 Step 220
    S2.Range("A" & r2).Resize(, 220) = WorksheetFunction.Transpose(S1.Range("J" & r1).Resize(220))
    r2 = r2 + 1
  Next
End Sub
87デフォルトの名無しさん (ドコグロ MM49-FuzI)
垢版 |
2019/12/10(火) 22:33:04.15ID:e5kRWpUlM
>>83
シート1には既に220*220の表があって、それをシート2に縦横入れ換えて貼り付けたいってこと?
2019/12/10(火) 22:41:16.48ID:+pH53X+X0
現在表示しているワークブックからファイル名の一部を取り出して、その数字をMsgBoxで表示するなど他の計算で使うことってできないでしょうか?

例えば「01-5.xlsx」の場合「-5」、「02+5.xlsx」の場合「5」、「03+1000.xlsx」の場合「1000」、「04-1234.xlsx」の場合「-1234」のような形
左の数字は2桁、右の数字は1〜4桁でファイルによって違います
0や小数点以下の数字はありません
ファイル名がプラスの場合とマイナスの場合があります
正数の場合ファイル名は+表記ですが記号自体は必要ありません
「マクロを実行しているワークブック」ではなく「現在表示しているワークブック」のファイル名を参照したいです

プログラミングの経験が全くなくて先週からマクロを触り始めたので不可能なことを質問かもしれませんがよろしくお願いします
2019/12/10(火) 22:46:23.21ID:ntdCbZOy0
>>84、866
スゲーできたーありがとうございます。中身よく見て、勉強します。

>>87
シート1に1列で48400ほどデータがあるんで、それを別シートに220*220の表にしたかったんです。
2019/12/10(火) 23:00:44.84ID:78OD2uofx
>>88
+ または - を区切り文字としてThisworkbook.NameをSplit関数で分割して配列化する

得られた配列の二つ目の要素を取り出して整数型に型変換する

この二つのステップを実現すれば良い
2019/12/10(火) 23:02:34.06ID:78OD2uofx
>>88
よく要件を読んだらThisworkbook.Nameより
ActiveWorkbook.Nameの方が良いかも
2019/12/10(火) 23:04:16.14ID:blXuValB0
>>90
-が消える上に.拡張子まで全部取得する羽目になる
2019/12/10(火) 23:06:54.98ID:blXuValB0
ファイル名を.で区切った1個目の3文字目以降を取得して数値変換すればいい
2019/12/11(水) 01:12:21.51ID:HRfJYRvp0
>>82
シートです!
2019/12/11(水) 05:06:25.08ID:rrddvJwO0
>>81
Worksheets("シート1").Autofiltermode = false
2019/12/11(水) 09:15:52.19ID:0sWj3Hq10
>>83
For NextではNextの後を省略すべきじゃない。
For Eachならまだ分かるが。
2019/12/11(水) 11:27:42.94ID:HRfJYRvp0
>>95
サンキュー!!
2019/12/11(水) 19:02:34.08ID:3wTkanlw0
それ多分フィルタ掛かってないとコケる。
On Error〜か、If AutoFilterMode Then入れないと。
2019/12/11(水) 23:16:02.27ID:0sWj3Hq10
>>98
Falseにする分には問題無い。
2019/12/12(木) 20:44:42.97ID:gjQRRqT20
>>88
Sub test2()
'整数を格納
Dim lngFileName As Long

'正規表現オブジェクトを作成
Dim objReg As Object, objRegMatch
Set objReg = CreateObject("VBScript.RegExp")
With objReg
'ファイル名のパターンを指定
'[半角数字2文字][区切り文字1文字][半角数字1〜4文字][拡張子(xlsxまたはxls)]に一致
.Pattern = "^\d{2}.(\d{1,4})\.(?:xlsx|xls)$"
.Global = True
End With

'正規表現にマッチしないファイル名だった場合の処理
Set objRegMatch = objReg.Execute(ActiveWorkbook.Name)
If objRegMatch.Count < 1 Then
'メッセージボックスを表示
MsgBox ("正規表現アンマッチ")
'Label1にジャンプして処理を終了
GoTo Label1
End If

'正規表現のグループ化した部分を整数として格納
lngFileName = objReg.Replace(ActiveWorkbook.Name, "$1")

'メッセージボックスを表示
MsgBox (lngFileName)
Label1:
End Sub
2019/12/12(木) 21:07:09.62ID:TAtdTKRF0
ここには北海道のグラサンスーパーハゲザーこないのー?
2019/12/12(木) 22:26:00.96ID:NQXxI4iB0
ファイル名に + と - は使えないんじゃね
2019/12/12(木) 22:29:22.61ID:NQXxI4iB0
あれ?使えるのか
2019/12/12(木) 23:03:36.86ID:pxF5Pr1U0
>>103
使えるけどコマンドプロンプトでトラブルが起きることがあるから推奨しないと主張する派閥もいる
2019/12/13(金) 08:53:38.24ID:Kr+RdvKJM
特定のディレクトリに複数のエクセルがあってそのエクセルの特定のシートに値を設定するってマクロを作ったところなんですが特定のシートがない場合は処理を抜けるようにするのってどうすればいいんでしょうか
2019/12/13(金) 09:22:06.72ID:jxXQPWyn0
バイナリデータをエクセルに16列で読み込んで(ここまでは出来た)、
今度はそれの逆をしようとしているのですが最初で詰まっています

とりあえず1列だけでもと、やってみたものの全然うまくいきません
サンプルのOutputをBinaryに、Print をPut構文にすればできるような気がするのですが
出力ファイルにデータが反映されてなかったりといった状況です

Sub make()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim datFile As Variant
datFile = ActiveWorkbook.Path & "\data.bin"

Open datFile For Output As #1

Dim i As Long
i = 1
Do While ws.Cells(i, 1).Value <> ""
Print #1, ws.Cells(i, 1).Value
i = i + 1
Loop

Close #1

End Sub
2019/12/13(金) 09:29:21.11ID:tON2FCC6x
>>105
Dir関数かFileSystemObject. FileExistsで調べられる
2019/12/13(金) 09:33:50.19ID:tON2FCC6x
>>105
ファイル存在確認じゃなくてシート存在確認かごめん
2019/12/13(金) 10:57:50.32ID:Kr+RdvKJM
>>108
シートがない場合の件はForで回して無事解決できました
2019/12/13(金) 12:12:29.79ID:Kr+RdvKJM
VBAで名前定義がされたセルに値を書き込む際名前定義の範囲がシート指定の場合操作できないのでしょうか
2019/12/13(金) 14:57:25.33ID:tYi2uLeR0
>>106
出力するデータの型がバイナリになっていないとだめかも
2019/12/13(金) 18:47:12.50ID:PdnkT2240
>>110
そんなことないはず。
2019/12/13(金) 21:57:03.12ID:mlyVYmAb0
北海道のグラサンスーパーハゲザーはここにこないのー?
2019/12/14(土) 10:49:44.02ID:q6pf2Uya0
PDFからのデータ取得ってどうにかならんもんかな。
Adobeの有料版使ってエクセル変換してるが、フォーマットによってはレイアウト崩れが酷くて使い物にならん。
ハイライトリストも試してみたんだけど、文字がぶつ切りでしか取れなくて、速度も遅い。
座標見ながら文字結合するのもアレだし。
RPA的にコピペするのもマヌケだしなぁ。
2019/12/14(土) 11:40:24.17ID:0wkcBg3Ka
そんな馬鹿なことをしなくてもいいように業務フローを見直す、が正解
2019/12/14(土) 11:59:38.55ID:qU+OtdBcd
>>114
理論上はPostscriptを完璧にシミュレートすれば可能なはずなんだけど、かなり面倒だしそこまでやってるアプリは今のところ見た事ない
レイアウトが崩れない変換アプリがあるんなら教えて欲しいわ
2019/12/14(土) 14:16:07.99ID:O6whyyHQ0
PDFのレンダリングは完璧なんだから
取得ができないのは本来おかしいんだけどね
2019/12/15(日) 09:28:05.88ID:P17lNwFm0
環境は、OS:Windows10, Excel2016です。
初歩的な質問ですが、よろしくお願いします。

エクセル開発タブ⇒マクロの記録を選択
マクロの保存先を新しいブックにしてOKすると、
新しいブックが表示されてしまいます。(EXCEL2010までは表示はされなかった気がします。)
表示させないようにしたいですが方法はありますでしょうか?
2019/12/15(日) 12:10:44.95ID:JDQV93QX0
Excelの使い方の質問ですな
2019/12/15(日) 13:30:33.36ID:STgulX1kx
>>118
そもそもそんな質問をする理由が分からない
マクロの保存先を作業中のブックに変えればいいだけの話では
RPAとかの都合なのか?
121デフォルトの名無しさん (ワッチョイ eff1-ctch)
垢版 |
2019/12/15(日) 14:37:37.17ID:Jtes46Zd0
VBAのコードを長時間書いていたら肛門が痛くなりました。
これは何かの病気?いい薬はありますか?
2019/12/15(日) 15:56:49.13ID:ZgYfMqOYM
Worksheets(1), Worksheets(2), Worksheets(3), ...
が常にワークシートの並び順になっている事を前提にコーディングしても大丈夫ですか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況