19/12/04 07:44:27.63 95sMFvbJ0.net
そんな話じゃね―だろ。
Cells(1, 1)はA1セルを返す。
Cells(1, 1).Borders(xlDiagonalDown)はA1セルの右下がり斜め線の罫線を返す。
Cells(1, 1).Borders(xlDiagonalDown).LineStyleはA1セルの右下がり斜め線の罫線の線スタイルを返す。
Cells(1, 1).Borders(xlDiagonalDown).LineStyle = xlContinuousはA1セルの右下がり斜め線の罫線の線スタイルに直線を代入(設定)している。
初心者はこの程度の理解でOK。
19:デフォルトの名無しさん
19/12/04 07:45:37.52 95sMFvbJ0.net
>>17
それは上級者ではない。
20:デフォルトの名無しさん
19/12/04 07:49:29.48 k4fgFX/Ba.net
>>17
自分で作ってないだろ
21:デフォルトの名無しさん
19/12/04 12:58:07.59 pTwF3wZxd.net
クリップボードの文字を操作するのはdataobjectで可能らしいですが、
スクショ撮った後に任意の座標の画素値を自動で取得するのは不可能なのでしょうか?
また、やるとするとシートに画像貼り付け→画像をbmp保存→その画像をバイナリで読み込みという流れになってしまうのでしょうか?
22:デフォルトの名無しさん
19/12/04 13:01:40.27 T2HYa+hHx.net
>>18
返す
直線を代入
このあたりの表現の曖昧さでひっかかるかどうかが初心者に留まる人と上級者になれる人の違いってことだわな
23:デフォルトの名無しさん
19/12/04 14:05:40.23 95sMFvbJ0.net
>>21
スクショ取った後じゃないとダメなの?
別にスクショ取らなくても取得できるんだが。
勿論スクショ取った後に、そのスクショの任意座標の画素値も取得できる。
24:デフォルトの名無しさん
19/12/04 14:06:26.73 95sMFvbJ0.net
>>21
シートに画像貼り付けとか必要無い。
25:デフォルトの名無しさん
19/12/04 18:01:03.06 pTwF3wZxd.net
>>23
やりたいこととしては、囲碁やオセロなどのゲーム中に、盤面をリアルタイムにスクショ等をして、そこから各座標の色を読み込むことで盤面をデータ化するという流れなのですが、画像保存の手間を省けるのであれば教えて頂きたいです。
dataobjectだとgettextでテキストのクリップボードは読み込めるのですが、スクショだとできませんでした、、
26:デフォルトの名無しさん
19/12/04 20:05:12.18 RAKlTKsZ0.net
>>25
いちいちクリップボードにスクショを入れなくても、ゲーム画面のデバイスコンテキストがわかれば、自由にピクセルの色を調べたり、逆にピクセルを書き込んだりできる
URLリンク(excel.syogyoumujou.com)
27:デフォルトの名無しさん
19/12/04 20:36:16.46 M9X3+qe90.net
>>26
デバイスコンテキストなるものがあるのですか、、知らない概念でした、、
スクショ取るのは余計なステップだったのですね。素人にはこの発想しかなかったです
難しそうでまだざっとみただけですが、画面の画像認識系の自動化はこのやり方が基本なのですかね。
ゆっくり読んでやってみます!ありがとうございます
28:デフォルトの名無しさん
19/12/04 20:46:11.63 M9X3+qe90.net
ちなみにスクショでも可能とありましたが、その際はdataobjectではなく同様にwin32apiの何かを使うことになるのでしょうか
29:デフォルトの名無しさん
19/12/04 21:17:45.91 le08Bijgx.net
gdiplus.dllを使う感じかな
30:デフォルトの名無しさん
19/12/04 21:46:06.48 z+3QCMVld.net
>>27
>>26のリンク先に殆ど書いてある。
指定座標のピクセル値を取得するなら他にGetPixelを使う。
ただ、こいつは遅い。
大量に取得するならgdiplus系のGetPixel使った方が速いけど、そこまでする必要は無いかと思う。
どっちにしてもこの辺が自在に扱えるなら間違いなく上級者だね。
>>29
>>26のリンク先の内容で行くならgdiplusじゃない。
31:デフォルトの名無しさん
19/12/04 21:57:16.24 M9X3+qe90.net
>>29>>30
ある程度の範囲の取得になると方針が変わるのですね、、
とりあえずまずはリンク先のやり方を勉強してみることにしてみます。
ご丁寧にありがとうございます。
32:デフォルトの名無しさん (アークセー Sxc1-8b9E)
19/12/06 08:56:17 jTNEW24Lx.net
VBAスレの方でも質問させていただいたのですが、こちらのスレにも詳しい方がいらっしゃるようなので、質問させてください
Exchange / Outtlook VBAの質問です
初歩的な質問で申し訳ありません
任意の名前を持つ配布リストや連絡先グループに属するExchangeユーザーのSMTPアドレスの一覧を取得するにはどうしたら良いのでしょうか
配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません
なお配布リスト、連絡先グループいずれも個人ユーザーのみが登録されている前提なので、再帰によるメンバー取得は不要な状況です
33:デフォルトの名無しさん (ドコグロ MM43-cb5P)
19/12/06 12:30:08 G0zfLpZEM.net
>>32
> 配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません
その部分のコード貼れよ
34:デフォルトの名無しさん (ワッチョイ 7501-cb5P)
19/12/06 18:27:30 c6fF/5cl0.net
yokokara
35:デフォルトの名無しさん
19/12/06 20:54:35.91 Nvs1NFCt0.net
>>32
先に質問した方でちゃんと断ったん?
36:デフォルトの名無しさん
19/12/06 21:19:32.34 CNjj6fiz0.net
outlookを使わなければならないような身の上には同情する
さすがに人少なそうだしいいんじゃないかな
俺はoutlook自体持ってないから良くわからないや。あれまだあるのか
37:デフォルトの名無しさん
19/12/06 21:25:37.04 I1is1QTTM.net
今のOutlookは使いやすくなってるよ
俺の中のOutlookは2000で止まってたから久々に使うことになってびっくりした
もはや別物
38:デフォルトの名無しさん
19/12/06 21:33:39.56 CNjj6fiz0.net
そうなのか?
大変そうだしoutlook入ってるし使ってみるか、と思ったらメールアドレスが必要なので諦めた
頑張って!
39:デフォルトの名無しさん
19/12/06 22:46:30.30 Nvs1NFCt0.net
2013時点ではまだ使いにくい…
40:デフォルトの名無しさん (オッペケ Src1-paXL)
19/12/08 04:18:02 b513l43Er.net
正直メール関係でマクロは怖いな
ローカルでサーバ建ててテストするならともかくExchangeでいきなり本番環境でしょ?
41:デフォルトの名無しさん
19/12/08 09:25:05.41 om5egmGHx.net
アカウント情報やOutlookアイテムの読み取り、アイテムダウンロードだけならExchange環境でのマクロ使用を恐れる理由はないかと思う
42:デフォルトの名無しさん
19/12/08 16:03:51.58 Bl/pyruh0.net
すみません、お力を貸して頂きたいです。超初心者です。
固定長形式テキストデータを読み込んで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
43:デフォルトの名無しさん
19/12/08 16:05:10.30 Bl/pyruh0.net
続き
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
44:デフォルトの名無しさん
19/12/08 16:14:11.41 /kMCly/xM.net
目がチカチカするから大文字変数関数やめろ
COBOLかよ
45:デフォルトの名無しさん
19/12/08 16:57:19.39 om5egmGHx.net
' 指定ファイルを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使った方が早いと思うので、暇があったら調べるといいよ
46:デフォルトの名無しさん
19/12/08 17:19:26.73 Bl/pyruh0.net
>>45
できました…!!
本当に助かりました、ご親切にありがとうございます!!;;
時間が出来たらQueryTableも調べてみます!
47:デフォルトの名無しさん
19/12/08 17:46:46.44 om5egmGHx.net
>>46
動いてよかった
急いで書いたからDim cDirの行とか要らない行が入ってたわ、ごめんね
テキスト読み込みなのにCSVどうこうとか言っちゃってるし
適当にコード直してつかってね
48:デフォルトの名無しさん
19/12/08 18:05:03.89 Bl/pyruh0.net
>>47
了解です。
頂いたコードは今後勉強する時にも参考にさせていただきます…!
本当にありがとうございました!
49:デフォルトの名無しさん
19/12/08 20:46:43.66 m4NCsCKi0.net
教えて下さい。
役所の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だから?
50:デフォルトの名無しさん
19/12/08 21:02:19.63 m4NCsCKi0.net
教えて下さい。
役所の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だから?
51:デフォルトの名無しさん
19/12/08 21:04:30.92 m4NCsCKi0.net
ごめん。
専ブラ不調で
>>49,50と、
二重投稿になってしまった。
52:デフォルトの名無しさん
19/12/08 21:11:35.36 uIaXKQtl0.net
>>50
Range(名前).Value
53:デフォルトの名無しさん
19/12/08 21:38:38.38 m4NCsCKi0.net
>>52
ありがとう。やってみた。
・・・
実行時エラー '1004':
'Range' メソッドは失敗しました: '_Global' オブジェクト
だって。
54:デフォルトの名無しさん
19/12/08 22:06:19.10 ick2zDgR0.net
yokokara
55:デフォルトの名無しさん
19/12/08 22:10:45.88 qsJQUXNgx.net
>>53
違うブックや違うシートがアクティブになっているとかで、名前付きセルが見つけられなくてエラーが返ってきてるんじゃないの
ブック名を指定して式を書き起こせば問題なく動くと思うが
56:デフォルトの名無しさん
19/12/08 22:49:12.52 uIaXKQtl0.net
>>53
Rangeにブックやシートの指定してる?
57:デフォルトの名無しさん
19/12/08 23:01:44.63 gCiRV9kE0.net
MsgBox R_TargetFullPath
で何が表示されるか見てみたら?
58:デフォルトの名無しさん
19/12/08 23:04:27.84 m4NCsCKi0.net
>>55
ありがとう。
フォルダパスも名前を定義しているんだけど、
まずはその定義名を使わず、以下でやってみた。
With .Workbooks.Open(R_TargetFullPath)
↓
With .Workbooks.Open(Range("E:\Excel研究\前回保存日時の取得\○○の場合\'Last save timeを得るVBA.xlsm'!R_TargetFilePath").Value)
コンパイルは通った。
で、立ち上げているのは自bookだけなのを確認して
マクロを実行した結果、
実行時エラー '1004':
'Range' メソッドは失敗しました: '_Global' オブジェクト
むぅ・・・
59:デフォルトの名無しさん
19/12/08 23:18:37.85 m4NCsCKi0.net
>>56
ありがとう。
>>55 はシート名を飛ばしているけど、
定義名があるシート名も入れ込もうとしたら
どう書いたら良いのだろう?
「ファイル選択」がシート名なんだけど、
・・・\'Last save timeを得るVBA.xlsm'!ファイル選択!R_TargetFilePath
でも、
・・・\['Last save timeを得るVBA.xlsm']!ファイル選択!R_TargetFilePath
でも、結果は
実行時エラー '1004':
'Range' メソッドは失敗しました: '_Global' オブジェクト
だった。
60:デフォルトの名無しさん
19/12/08 23:23:11.19 zBnJIcph0.net
>>59
死ね
61:デフォルトの名無しさん
19/12/08 23:31:46.83 m4NCsCKi0.net
>>57
ありがとう。
目的のファイル指定は取りあえず置いといて
画面抑止のままのこの主旨でいいのかな?
Public Sub LastSaveTime2()
With CreateObject("Excel.Application")
.Visible = False
MsgBox R_TargetFullPath
End With
End Sub
で、MSGの結果は、中身がブランク。
62:デフォルトの名無しさん
19/12/08 23:32:04.18 m4NCsCKi0.net
>>60
どうぞお幸せに。
63:デフォルトの名無しさん
19/12/08 23:35:44.03 uIaXKQtl0.net
>>59
普通にシート指定すればよい
はっきり理解できてないのにブックもシートも指定せずセルを扱うなんて危険なことはやめた方がいい
ところでR_TargetFullPathはセル名と言ってなかったかな?
>Workbooks.Open(R_TargetFullPath)
これが通るってR_TargetFullPathの中にフルパスが入ってるとしか思えない
64:デフォルトの名無しさん (ワッチョイ 4bda-Fgt1)
19/12/08 23:50:05 m4NCsCKi0.net
>>63
> 普通にシート指定すればよい
その「普通」がよく分からなくて。
>>59 で試行したように、
sheet上での関数に他のbookから参照させるのとは
勝手が違うようだ。
> ところでR_TargetFullPathはセル名と言ってなかったかな?
は、>>50 で書いたとおり、
Worksheet上で普通に
$A$8 = R_TargetFullPath
と名前を定義して
としただけ。
65:デフォルトの名無しさん (ワッチョイ 4d7c-TCJi)
19/12/09 00:26:53 JYKNIWO60.net
>>64
シート指定とか調べず勘でやってるのか?
基本が無いのに勘で文法は書けないよ、知らないならちゃんと調べた方がいい
名前を定義とは、$A$8セルに「R_TargetFullPath」という名前を付けたと言ってる?
ちなみにVBAでR_TargetFullPathという名前の変数か定数作ったりしてない?
66:デフォルトの名無しさん (ワッチョイ 2359-VnuC)
19/12/09 00:28:16 s6MuVJyT0.net
R_TargetFullPathに何を入れたいのかもう一度よく考えてコードを見直せ
67:50
19/12/09 18:07:53.39 Z8IKnDOY0.net
いろいろ考えてくれた皆さん、どうもありがとう。
自分の考えを上手く伝えられず、申し訳ない。
自分なりの考えで、確証は得られていないけど、
・"BuiltinDocumentProperties" を使った「前回更新日時」の取得は、対象ファイルをいちいち開かないと取得出来ないため、Public Subでやるしかない。
・が、Range(定義名)では、例えアクティブな自sheet内の定義名でもなぜか上手く取得出来ない。
・ただし、アクティブなセルをCells(行数, 列数)なら値取得が出来る。
ということかと。
ならば、「1つのファイルの日時を取得するのに定義名を使う」考え方を変えて、
・Cells(行数, 列数)を活かして、フォルダにDLした .xl* ファイルの、全ての前回更新日時を取得する。
としたら、出来た。
3つめの "Public Sub LastSaveTime3()" をボタンにマクロ登録
URLリンク(i.imgur.com)
Power Queryで取得したフォルダ内.xl*ファイル一覧表(タイトルが黄緑色の列)の右列に
上記VBAで「前回更新日時」を取得した結果(タイトルが深緑色の列)
URLリンク(i.imgur.com)
68:デフォルトの名無しさん
19/12/09 19:47:30.76 FU5EvZBv0.net
ここには北海道のグラサンスーパーハゲザーこないのー?
69:デフォルトの名無しさん
19/12/09 20:06:58.60 JYKNIWO60.net
>>67
ブックとシートを指定せずにセルを指定してるから取得できないと何度…
指定してないからアクティブなシートを拾いに行く
アクティブなシートに名前の定義がなければ当然名前の定義を取得できるわけがない
70:デフォルトの名無しさん
19/12/09 20:26:18.92 e1eF5taTx.net
>>67
Public Subによる制御フローじゃないとドキュメントプロパティを参照できないなんていう制約は存在しないと思う
71:デフォルトの名無しさん
19/12/09 20:35:27.90 Z8IKnDOY0.net
>>70
ただのSubに変えたら、ダメだった。
72:デフォルトの名無しさん
19/12/09 20:37:14.17 Z8IKnDOY0.net
>>69
仰いますけど、
参照しようとした定義名は、自bookのアクティブsheet内だす。
73:デフォルトの名無しさん
19/12/09 20:45:36.21 Z8IKnDOY0.net
>>71
参考にしたのはMSコミュニティのこれ↓
URLリンク(answers.microsoft.com)
74:デフォルトの名無しさん
19/12/09 21:50:46.52 TvnOkFVF0.net
Range("R_TargetFullPath").Value
75:デフォルトの名無しさん
19/12/09 22:19:06.53 JYKNIWO60.net
>>72
そのシートがアクティブになっていれば取得できる
なってなければ取得できない
取得できないということはアクティブだと思い込んでるだけか、名前が間違ってるか、指定が間違ってるか
76:デフォルトの名無しさん
19/12/09 22:21:49.68 ZJISTsUc0.net
>>72
シートは一つ?別のシートにも同名範囲があって特定できないとか?
77:デフォルトの名無しさん
19/12/09 22:23:12.83 JYKNIWO60.net
>>74
それだと1004エラーが出たらしい
78:デフォルトの名無しさん
19/12/10 00:08:00.24 IGUOZi3/x.net
>>73
これはサブルーチン呼び出しの都合でPublicスコープにしているだけで、BuildinDocumentPropertiesの仕様とは関係ないのでは
79:デフォルトの名無しさん
19/12/10 00:18:53.99 IGUOZi3/x.net
名前付き範囲のスコープの問題もありそう
80:デフォルトの名無しさん (ワッチョイ 4be8-V35x)
19/12/10 06:11:01 1SW8Wt4N0.net
>>77
その時は
Range(R_TargetFullPath).Value
としたんじゃないか?>>52-53
81:デフォルトの名無しさん (ワッチョイ 037d-V35x)
19/12/10 11:53:22 Snrdoe410.net
ページに設定しているフィルターの解除をする場合
Range("E5").Select
Selection.AutoFilter
といった具合にRangeとセットで使うしか無いのでしょうか?
ここでは、VBAで「E5」を指定していますが、中のデータが入力により空になる事もある為
Range指定する事なくフィルタを解除したいです。
82:デフォルトの名無しさん
19/12/10 20:17:21.65 78OD2uofx.net
>>81
ページって何?シートのこと?
それとも印刷範囲のこと?
83:デフォルトの名無しさん
19/12/10 21:36:21.94 ntdCbZOy0.net
シート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
84:デフォルトの名無しさん
19/12/10 21:54:10.27 bwWsAejd0.net
>>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
85:デフォルトの名無しさん
19/12/10 21:58:10.86 blXuValB0.net
>>83
間違った場所に置くからエラーが出るんでしょうな
86:デフォルトの名無しさん
19/12/10 22:05:06.97 bwWsAejd0.net
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:デフォルトの名無しさん
19/12/10 22:33:04.15 e5kRWpUlM.net
>>83
シート1には既に220*220の表があって、それをシート2に縦横入れ換えて貼り付けたいってこと?
88:デフォルトの名無しさん
19/12/10 22:41:16.48 +pH53X+X0.net
現在表示しているワークブックからファイル名の一部を取り出して、その数字をMsgBoxで表示するなど他の計算で使うことってできないでしょうか?
例えば「01-5.xlsx」の場合「-5」、「02+5.xlsx」の場合「5」、「03+1000.xlsx」の場合「1000」、「04-1234.xlsx」の場合「-1234」のような形
左の数字は2桁、右の数字は1~4桁でファイルによって違います
0や小数点以下の数字はありません
ファイル名がプラスの場合とマイナスの場合があります
正数の場合ファイル名は+表記ですが記号自体は必要ありません
「マクロを実行しているワークブック」ではなく「現在表示しているワークブック」のファイル名を参照したいです
プログラミングの経験が全くなくて先週からマクロを触り始めたので不可能なことを質問かもしれませんがよろしくお願いします
89:デフォルトの名無しさん
19/12/10 22:46:23.21 ntdCbZOy0.net
>>84、866
スゲーできたーありがとうございます。中身よく見て、勉強します。
>>87
シート1に1列で48400ほどデータがあるんで、それを別シートに220*220の表にしたかったんです。
90:デフォルトの名無しさん
19/12/10 23:00:44.84 78OD2uofx.net
>>88
+ または - を区切り文字としてThisworkbook.NameをSplit関数で分割して配列化する
得られた配列の二つ目の要素を取り出して整数型に型変換する
この二つのステップを実現すれば良い
91:デフォルトの名無しさん
19/12/10 23:02:34.06 78OD2uofx.net
>>88
よく要件を読んだらThisworkbook.Nameより
ActiveWorkbook.Nameの方が良いかも
92:デフォルトの名無しさん
19/12/10 23:04:16.14 blXuValB0.net
>>90
-が消える上に.拡張子まで全部取得する羽目になる
93:デフォルトの名無しさん
19/12/10 23:06:54.98 blXuValB0.net
ファイル名を.で区切った1個目の3文字目以降を取得して数値変換すればいい
94:デフォルトの名無しさん
19/12/11 01:12:21.51 HRfJYRvp0.net
>>82
シートです!
95:デフォルトの名無しさん
19/12/11 05:06:25.08 rrddvJwO0.net
>>81
Worksheets("シート1").Autofiltermode = false
96:デフォルトの名無しさん
19/12/11 09:15:52.19 0sWj3Hq10.net
>>83
For NextではNextの後を省略すべきじゃない。
For Eachならまだ分かるが。
97:デフォルトの名無しさん (ワッチョイ 037d-V35x)
19/12/11 11:27:42 HRfJYRvp0.net
>>95
サンキュー!!
98:デフォルトの名無しさん
19/12/11 19:02:34.08 3wTkanlw0.net
それ多分フィルタ掛かってないとコケる。
On Error~か、If AutoFilterMode Then入れないと。
99:デフォルトの名無しさん
19/12/11 23:16:02.27 0sWj3Hq10.net
>>98
Falseにする分には問題無い。
100:デフォルトの名無しさん
19/12/12 20:44:42.97 gjQRRqT20.net
>>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
101:デフォルトの名無しさん
19/12/12 21:07:09.62 TAtdTKRF0.net
ここには北海道のグラサンスーパーハゲザーこないのー?
102:デフォルトの名無しさん
19/12/12 22:26:00.96 NQXxI4iB0.net
ファイル名に + と - は使えないんじゃね
103:デフォルトの名無しさん
19/12/12 22:29:22.61 NQXxI4iB0.net
あれ?使えるのか
104:デフォルトの名無しさん
19/12/12 23:03:36.86 pxF5Pr1U0.net
>>103
使えるけどコマンドプロンプトでトラブルが起きることがあるから推奨しないと主張する派閥もいる
105:デフォルトの名無しさん
19/12/13 08:53:38.24 Kr+RdvKJM.net
特定のディレクトリに複数のエクセルがあってそのエクセルの特定のシートに値を設定するってマクロを作ったところなんですが特定のシートがない場合は処理を抜けるようにするのってどうすればいいんでしょうか
106:デフォルトの名無しさん
19/12/13 09:22:06.72 jxXQPWyn0.net
バイナリデータをエクセルに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
107:デフォルトの名無しさん
19/12/13 09:29:21.11 tON2FCC6x.net
>>105
Dir関数かFileSystemObject. FileExistsで調べられる
108:デフォルトの名無しさん
19/12/13 09:33:50.19 tON2FCC6x.net
>>105
ファイル存在確認じゃなくてシート存在確認かごめん
109:デフォルトの名無しさん
19/12/13 10:57:50.32 Kr+RdvKJM.net
>>108
シートがない場合の件はForで回して無事解決できました
110:デフォルトの名無しさん
19/12/13 12:12:29.79 Kr+RdvKJM.net
VBAで名前定義がされたセルに値を書き込む際名前定義の範囲がシート指定の場合操作できないのでしょうか
111:デフォルトの名無しさん
19/12/13 14:57:25.33 tYi2uLeR0.net
>>106
出力するデータの型がバイナリになっていないとだめかも
112:デフォルトの名無しさん
19/12/13 18:47:12.50 PdnkT2240.net
>>110
そんなことないはず。
113:デフォルトの名無しさん
19/12/13 21:57:03.12 mlyVYmAb0.net
北海道のグラサンスーパーハゲザーはここにこないのー?
114:デフォルトの名無しさん
19/12/14 10:49:44.02 q6pf2Uya0.net
PDFからのデータ取得ってどうにかならんもんかな。
Adobeの有料版使ってエクセル変換してるが、フォーマットによってはレイアウト崩れが酷くて使い物にならん。
ハイライトリストも試してみたんだけど、文字がぶつ切りでしか取れなくて、速度も遅い。
座標見ながら文字結合するのもアレだし。
RPA的にコピペするのもマヌケだしなぁ。
115:デフォルトの名無しさん
19/12/14 11:40:24.17 0wkcBg3Ka.net
そんな馬鹿なことをしなくてもいいように業務フローを見直す、が正解
116:デフォルトの名無しさん
19/12/14 11:59:38.55 qU+OtdBcd.net
>>114
理論上はPostscriptを完璧にシミュレートすれば可能なはずなんだけど、かなり面倒だしそこまでやってるアプリは今のところ見た事ない
レイアウトが崩れない変換アプリがあるんなら教えて欲しいわ
117:デフォルトの名無しさん
19/12/14 14:16:07.99 O6whyyHQ0.net
PDFのレンダリングは完璧なんだから
取得ができないのは本来おかしいんだけどね
118:デフォルトの名無しさん
19/12/15 09:28:05.88 P17lNwFm0.net
環境は、OS:Windows10, Excel2016です。
初歩的な質問ですが、よろしくお願いします。
エクセル開発タブ⇒マクロの記録を選択
マクロの保存先を新しいブックにしてOKすると、
新しいブックが表示されてしまいます。(EXCEL2010までは表示はされなかった気がします。)
表示させないようにしたいですが方法はありますでしょうか?
119:デフォルトの名無しさん
19/12/15 12:10:44.95 JDQV93QX0.net
Excelの使い方の質問ですな
120:デフォルトの名無しさん
19/12/15 13:30:33.36 STgulX1kx.net
>>118
そもそもそんな質問をする理由が分からない
マクロの保存先を作業中のブックに変えればいいだけの話では
RPAとかの都合なのか?
121:デフォルトの名無しさん (ワッチョイ eff1-ctch)
19/12/15 14:37:37 Jtes46Zd0.net
VBAのコードを長時間書いていたら肛門が痛くなりました。
これは何かの病気?いい薬はありますか?
122:デフォルトの名無しさん
19/12/15 15:56:49.13 ZgYfMqOYM.net
Worksheets(1), Worksheets(2), Worksheets(3), ...
が常にワークシートの並び順になっている事を前提にコーディングしても大丈夫ですか?
123:デフォルトの名無しさん
19/12/15 16:04:03.19 jQWuvGce0.net
止めは先が100%大惨事になるだろうな
124:デフォルトの名無しさん
19/12/15 16:08:21.42 STgulX1kx.net
>>122
OK
シートの並び順とシートのIndexは連動しているから
ただ他人と共有するブックでシートIndexに依存したコードを書くならば、シートの追加や削除や並び替えをユーザー側で行えなくするために、ブック構成の保護をかける必要はあるかも
125:デフォルトの名無しさん
19/12/15 20:43:05.99 FsE4lMSlp.net
>>122
非表示がなければ
126:デフォルトの名無しさん
19/12/15 21:19:26.62 SHKnrJYm0.net
インデックス値とシートの順にそんな保証あったかな
使い古しのワークブックだと最初のシートがSheet1とは限らない気がするし
127:デフォルトの名無しさん
19/12/15 21:53:45.41 jQWuvGce0.net
sheet1じゃなくてsheet(1)だぞ
左端がsheet(1)
128:デフォルトの名無しさん
19/12/15 22:30:02.10 STgulX1kx.net
>>126
CodeNameの話じゃなくてシートインデックスの話だぞ
129:デフォルトの名無しさん
19/12/15 23:11:58.85 HW9FgRDW0.net
VBAで拡張子がDWGのCAD図面ファイルから文字列と数字を抜き出してエクセルに貼り付けたいんだけどなんかイイ方法ない?
130:デフォルトの名無しさん
19/12/15 23:42:09.44 LATD77rz0.net
AutocadのVBA使えば。
131:デフォルトの名無しさん
19/12/15 23:44:25.04 4M9N/f7Ka.net
>>130
AutoCADのソフトは持ってないんだけど出来るの?
132:デフォルトの名無しさん
19/12/16 02:59:51.17 81b5k4YR0.net
DXFファイルはないのか?
133:デフォルトの名無しさん
19/12/16 08:14:35.94 ylV0M4Pv0.net
>>132
ないんだ
134:デフォルトの名無しさん
19/12/16 08:19:35.03 MkhWpp+30.net
>>129
VBAからほかのアプリをコントロールする方法があるから、適当なフリーウェアでDXFに変換
DXFはテキストファイルだから文字列がそのまま入ってる
135:デフォルトの名無しさん
19/12/16 09:20:06.30 ylV0M4Pv0.net
>>134
会社だからあんまりフリーソフト入れたくないんだよなぁ
136:デフォルトの名無しさん
19/12/16 12:08:57.72 t2/k2gwa0.net
どこまで読み取りたいのか分からんが、タイトルとかコメントとか作者とかは読み取れるんじゃない?
AutoCAD入ってなくても動くか分からんけどCOM用のAPI使って読み取るサンプルならAutodeskのフォーラムに有ったぞ。
137:デフォルトの名無しさん
19/12/16 18:36:30.35 81b5k4YR0.net
>>135
業務上必要だと上司に相談して無理ならできませんでいいやん
138:デフォルトの名無しさん
19/12/16 19:13:38.22 zd6rche20.net
DWGファイルを扱うってことはどっかの部署ではAutoCADが動いてるわけだから環境借りるなりすればいい
139:デフォルトの名無しさん
19/12/16 19:29:44.71 A0F2PFYR0.net
何がやりたいのか(最終目的が何なのか)分からないが、
AutoCADのスレで質問した方がいいと思う
AutoCAD総合スレ part7
スレリンク(bsoft板)
140:デフォルトの名無しさん
19/12/16 20:17:26.44 +vV5KnGFa.net
そんなデータの編集業務ってブラック企業じゃね
141:デフォルトの名無しさん
19/12/16 20:25:39.43 ylV0M4Pv0.net
図面から読み取る仕事が多くてVBAで自動化できないかと考えてるだけだよ。ブラック企業でもないよ。
バイナリファイルじゃ読み取れないし、フリーソフトで一つ一つテキストファイルDXFに変換っていうのもなかなかナンセンスな気がする
142:デフォルトの名無しさん
19/12/16 21:37:32.27 CfM/IfFed.net
>>141
お前が馬鹿なだけだろ
143:デフォルトの名無しさん
19/12/16 21:44:36.78 UUZzkS6j0.net
よかったな天才に教えて貰えるぞ
144:デフォルトの名無しさん
19/12/16 21:59:33.00 UZ2w46Iu0.net
>>141だけど天才の>>142に教えてほしい。どうしたらいい?
145:デフォルトの名無しさん
19/12/16 23:05:55.21 ArNGhSEVa.net
その図面データに営利目的で使用してはいけないって書いてないか?
146:デフォルトの名無しさん
19/12/16 23:19:30.71 zUbFdDFya.net
社内の人が作ってる図面なんだが
147:デフォルトの名無しさん
19/12/17 01:41:33.76 fNjlS94d0.net
だったら保存形式かえてもらえばすむやん
148:デフォルトの名無しさん
19/12/17 02:29:00.49 7tj6sNHj0.net
CADファイルならVISIOで開けるじゃね
VISIOにVBA載ってなかったか
149:デフォルトの名無しさん (ワッチョイ a201-VrMI)
19/12/17 02:51:35 Ef4LKPDY0.net
DWGもCOM経由でExcelから扱える
150:デフォルトの名無しさん
19/12/17 08:50:39.06 7E3y3B+ga.net
Excelで作成したものをフリーOfficeのCalcで開こうとするとエラーが出るので、違うPCのExcelにコードを写したいのですが、どうすれば良いでしょうか?
sheetは5枚でそれぞれデータが入力されています。
そのシートをコピーしてマクロコードをコピペすればできるのでしょうか?
コピーはできても貼り付ける場所が分かりません。教えてください。
151:デフォルトの名無しさん
19/12/17 09:41:37.65 vQ+5LFSo0.net
マクロは互換性ほぼ無いからなあ
152:デフォルトの名無しさん
19/12/17 15:37:53.37 /A3hSSic0.net
>>150
よく分からん。
ファイルをコピーしてそのファイルをそのまま使えば良いんじゃね?
要はさ、そのマクロのコ―ドがExcelの何を使っているかで変わるだろ。
コードを追って必要なものをコピーすれば使えるだろうよ。
153:デフォルトの名無しさん
19/12/17 20:23:29.92 3Fa5Zu3xa.net
慣れてる人ならできるかもしれんが
初心者じゃ無理だろ、互換性ないし
154:デフォルトの名無しさん
19/12/17 20:37:54.29 WWM9H/Hw0.net
OOoのVBAは相当単純なものじゃないと動かなかったような
色々省略するのもダメだったような気がする
155:デフォルトの名無しさん
19/12/17 20:55:11.10 BpmC86c/0.net
OOOBasicなんてあるんだな
勉強する人いるの?
156:デフォルトの名無しさん
19/12/17 21:06:28.96 WWM9H/Hw0.net
OOOBasicというのか・・・
数年前きまぐれにちょっと触って、あまりの互換性のなさに逃げ出したわ
157:デフォルトの名無しさん (ワッチョイ 1b8e-RPlZ)
19/12/17 23:47:48 eRzCNyCK0.net
>>150
馬鹿は死ね
158:デフォルトの名無しさん
19/12/18 02:07:35.42 ksLRDXXy0.net
なんでBasicにしたんだろね。
後発なんだから選べたはずなのに。
159:デフォルトの名無しさん
19/12/18 02:16:13.86 mwLPhsOw0.net
Cに似せるほうが大変だろう
160:デフォルトの名無しさん
19/12/18 07:45:18.46 enbCu13E0.net
>>158
VBが売れたから、機能はほぼそのままにVBAとしてofficeに搭載した
VCの登場はもっと後
時系列的に仕方ないとは思う
俺もCの方が良いとは思う
161:デフォルトの名無しさん
19/12/18 07:46:31.18 5n7ujQMK0.net
oooの話だろ
162:デフォルトの名無しさん
19/12/18 08:15:59.63 Bw/0QRZma.net
>>152
PC1のデータをPC2に移したい。でも、PC2にUSBなど外部のものを差し込めないしネットには繋がるけど仮想?か分からないけどデータをPC2のデスクトップとかドキュメントに保存できないので、
データの中身をコピーしてPC2でExcelを開きペーストすれば良いのではと考えたのですが、
Excelのデータを丸々コピーするにはまずシートをコピペしてその後マクロコードをコピペすれば良いのでしょうか?どこに貼り付ければ良いのかわかりません。
163:デフォルトの名無しさん
19/12/18 14:12:35.99 HS0oeyOA0.net
PC2のどこに移したいの?
PC2でデータを開き データの中身をコピーして Excel(新規ブック)を開きペーストすれば良い
でもその新規ブックは保存できないんでしょ?
164:デフォルトの名無しさん
19/12/18 14:53:42.73 mwLPhsOw0.net
会社のPCなら上司にまず先に相談しろ
165:デフォルトの名無しさん
19/12/18 15:30:08.92 Bw/0QRZma.net
>>163
PC2のデスクトップ
Excelを新規で開けば保存できる。
もしくは開きたいExcelのデータCalcでなら開ける。
Calcで開いてコピーしたものをExcelに貼り付けたら出来るのか?セル全範囲コピーして貼り付けてマクロコードもコピーして。
166:デフォルトの名無しさん
19/12/18 16:28:12.29 cW21FM1r0.net
>>162
馬鹿は死ね
167:デフォルトの名無しさん
19/12/18 18:12:16.35 2hbVJNuaa.net
シートの書式がコピーできるかな?
168:デフォルトの名無しさん
19/12/18 18:12:36.66 2hbVJNuaa.net
セルね
169:デフォルトの名無しさん
19/12/18 18:28:12.80 jQts0Cg90.net
>>167
死ね
170:デフォルトの名無しさん
19/12/18 20:40:24.52 eYqAoNFQM.net
Officeクリップボードをクリアするにはどうしたらよいですか?
171:デフォルトの名無しさん
19/12/18 21:42:34.31 enbCu13E0.net
>>161
ちゅまん
172:デフォルトの名無しさん
19/12/18 22:44:40.50 ycaRvEPMx.net
>>171
かわいい
173:デフォルトの名無しさん
19/12/18 23:33:23.01 kDyrT7eN0.net
>>170
その文言でぐぐれ
174:デフォルトの名無しさん
19/12/19 17:59:43.75 OOaAV86L0.net
ちょっと教えて下さい
自動的に新しいcsvファイルが保存されてくるフォルダがあって
新しいファイルが保存されたら処理をするってコードを作りたいんですが
どんな感じにしたらよいのかアイデアが浮かびません
イメージは処理開始としてから処理停止とするまでずっと監視と処理をし続ける感じです
正攻法ってどんな感じでしょう?
175:デフォルトの名無しさん
19/12/19 18:07:29.48 FlPgbXc+r.net
定期的にフォルダの更新日時かファイル数を比較
176:デフォルトの名無しさん
19/12/19 19:15:47.42 PZllcG7iF.net
C#に乗り換えてFileSystemWatcherかな
そういうのはサービスにして常時起動したいだろ?どのみちVBAじゃ無理がある
177:デフォルトの名無しさん
19/12/19 20:13:02.64 r3z4nZn+0.net
>>174
csvデータは一般機能のpower queryで「フォルダ指定」で取得してから、何らかの加工をする必要があればVBAでやるというのはどうでしょう?
178:デフォルトの名無しさん
19/12/19 20:52:54.37 Uvgz+C1W0.net
>>174
Application.OnTimeでググればいろいろ出てくる
Excel/VBA: 特定のフォルダ内のファイルの更新状況を監視するマクロ
URLリンク(pineplanter.moo.jp)
179:174
19/12/19 21:50:34.66 OOaAV86L0.net
コメントありがとうございます。
C#は知識がなくて・・・。1か月後に必要なんですが今からいけるかな。。。
>>177
すこし理解に時間がかかっています。内容確認してみます。
>>178
参考例ありがとうございます。
更新したファイルだけ処理をしたいのですが、この例だと毎回全ファイルを読むみたいなので
例えば処理したファイル名はシートに記録しておいて
更新起動時に毎回処理したかしてないか判断するのも追加するって感じですかね。
180:デフォルトの名無しさん
19/12/19 22:24:23.56 O8pz/cv40.net
>>179
悪用すると色々できそうだな
181:デフォルトの名無しさん (ワッチョイ 9f2c-1ZZR)
19/12/20 10:20:51 A+TGdcd90.net
ファイルのタイムスタンプで判断すれば?
182:デフォルトの名無しさん (ワッチョイ 9f2c-1ZZR)
19/12/20 11:57:58 A+TGdcd90.net
Ruby で、ファイルの最終更新時刻を取得する
fs = File::Stat.new( "./a.txt" )
p fs.mtime #=> 2018-01-16 13:36:40 +0900 最終更新時刻
p current = Time.now #=> 2019-12-20 11:54:02 +0900
p current - fs.mtime, fs.mtime - current
#=> 60733042.351125, -60733042.351125
183:デフォルトの名無しさん
19/12/20 15:07:41.92 INeYifjy0.net
>>179
ファイルのアーカイヴ属性を変更すればいいよ。これなら新規以外にも、変更ファイルも拾えるはず。
184:デフォルトの名無しさん
19/12/20 15:08:25.80 CBAVBsMi0.net
馬鹿ばっか
185:デフォルトの名無しさん
19/12/20 15:24:50.75 CkbICV7EM.net
ハゲばっか
186:デフォルトの名無しさん
19/12/20 20:34:34.24 UWWbjOVR0.net
馴鹿ばっか
187:デフォルトの名無しさん
19/12/21 11:10:49.09 lLQbKr+9r.net
クリスマスだから
188:デフォルトの名無しさん
19/12/21 19:08:13.95 reWWVMAr0.net
セルに指定したフォントの情報などを変数(オブジェクト?)として
保持して、別のセルに貼り付けることはできないでしょうか
Public Sub textMacro()
ActiveSheet.Cells(1, 1).Select
ActiveCell.Value = "testTESTtest"
ActiveCell.Characters(Start:=5, Length:=4).Font.ColorIndex = 3
End Sub
こんな感じで、文字列の途中で色を変えたりフォントを変えたり
した情報を構造体配列として保持しておいて、ソートしたり
特定条件で抽出したりしたデータを、書式ごと別のセルに
貼り付けたいのです
上記のようなコードで一旦別のワークシートに書き込んでやって、
そこを参照してコピーすれば解決します
ですが作業用ワークシートを作るのが美しくないので、なにか
方法がないものかと悩んでいます
189:デフォルトの名無しさん
19/12/21 19:30:42.69 EDn7hR2k0.net
>>188
rangeにでも入れとけばいいんじゃないの
190:デフォルトの名無しさん
19/12/21 19:57:20.88 reWWVMAr0.net
>>189
言葉足らずだったかもしれません
188で書いたコードのように、一旦どこかのセルに書式を設定するのではなく、
書式設定済みのデータを内部で生成したあとでセルに貼りたいのです
191:デフォルトの名無しさん
19/12/21 20:19:43.43 Z2fXXpuT0.net
アドバンスフィルタ使うとか。
192:デフォルトの名無しさん
19/12/21 21:42:26.79 u7lOGHHR0.net
>>188
activecellは rangeオブジェクト
rangeオブジェクトは必ずどこかの実態セルに紐付けしないと設定、参照できない
なので、実態セルを使いたくなければ、仮想的に実装するしかない
全てを網羅するには、それは非現実的(ムダ)だから私ならやらない
あとの判断はお任せする
(may be. GL)
193:デフォルトの名無しさん
19/12/21 21:50:56.66 vmSiEfoS0.net
ここには北海道のグラサンのスーパーハゲザーこないのー?
194:デフォルトの名無しさん
19/12/21 22:03:15.47 xOT/WAE8x.net
>>190
セルのコピーで済む処理をわざわざスクラッチする意味があるのか?
マクロ言語で車輪の再発明をするのは無駄だし結果的に美しくないものが出来上がって終わりなことが多いぞ
まぁ文字列書式の取得をするならRange.Charactersクラスを対象にForで一文字ずつループを回して、Fontプロパティで取れる各フォント属性を調べて構造体配列に格納していけば良い
Characters(i, 1)とか指定すれば一文字ずつ調べられる
具体的にはFontクラスのうち
Bold, ColorまたはColorIndex, FontStyle, Italic, Name, Size, ThemeColor, ThemeFont, Underlineあたりを取得しとけば何とかなるんじゃないか
195:デフォルトの名無しさん
19/12/21 22:26:10.14 reWWVMAr0.net
>>192
>>194
内部データとして、特定の文字だけボールドにしたり赤字にしたりしたデータを
保持しておいて、それをそのままセルに貼れないだろうかという趣旨でした
全然実用性のない例ですが、何らかの名簿データを元データとして入力すると
して、「佐藤」という名字だけを赤で表示したい、というケースがあったとします。
このとき、表示するときに年齢別だったり性別だったりの条件で抽出したりする
際に、毎回セルにデータを書き込むときにフォントの設定をする必要があるのか、
一度設定済みのデータを貼れば済むような方法があるのか、という質問でした
現在は毎回貼るたびにフォントの設定をしているので、もっと効率的な方法が
あるのではないかと考えた次第
でも残念ながら、どうやらなさそうですね
確かにセルをコピーすれば済む話なので、断念します
196:デフォルトの名無しさん
19/12/21 23:09:32.16 u7lOGHHR0.net
>>195
鈴木 健二
の鈴木だけを赤文字に設定したセルの書式コピーして
鈴木 太郎
セルに貼り付けしても、鈴木だけを赤にはできなかった
(バージョンによって違うかもだが)
ロジックでやるしかないんじゃないかな
鈴木or宇都宮を赤にするとか
197:デフォルトの名無しさん
19/12/21 23:41:09.25 reWWVMAr0.net
>>196
色々ありがとうございます
今回やりたいのは、鈴木だけを赤くした「鈴木 健二」というセルを作るのに、
事前にデータを作ってからセルに貼り付けたいということですから、
「鈴木 太郎」の「鈴木」が赤くならなくても特に問題ありません
この例で言うなら、コピペ以外の方法で、同じく鈴木だけが赤くなった鈴木健二の
セルを効率よく作りたい、ということですね
198:デフォルトの名無しさん
19/12/22 00:19:45.02 4IcKy9Blx.net
>>197
構造体とかでパラメータ設定すればやれないことはない
書式設定対象の文字列の開始オフセット位置と文字列長、フォント属性の設定値からなる構造体配列を作って、一括でRangeオブジェクトのプロパティに代入すれば良い
ただしパラメータを動的に指定する処理やらUIやらを構築する手間とか考えたら結局セルコピーでよくねってなる
199:デフォルトの名無しさん
19/12/22 09:13:02.87 m/MVfWr2M.net
office2010から2016へ変えたらマクロの遅さが気になって
セルコピーを別の方法でやれないか考えてる
200:デフォルトの名無しさん
19/12/22 10:54:11.14 sgFeqmUl0.net
マクロが遅いんじゃなくてPCのスペックが貧弱過ぎるんじゃないか
201:デフォルトの名無しさん
19/12/22 11:54:58.14 M+v9sXGU0.net
>>198
そこまでする価値はないですね
自分が知らないだけで、なにか簡単な方法があるのではないかと思って
いたのですが、そもそも需要がない動作なんでしょうね
202:デフォルトの名無しさん
19/12/22 12:26:41.63 cYIprE7S0.net
>>199
変えたのはExcelだけか?
実はOSを10に変えた時にExcelも入れ替えたのではなく?
203:デフォルトの名無しさん
19/12/22 14:42:00.45 qo1j1gBdx.net
>>201
そこまでやるならmhtか何かでコード生成してからxls変換してレンダリングする方がいいよねって話になってしまうからな
204:デフォルトの名無しさん
19/12/27 23:18:51.19 89CBNjra0.net
んあ
205:デフォルトの名無しさん
19/12/27 23:55:11.89 kLvnMS830.net
北海道のグラサンスーパーハゲザーはここにはこないのー?
206:デフォルトの名無しさん
19/12/28 10:04:17.04 Ht/sR5FE0.net
北海道にいるんだろ
207:デフォルトの名無しさん
19/12/28 11:09:10.42 iMlStgtR0.net
あなたのハゲにサクセスしたい
208:デフォルトの名無しさん
19/12/28 17:00:07.97 SHykekh8a.net
休みに入って大人しくなったな
209:デフォルトの名無しさん
20/01/01 22:49:57.07 /3koq0Lq0.net
フォルダ名を取得し名前を変える処理をしたいのですが、フォルダ名の頭に0がついているとセルに取り込んだ際、数値扱いされきえてしまいます。何かいい方法ないでしょうか?
ほぼネットから引用したものですが。。
Sub folder()
Dim folderPath As String
folderPath = Sheets(2).[B1]
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim n As Variant
n = fso.GetFolder(folderPath).SubFolders.Count
If (0 < n) Then
Dim I As Long
I = 1
Dim f As Object
For Each f In fso.GetFolder(folderPath).SubFolders
Cells(3 + I,1).Value=Str(f.Name)
I = I + 1
Next f
End If
End Sub
210:デフォルトの名無しさん
20/01/01 22:54:36.69 Oh0xulqx0.net
>>209
・セルの書式を予め文字列にしておく
・
Cells(3 + I,1).Value = "'" & Str(f.Name)
・セルに取り込まずに処理する
どれか
211:デフォルトの名無しさん
20/01/01 23:43:11.75 /3koq0Lq0.net
>>210
頭に「'」つける案いただきます!
すっかり頭からぬけておりました。
ありがとうございます!
212:デフォルトの名無しさん
20/01/02 00:01:52.13 KGMPhTA00.net
>>209
頭に'付けるとかセルの表示形式を文字にするとか
それVBAじゃなくてExcelの範疇では
213:デフォルトの名無しさん
20/01/02 00:13:18.61 4cnj/64c0.net
VBAはそもそもビジュアルベーシックフォーアプリケーション
エクセル(他office製品)のための言語
Excelの範疇も何もないよ
214:デフォルトの名無しさん
20/01/02 00:44:32.37 C9nM6Ix2x.net
セルにフォルダ名を入れなきゃならない理由が全く分からない
215:デフォルトの名無しさん
20/01/02 00:52:53.68 m04meMbs0.net
PowerQueryにデータの参照元渡すとか
216:デフォルトの名無しさん
20/01/02 11:28:52.88 yN8yk3jo0.net
マクロでCSV書き出ししたデータですが
どうも1行ごとに最後のセルの末尾に勝手に改行コードが入っているようです
これはなんとかならないでしょうか
その改行コードもCRLFで言うところのCRだけのようで、見かけ上全くわかりません
aaa,ddd,ccc
とあったら、cccの末尾に見えないCFが張り付いている感じです
urlエンコードで見ると ccc%0D みたいな感じです
どうしたら綺麗に書き出せますか?
217:デフォルトの名無しさん
20/01/02 12:02:15.68 33UW29zWd.net
>>216
改行コードをなくした場合、行の区切りはどうするの?
完全に思い通りにしたい時はテキストファイルの生成を自力でやるしかない
218:デフォルトの名無しさん
20/01/02 12:48:11.80 /IgTqK/90.net
セル内で改行しても平気か確認した方がいい
219:デフォルトの名無しさん
20/01/02 12:53:49.13 KGMPhTA00.net
>>216
ExcelではLFがセル内改行、CRLFが次の行
CRは意味を持たないので入ってても改行されない
消したければ普通にその文字を消せばいい
220:デフォルトの名無しさん
20/01/02 12:58:08.65 KGMPhTA00.net
あと勝手に入ってるのではなく元々のテキストファイルに入ってるんだろう
221:デフォルトの名無しさん
20/01/02 15:17:06.96 yN8yk3jo0.net
216です
>>217
csvの中のデータとして配列に入っています。書き出したcsvは普通に数行のカンマ区切りです。
それをjavascriptで配列へ取り込みしたときに、
二次元配列データの一行の最後のデータの末尾に毎行追加されている感じです。
配列内
aaa,ddd,ccc%0D
aaa,ddd,ccc%0D
aaa,ddd,ccc%0D
csvとしての改行・配列構成は崩れていません。
ちなみに書き出しは
ActiveWorkbook.SaveAs Filename:=csvName, FileFormat:=xlCSV
です。win7時代に作ったマクロをwin10で使っていますが、それもあるんでしょうか…
>>219
EXCELの改行仕様は知りませんでした。ありがとうございます。
末尾に列を1つ増やしたら取りたいデータにはつかなくなったので
(おそらく、増やした列に%0Dが移動したのかとw)、
若干気持ち悪いですが、趣味プログラムなので運用で対応します。
みなさんありがとうございました。
222:デフォルトの名無しさん
20/01/02 16:37:15.04 yYKIO5swM.net
北海道のグラサンスーパーハゲザーはここにはこないのー?
223:デフォルトの名無しさん
20/01/02 17:52:03.38 YgEQc8yF0.net
>>216
Excelのsheetに読み込んでから、CRLF等を""に置換する
ではダメ?
224:デフォルトの名無しさん
20/01/02 21:25:07.68 ShHqIFTQ0.net
一般論として例えば、Ruby のCSV の規格にも、
行区切り文字・列区切り文字・クォート文字などがある
特に設定しないデフォルトでは、それらは、
改行コード・カンマ・ダブルクォーテーションになる
もし、それらが無ければ、CSVの要件を満たさないw
つまり、CSVの規格ではありませんw
225:デフォルトの名無しさん
20/01/02 23:23:58.57 1vLrUBFwa.net
ルビカスが何を言おうと、世の中ではExcelが出力するCSVが標準のCSVだ
226:デフォルトの名無しさん
20/01/03 10:32:03.45 R/lajPDg0.net
CSVは自前でテキストファイル読み込み+自前で区切り扱いが基本。
区切りが何であろうと、データの形式が何であろうと全て自分でコントロール出来るし速度も速い。
227:デフォルトの名無しさん
20/01/03 12:29:48.12 V2sewd5k0.net
同意。てか、Excel標準のCSV読み込み仕様もうちょっとなんとかなりませんかね・・・?
それはさておき>>216&>>221(もう見てないかもだけど)
その「CSVファイルを配列に取り込むJavaScript」のコードに問題があるんじゃないかなと。
具体的には\n(%0A)でSplitしてるから\rが残ってるだけだと思うけどな。
228:デフォルトの名無しさん
20/01/03 18:33:14.85 LoHkYQxe0.net
使い続ける以上CSVとの戦いは続くのだ
229:デフォルトの名無しさん
20/01/03 18:50:10.73 k7eftYc7x.net
モダンExcelが一般化してきた今ならクエリでCSVの開き方を指定して読み込むのがいいんじゃないの
CSVをエクセルで直接開くといろいろ勝手なことをしてくれるので
230:デフォルトの名無しさん
20/01/03 19:06:41.78 esau8hBed.net
PowerQueryのコードを書くのはVBA以上にハードルが高いぞ
231:デフォルトの名無しさん
20/01/03 19:55:22.39 3Uhjf7eSM.net
PowerQueryコード書かなきゃいけないの?
GUIでできる範囲だと不十分なの?
232:デフォルトの名無しさん
20/01/03 19:58:54.81 k7eftYc7x.net
そんなにハードル高いか?
テキストファイルの読み込みの処理をスクラッチするより明らかに楽だし処理速度も速いと思うが
例えば4列のCSVをSJIS(Windows-J31)でデコードしてカンマ区切りで読み込んでSheet1のA1セルから書き出すとしたらこんな感じ
Sub ReadCSV()
With Worksheets("Sheet1")
With .QueryTables.Add(Connection:="TEXT;ソースファイルのパス", Destination:=.Range("A1"))
.TextFilePlatform = 932
.TextFileCommaDelimiter = True
.RefreshStyle = xlOverwriteCells
.TextFileColumnDataTypes = Array(xlTextFormat, xlTextFormat, xlTextFormat, xlTextFormat)
.Refresh
.Delete
End With
End With
End Sub
233:デフォルトの名無しさん
20/01/03 20:07:37.72 k7eftYc7x.net
PowerQueryだったらもっと簡単だろう
Csv.Documentにソースのパスとメタ情報を渡してテーブルを取得するだけだしGUIでステップ記録できる
234:デフォルトの名無しさん
20/01/03 20:56:20.20 LoHkYQxe0.net
CSV読み込みの話してんのになんで書き込みの回答してんだろうこの子
235:デフォルトの名無しさん
20/01/03 21:32:33.80 k7eftYc7x.net
>>234
>>232のコードについて言ってるなら、読み込んでシートに書き出してるわけで、クエリの使い方としてはオーソドックス処理だぞ
読み込んだ結果をシートに書き出さないならODCにデータモデルとして保存すれば良い
236:デフォルトの名無しさん
20/01/03 22:10:30.43 k7eftYc7x.net
>>235
ODCにデータモデルとして→×
データモデルとして→○
237:デフォルトの名無しさん
20/01/03 22:23:49.87 X7hap7HH0.net
>>230
全然。
基本的にはリボンの機能使った操作が1つずつのステップになっていく。
ステップの1つ1つがマクロみたいなもの。
「詳細クエリー」を見て初めて「コードはこうなってるんだ・・・」
という感じ。
もっとも、M Functionのレファレンスやパラメータあたり説明が
英語でもまだ不親切なので、
使えてない部分が多分にはあるけど。
ただ、VBAのように出来る範囲が広範囲なわけではなく、
取得したデータの成形に特化してる。
スクレイピングについては
Pythonみたいに取得対象のWeb画面で
IDやパスワード入力するとか、
ボタンを押すみたいなことも出来ない模様。
238:デフォルトの名無しさん
20/01/03 22:43:05.12 3zmXV6NNx.net
データの成形に特化と言ってもVBAでスクラッチすると恐ろしく面倒なJoinとかのSQLチックな処理は全て実行できるので、データ処理の面ではVBAより手軽で便利
あとAccessDBやSQL ServerやOBDCはもちろん、ファイルシステムとかExchangeサーバとかSharePointリストとか、およそデータベースとして扱えるデータストアの情報は全て取得できる
フォルダ内のファイルの属性情報を取得する処理のためだけにいちいちFileSystemObjectのインスタンスとかを使ってスクラッチする必要がなくなると考えればめちゃくちゃ便利
239:デフォルトの名無しさん
20/01/04 15:59:54.32 dDunGyfu0.net
>>227
みています
ご指摘の通り、\nでspritかけてました!
\nってCR+LFじゃなかったんですね…
この後都合があるのですぐには試せませんが、
その辺確認してみます。
ありがとうございます!
240:デフォルトの名無しさん
20/01/04 16:12:12.74 8fEwlZFG0.net
\nはLFじゃなかったか
windowsの改行は\r\nだったような
241:デフォルトの名無しさん
20/01/04 17:52:00.86 ALZ03HNg0.net
EditBoxでは\r\nでRichEditBoxでは\nだねWindows
242:デフォルトの名無しさん
20/01/04 17:56:48.54 +4weKQQc0.net
CR+LFの定数の vbCrLf か vbNewLine でいいんじゃね
243:デフォルトの名無しさん
20/01/04 18:04:55.94 8fEwlZFG0.net
vbNewLineいいよね
244:デフォルトの名無しさん
20/01/04 18:23:56.78 ZrFrOERU0.net
>>239
やっぱり。
>>240-241の人もいうとおり、OSだけじゃなくAPI関数ごとに改行コードの取扱いが違ったりすることもあるし、
テキストエディタに内蔵されてる正規表現なんかでも「\n」でCRLFに対応させてる例もあったりするから、
その辺はトライ&エラーで覚えていくといいとおもうよ。
245:デフォルトの名無しさん
20/01/04 18:40:58.78 HwWXKum00.net
北海道のグラサンスーパーハゲザーはここにはこないのー?