◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:Excel VBA 質問スレ Part64 YouTube動画>9本 ->画像>4枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1575297834/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
!extend:checked:vvvvv:1000:512
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part63
http://2chb.net/r/tech/1568630099/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
前レスナンバー999 なんとなくわかるけど a = msgbox 文字列 これならmsgboxが戻り値とわかるが cells.border() これはborderの戻り値が〜じゃなくてcellsの戻り値がボーダーに入ってんじゃないの? 関係図を教えて
>>4 じゃないの
a = cells()
a.border()
って事なの
セルのボーダーのラインスタイルの戻り値にxlInsideHorizontalを入れようとしている。
>>4 Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlInsideHorizontal ↑色々省略されている。 ↓なるべく略さずに書き直してみる。 Let Excel.Application.ActiveSheet.Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlInsideHorizontal 先頭の「Let」はステートメント(命令)で、「この行のコードの右辺の値を左辺に 代入してね」という命令になっている。 また、このコード例の場合、ピリオドの右に続く単語はすべて(たまたま)「プロパ ティ」になっている。 だが、「ApplicationプロパティのActiveSheetプロパティ」だとか「Cellsプロパ ティのBordersプロパティ」だとかいう語は成り立たない。 ExcelオブジェクトライブラリのApplicationプロパティにより、Applicationクラス のインスタンス(Applicationオブジェクト)を参照(Get) →ApplicationオブジェクトのActiveSheetプロパティにより、Worksheetクラスのイ ンスタンス(WorkSheetオブジェクト)を参照(Get) →WorkSheetオブジェクトのCellsプロパティにより、Rangeクラスのインスタンス (Rangeオブジェクト)を参照(Get) (Rangeオブジェクトのデフォルトプロパティの引数にi・jを指定し、Rangeクラ スの別のインスタンス=Rangeオブジェクトを参照) →RangeオブジェクトのBordersプロパティにより、Bordersクラスのインスタン ス(Bordersオブジェクト)を参照(Get) (Bordersオブジェクトのデフォルトプロパティの引数にxlDiagonalDownを指 定し、Borderクラスのインスタンス=Borderオブジェクトを参照) →BorderオブジェクトのLineStyleプロパティにxlInsideHorizontalを代入 (Let)してね(=LineStyleプロパティプロシージャの引数にxlInsideHorizontalを指 定して、LineStyleプロパティプロシージャを実行してね)。 >>7 多分、初心者は何言ってるかサッパリ分からんだろうなw
>>8 そう・・・
>>4 「Cells.Borders」は
1.アクティブなWorksheetオブジェクトのCellsプロパティを参照(Get)
→戻り値はRangeオブジェクト
2.RangeオブジェクトのBorders(Borderではない)プロパティを参照(Get)
→戻り値はBordersオブジェクト
という表現。
Borders()の括弧の中にxlBordersIndex定数を指定した場合、
戻り値はBorderオブジェクトになる。
「いきなりプロパティからはじまるのはおかしい」と思うかもしれないが、それは
>>7 に書いたとおり色々と省略しているから。
>>7 って、なんかめちゃくちゃ改行入っとる・・・ 書き直し。 Let Excel.Application.ActiveSheet.Cells(i, j).Borders(xlDiagonalDown).LineStyle = xlInsideHorizontal ExcelオブジェクトライブラリのApplicationプロパティにより、Applicationクラスのインスタンス(Applicationオブジェクト)を参照(Get) →ApplicationオブジェクトのActiveSheetプロパティにより、Worksheetクラスのインスタンス(Worksheetオブジェクト)を参照(Get) →WorksheetオブジェクトのCellsプロパティにより、Rangeクラスのインスタンス(Rangeオブジェクト)を参照(Get) (Rangeオブジェクトのデフォルトプロパティの引数にi・jを指定し、Rangeクラスの別のインスタンス=Rangeオブジェクトを参照) →RangeオブジェクトのBordersプロパティにより、Bordersクラスのインスタンス(Bordersオブジェクト)を参照(Get) (Bordersオブジェクトのデフォルトプロパティの引数にxlDiagonalDownを指定し、Borderクラスのインスタンス=Borderオブジェクトを参照) →BorderオブジェクトのLineStyleプロパティにxlInsideHorizontalを代入(Let)してね(=LineStyleプロパティプロシージャの引数にxlInsideHorizontalを指定して、LineStyleプロパティプロシージャを実行してね)。 >>10 インスタンスねぇ…
プログラム1ヶ月の人にわかると思う?荒らしか?
メソッドの引数は普通だけど、プロパティの引数って特別な呼び方ある? よく考えたら他の言語にプロパティの引数って見たことないような
>>11 それがわからんと理解できないよ
そもそも一般には聞き慣れないと言うだけでそんなに難しい概念じゃないし
インスタンス? VB.Netとかだと最初の1日目か2日目に学習することだとか言ったらまた荒れるんだろうなぁ
インスタンスとクラスが分からないとお話にならんわな 式で参照取得しているものが何なのかまるで分かってないってことだから
上級者でもわかってないと思うけどな。 シートモジュールに書くと、エラー出た時に、どこで止まったか分からないから、 標準モジュール書け!とかさwww
そんな話じゃね―だろ。 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。
クリップボードの文字を操作するのはdataobjectで可能らしいですが、 スクショ撮った後に任意の座標の画素値を自動で取得するのは不可能なのでしょうか? また、やるとするとシートに画像貼り付け→画像をbmp保存→その画像をバイナリで読み込みという流れになってしまうのでしょうか?
>>18 返す
直線を代入
このあたりの表現の曖昧さでひっかかるかどうかが初心者に留まる人と上級者になれる人の違いってことだわな
>>21 スクショ取った後じゃないとダメなの?
別にスクショ取らなくても取得できるんだが。
勿論スクショ取った後に、そのスクショの任意座標の画素値も取得できる。
>>23 やりたいこととしては、囲碁やオセロなどのゲーム中に、盤面をリアルタイムにスクショ等をして、そこから各座標の色を読み込むことで盤面をデータ化するという流れなのですが、画像保存の手間を省けるのであれば教えて頂きたいです。
dataobjectだとgettextでテキストのクリップボードは読み込めるのですが、スクショだとできませんでした、、
>>25 いちいちクリップボードにスクショを入れなくても、ゲーム画面のデバイスコンテキストがわかれば、自由にピクセルの色を調べたり、逆にピクセルを書き込んだりできる
http://excel.syogyoumujou.com/memorandum/get_dc.html >>26 デバイスコンテキストなるものがあるのですか、、知らない概念でした、、
スクショ取るのは余計なステップだったのですね。素人にはこの発想しかなかったです
難しそうでまだざっとみただけですが、画面の画像認識系の自動化はこのやり方が基本なのですかね。
ゆっくり読んでやってみます!ありがとうございます
ちなみにスクショでも可能とありましたが、その際はdataobjectではなく同様にwin32apiの何かを使うことになるのでしょうか
>>27 >>26 のリンク先に殆ど書いてある。
指定座標のピクセル値を取得するなら他にGetPixelを使う。
ただ、こいつは遅い。
大量に取得するならgdiplus系のGetPixel使った方が速いけど、そこまでする必要は無いかと思う。
どっちにしてもこの辺が自在に扱えるなら間違いなく上級者だね。
>>29 >>26 のリンク先の内容で行くならgdiplusじゃない。
>>29 >>30
ある程度の範囲の取得になると方針が変わるのですね、、
とりあえずまずはリンク先のやり方を勉強してみることにしてみます。
ご丁寧にありがとうございます。
VBAスレの方でも質問させていただいたのですが、こちらのスレにも詳しい方がいらっしゃるようなので、質問させてください Exchange / Outtlook VBAの質問です 初歩的な質問で申し訳ありません 任意の名前を持つ配布リストや連絡先グループに属するExchangeユーザーのSMTPアドレスの一覧を取得するにはどうしたら良いのでしょうか 配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません なお配布リスト、連絡先グループいずれも個人ユーザーのみが登録されている前提なので、再帰によるメンバー取得は不要な状況です
>>32 > 配布リストや連絡先グループをExchange ユーザーとして取得するところまでは出来ているのですが、そこから先がうまくいきません
その部分のコード貼れよ
outlookを使わなければならないような身の上には同情する さすがに人少なそうだしいいんじゃないかな 俺はoutlook自体持ってないから良くわからないや。あれまだあるのか
今のOutlookは使いやすくなってるよ 俺の中のOutlookは2000で止まってたから久々に使うことになってびっくりした もはや別物
そうなのか? 大変そうだしoutlook入ってるし使ってみるか、と思ったらメールアドレスが必要なので諦めた 頑張って!
正直メール関係でマクロは怖いな ローカルでサーバ建ててテストするならともかくExchangeでいきなり本番環境でしょ?
アカウント情報やOutlookアイテムの読み取り、アイテムダウンロードだけならExchange環境でのマクロ使用を恐れる理由はないかと思う
すみません、お力を貸して頂きたいです。超初心者です。 固定長形式テキストデータを読み込んで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
続き 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
目がチカチカするから大文字変数関数やめろ COBOLかよ
' 指定ファイルを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使った方が早いと思うので、暇があったら調べるといいよ
>>45 できました…!!
本当に助かりました、ご親切にありがとうございます!!;;
時間が出来たらQueryTableも調べてみます!
>>46 動いてよかった
急いで書いたからDim cDirの行とか要らない行が入ってたわ、ごめんね
テキスト読み込みなのにCSVどうこうとか言っちゃってるし
適当にコード直してつかってね
>>47 了解です。
頂いたコードは今後勉強する時にも参考にさせていただきます…!
本当にありがとうございました!
教えて下さい。 役所の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だから?
教えて下さい。 役所の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だから?
ごめん。
専ブラ不調で
>>49 ,50と、
二重投稿になってしまった。
>>52 ありがとう。やってみた。
・・・
実行時エラー '1004':
'Range' メソッドは失敗しました: '_Global' オブジェクト
だって。
>>53 違うブックや違うシートがアクティブになっているとかで、名前付きセルが見つけられなくてエラーが返ってきてるんじゃないの
ブック名を指定して式を書き起こせば問題なく動くと思うが
>>53 Rangeにブックやシートの指定してる?
MsgBox R_TargetFullPath で何が表示されるか見てみたら?
>>55 ありがとう。
フォルダパスも名前を定義しているんだけど、
まずはその定義名を使わず、以下でやってみた。
With .Workbooks.Open(R_TargetFullPath)
↓
With .Workbooks.Open(Range("E:\Excel研究\前回保存日時の取得\○○の場合\'Last save timeを得るVBA.xlsm'!R_TargetFilePath").Value)
コンパイルは通った。
で、立ち上げているのは自bookだけなのを確認して
マクロを実行した結果、
実行時エラー '1004':
'Range' メソッドは失敗しました: '_Global' オブジェクト
むぅ・・・
>>56 ありがとう。
>>55 はシート名を飛ばしているけど、
定義名があるシート名も入れ込もうとしたら
どう書いたら良いのだろう?
「ファイル選択」がシート名なんだけど、
・・・\'Last save timeを得るVBA.xlsm'!ファイル選択!R_TargetFilePath
でも、
・・・\['Last save timeを得るVBA.xlsm']!ファイル選択!R_TargetFilePath
でも、結果は
実行時エラー '1004':
'Range' メソッドは失敗しました: '_Global' オブジェクト
だった。
>>57 ありがとう。
目的のファイル指定は取りあえず置いといて
画面抑止のままのこの主旨でいいのかな?
Public Sub LastSaveTime2()
With CreateObject("Excel.Application")
.Visible = False
MsgBox R_TargetFullPath
End With
End Sub
で、MSGの結果は、中身がブランク。
>>59 普通にシート指定すればよい
はっきり理解できてないのにブックもシートも指定せずセルを扱うなんて危険なことはやめた方がいい
ところでR_TargetFullPathはセル名と言ってなかったかな?
>Workbooks.Open(R_TargetFullPath)
これが通るってR_TargetFullPathの中にフルパスが入ってるとしか思えない
>>63 > 普通にシート指定すればよい
その「普通」がよく分からなくて。
>>59 で試行したように、
sheet上での関数に他のbookから参照させるのとは
勝手が違うようだ。
> ところでR_TargetFullPathはセル名と言ってなかったかな?
は、
>>50 で書いたとおり、
Worksheet上で普通に
$A$8 = R_TargetFullPath
と名前を定義して
としただけ。
>>64 シート指定とか調べず勘でやってるのか?
基本が無いのに勘で文法は書けないよ、知らないならちゃんと調べた方がいい
名前を定義とは、$A$8セルに「R_TargetFullPath」という名前を付けたと言ってる?
ちなみにVBAでR_TargetFullPathという名前の変数か定数作ったりしてない?
R_TargetFullPathに何を入れたいのかもう一度よく考えてコードを見直せ
いろいろ考えてくれた皆さん、どうもありがとう。
自分の考えを上手く伝えられず、申し訳ない。
自分なりの考えで、確証は得られていないけど、
・"BuiltinDocumentProperties" を使った「前回更新日時」の取得は、対象ファイルをいちいち開かないと取得出来ないため、Public Subでやるしかない。
・が、Range(定義名)では、例えアクティブな自sheet内の定義名でもなぜか上手く取得出来ない。
・ただし、アクティブなセルをCells(行数, 列数)なら値取得が出来る。
ということかと。
ならば、「1つのファイルの日時を取得するのに定義名を使う」考え方を変えて、
・Cells(行数, 列数)を活かして、フォルダにDLした .xl* ファイルの、全ての前回更新日時を取得する。
としたら、出来た。
3つめの "Public Sub LastSaveTime3()" をボタンにマクロ登録
Power Queryで取得したフォルダ内.xl*ファイル一覧表(タイトルが黄緑色の列)の右列に
上記VBAで「前回更新日時」を取得した結果(タイトルが深緑色の列)
ここには北海道のグラサンスーパーハゲザーこないのー?
>>67 ブックとシートを指定せずにセルを指定してるから取得できないと何度…
指定してないからアクティブなシートを拾いに行く
アクティブなシートに名前の定義がなければ当然名前の定義を取得できるわけがない
>>67 Public Subによる制御フローじゃないとドキュメントプロパティを参照できないなんていう制約は存在しないと思う
>>69 仰いますけど、
参照しようとした定義名は、自bookのアクティブsheet内だす。
Range("R_TargetFullPath").Value
>>72 そのシートがアクティブになっていれば取得できる
なってなければ取得できない
取得できないということはアクティブだと思い込んでるだけか、名前が間違ってるか、指定が間違ってるか
>>72 シートは一つ?別のシートにも同名範囲があって特定できないとか?
>>73 これはサブルーチン呼び出しの都合でPublicスコープにしているだけで、BuildinDocumentPropertiesの仕様とは関係ないのでは
>>77 その時は
Range(R_TargetFullPath).Value
としたんじゃないか?
>>52-53 ページに設定しているフィルターの解除をする場合 Range("E5").Select Selection.AutoFilter といった具合にRangeとセットで使うしか無いのでしょうか? ここでは、VBAで「E5」を指定していますが、中のデータが入力により空になる事もある為 Range指定する事なくフィルタを解除したいです。
>>81 ページって何?シートのこと?
それとも印刷範囲のこと?
シート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
>>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 >>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).Resize(, 220) = WorksheetFunction.Transpose(S1.Range("J" & r1).Resize(220)) r2 = r2 + 1 Next End Sub
>>83 シート1には既に220*220の表があって、それをシート2に縦横入れ換えて貼り付けたいってこと?
現在表示しているワークブックからファイル名の一部を取り出して、その数字をMsgBoxで表示するなど他の計算で使うことってできないでしょうか? 例えば「01-5.xlsx」の場合「-5」、「02+5.xlsx」の場合「5」、「03+1000.xlsx」の場合「1000」、「04-1234.xlsx」の場合「-1234」のような形 左の数字は2桁、右の数字は1〜4桁でファイルによって違います 0や小数点以下の数字はありません ファイル名がプラスの場合とマイナスの場合があります 正数の場合ファイル名は+表記ですが記号自体は必要ありません 「マクロを実行しているワークブック」ではなく「現在表示しているワークブック」のファイル名を参照したいです プログラミングの経験が全くなくて先週からマクロを触り始めたので不可能なことを質問かもしれませんがよろしくお願いします
>>84 、866
スゲーできたーありがとうございます。中身よく見て、勉強します。
>>87 シート1に1列で48400ほどデータがあるんで、それを別シートに220*220の表にしたかったんです。
>>88 + または - を区切り文字としてThisworkbook.NameをSplit関数で分割して配列化する
得られた配列の二つ目の要素を取り出して整数型に型変換する
この二つのステップを実現すれば良い
>>88 よく要件を読んだらThisworkbook.Nameより
ActiveWorkbook.Nameの方が良いかも
>>90 -が消える上に.拡張子まで全部取得する羽目になる
ファイル名を.で区切った1個目の3文字目以降を取得して数値変換すればいい
>>81 Worksheets("シート1").Autofiltermode = false
>>83 For NextではNextの後を省略すべきじゃない。
For Eachならまだ分かるが。
それ多分フィルタ掛かってないとコケる。 On Error〜か、If AutoFilterMode Then入れないと。
>>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
ここには北海道のグラサンスーパーハゲザーこないのー?
>>103 使えるけどコマンドプロンプトでトラブルが起きることがあるから推奨しないと主張する派閥もいる
特定のディレクトリに複数のエクセルがあってそのエクセルの特定のシートに値を設定するってマクロを作ったところなんですが特定のシートがない場合は処理を抜けるようにするのってどうすればいいんでしょうか
バイナリデータをエクセルに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
>>105 Dir関数かFileSystemObject. FileExistsで調べられる
>>105 ファイル存在確認じゃなくてシート存在確認かごめん
>>108 シートがない場合の件はForで回して無事解決できました
VBAで名前定義がされたセルに値を書き込む際名前定義の範囲がシート指定の場合操作できないのでしょうか
>>106 出力するデータの型がバイナリになっていないとだめかも
北海道のグラサンスーパーハゲザーはここにこないのー?
PDFからのデータ取得ってどうにかならんもんかな。 Adobeの有料版使ってエクセル変換してるが、フォーマットによってはレイアウト崩れが酷くて使い物にならん。 ハイライトリストも試してみたんだけど、文字がぶつ切りでしか取れなくて、速度も遅い。 座標見ながら文字結合するのもアレだし。 RPA的にコピペするのもマヌケだしなぁ。
そんな馬鹿なことをしなくてもいいように業務フローを見直す、が正解
>>114 理論上はPostscriptを完璧にシミュレートすれば可能なはずなんだけど、かなり面倒だしそこまでやってるアプリは今のところ見た事ない
レイアウトが崩れない変換アプリがあるんなら教えて欲しいわ
PDFのレンダリングは完璧なんだから 取得ができないのは本来おかしいんだけどね
環境は、OS:Windows10, Excel2016です。 初歩的な質問ですが、よろしくお願いします。 エクセル開発タブ⇒マクロの記録を選択 マクロの保存先を新しいブックにしてOKすると、 新しいブックが表示されてしまいます。(EXCEL2010までは表示はされなかった気がします。) 表示させないようにしたいですが方法はありますでしょうか?
>>118 そもそもそんな質問をする理由が分からない
マクロの保存先を作業中のブックに変えればいいだけの話では
RPAとかの都合なのか?
VBAのコードを長時間書いていたら肛門が痛くなりました。 これは何かの病気?いい薬はありますか?
Worksheets(1), Worksheets(2), Worksheets(3), ... が常にワークシートの並び順になっている事を前提にコーディングしても大丈夫ですか?
>>122 OK
シートの並び順とシートのIndexは連動しているから
ただ他人と共有するブックでシートIndexに依存したコードを書くならば、シートの追加や削除や並び替えをユーザー側で行えなくするために、ブック構成の保護をかける必要はあるかも
インデックス値とシートの順にそんな保証あったかな 使い古しのワークブックだと最初のシートがSheet1とは限らない気がするし
sheet1じゃなくてsheet(1)だぞ 左端がsheet(1)
>>126 CodeNameの話じゃなくてシートインデックスの話だぞ
VBAで拡張子がDWGのCAD図面ファイルから文字列と数字を抜き出してエクセルに貼り付けたいんだけどなんかイイ方法ない?
>>130 AutoCADのソフトは持ってないんだけど出来るの?
>>129 VBAからほかのアプリをコントロールする方法があるから、適当なフリーウェアでDXFに変換
DXFはテキストファイルだから文字列がそのまま入ってる
>>134 会社だからあんまりフリーソフト入れたくないんだよなぁ
どこまで読み取りたいのか分からんが、タイトルとかコメントとか作者とかは読み取れるんじゃない? AutoCAD入ってなくても動くか分からんけどCOM用のAPI使って読み取るサンプルならAutodeskのフォーラムに有ったぞ。
>>135 業務上必要だと上司に相談して無理ならできませんでいいやん
DWGファイルを扱うってことはどっかの部署ではAutoCADが動いてるわけだから環境借りるなりすればいい
何がやりたいのか(最終目的が何なのか)分からないが、
AutoCADのスレで質問した方がいいと思う
AutoCAD総合スレ part7
http://2chb.net/r/bsoft/1556080032/ 図面から読み取る仕事が多くてVBAで自動化できないかと考えてるだけだよ。ブラック企業でもないよ。 バイナリファイルじゃ読み取れないし、フリーソフトで一つ一つテキストファイルDXFに変換っていうのもなかなかナンセンスな気がする
>>141 だけど天才の
>>142 に教えてほしい。どうしたらいい?
その図面データに営利目的で使用してはいけないって書いてないか?
CADファイルならVISIOで開けるじゃね VISIOにVBA載ってなかったか
Excelで作成したものをフリーOfficeのCalcで開こうとするとエラーが出るので、違うPCのExcelにコードを写したいのですが、どうすれば良いでしょうか? sheetは5枚でそれぞれデータが入力されています。 そのシートをコピーしてマクロコードをコピペすればできるのでしょうか? コピーはできても貼り付ける場所が分かりません。教えてください。
>>150 よく分からん。
ファイルをコピーしてそのファイルをそのまま使えば良いんじゃね?
要はさ、そのマクロのコ―ドがExcelの何を使っているかで変わるだろ。
コードを追って必要なものをコピーすれば使えるだろうよ。
慣れてる人ならできるかもしれんが 初心者じゃ無理だろ、互換性ないし
OOoのVBAは相当単純なものじゃないと動かなかったような 色々省略するのもダメだったような気がする
OOOBasicなんてあるんだな 勉強する人いるの?
OOOBasicというのか・・・ 数年前きまぐれにちょっと触って、あまりの互換性のなさに逃げ出したわ
なんでBasicにしたんだろね。 後発なんだから選べたはずなのに。
>>158 VBが売れたから、機能はほぼそのままにVBAとしてofficeに搭載した
VCの登場はもっと後
時系列的に仕方ないとは思う
俺もCの方が良いとは思う
>>152 PC1のデータをPC2に移したい。でも、PC2にUSBなど外部のものを差し込めないしネットには繋がるけど仮想?か分からないけどデータをPC2のデスクトップとかドキュメントに保存できないので、
データの中身をコピーしてPC2でExcelを開きペーストすれば良いのではと考えたのですが、
Excelのデータを丸々コピーするにはまずシートをコピペしてその後マクロコードをコピペすれば良いのでしょうか?どこに貼り付ければ良いのかわかりません。
PC2のどこに移したいの? PC2でデータを開き データの中身をコピーして Excel(新規ブック)を開きペーストすれば良い でもその新規ブックは保存できないんでしょ?
>>163 PC2のデスクトップ
Excelを新規で開けば保存できる。
もしくは開きたいExcelのデータCalcでなら開ける。
Calcで開いてコピーしたものをExcelに貼り付けたら出来るのか?セル全範囲コピーして貼り付けてマクロコードもコピーして。
Officeクリップボードをクリアするにはどうしたらよいですか?
ちょっと教えて下さい 自動的に新しいcsvファイルが保存されてくるフォルダがあって 新しいファイルが保存されたら処理をするってコードを作りたいんですが どんな感じにしたらよいのかアイデアが浮かびません イメージは処理開始としてから処理停止とするまでずっと監視と処理をし続ける感じです 正攻法ってどんな感じでしょう?
C#に乗り換えてFileSystemWatcherかな そういうのはサービスにして常時起動したいだろ?どのみちVBAじゃ無理がある
>>174 csvデータは一般機能のpower queryで「フォルダ指定」で取得してから、何らかの加工をする必要があればVBAでやるというのはどうでしょう?
コメントありがとうございます。
C#は知識がなくて・・・。1か月後に必要なんですが今からいけるかな。。。
>>177 すこし理解に時間がかかっています。内容確認してみます。
>>178 参考例ありがとうございます。
更新したファイルだけ処理をしたいのですが、この例だと毎回全ファイルを読むみたいなので
例えば処理したファイル名はシートに記録しておいて
更新起動時に毎回処理したかしてないか判断するのも追加するって感じですかね。
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
>>179 ファイルのアーカイヴ属性を変更すればいいよ。これなら新規以外にも、変更ファイルも拾えるはず。
セルに指定したフォントの情報などを変数(オブジェクト?)として 保持して、別のセルに貼り付けることはできないでしょうか Public Sub textMacro() ActiveSheet.Cells(1, 1).Select ActiveCell.Value = "testTESTtest" ActiveCell.Characters(Start:=5, Length:=4).Font.ColorIndex = 3 End Sub こんな感じで、文字列の途中で色を変えたりフォントを変えたり した情報を構造体配列として保持しておいて、ソートしたり 特定条件で抽出したりしたデータを、書式ごと別のセルに 貼り付けたいのです 上記のようなコードで一旦別のワークシートに書き込んでやって、 そこを参照してコピーすれば解決します ですが作業用ワークシートを作るのが美しくないので、なにか 方法がないものかと悩んでいます
>>188 rangeにでも入れとけばいいんじゃないの
>>189 言葉足らずだったかもしれません
188で書いたコードのように、一旦どこかのセルに書式を設定するのではなく、
書式設定済みのデータを内部で生成したあとでセルに貼りたいのです
>>188 activecellは rangeオブジェクト
rangeオブジェクトは必ずどこかの実態セルに紐付けしないと設定、参照できない
なので、実態セルを使いたくなければ、仮想的に実装するしかない
全てを網羅するには、それは非現実的(ムダ)だから私ならやらない
あとの判断はお任せする
(may be. GL)
ここには北海道のグラサンのスーパーハゲザーこないのー?
>>190 セルのコピーで済む処理をわざわざスクラッチする意味があるのか?
マクロ言語で車輪の再発明をするのは無駄だし結果的に美しくないものが出来上がって終わりなことが多いぞ
まぁ文字列書式の取得をするならRange.Charactersクラスを対象にForで一文字ずつループを回して、Fontプロパティで取れる各フォント属性を調べて構造体配列に格納していけば良い
Characters(i, 1)とか指定すれば一文字ずつ調べられる
具体的にはFontクラスのうち
Bold, ColorまたはColorIndex, FontStyle, Italic, Name, Size, ThemeColor, ThemeFont, Underlineあたりを取得しとけば何とかなるんじゃないか
>>192 >>194 内部データとして、特定の文字だけボールドにしたり赤字にしたりしたデータを
保持しておいて、それをそのままセルに貼れないだろうかという趣旨でした
全然実用性のない例ですが、何らかの名簿データを元データとして入力すると
して、「佐藤」という名字だけを赤で表示したい、というケースがあったとします。
このとき、表示するときに年齢別だったり性別だったりの条件で抽出したりする
際に、毎回セルにデータを書き込むときにフォントの設定をする必要があるのか、
一度設定済みのデータを貼れば済むような方法があるのか、という質問でした
現在は毎回貼るたびにフォントの設定をしているので、もっと効率的な方法が
あるのではないかと考えた次第
でも残念ながら、どうやらなさそうですね
確かにセルをコピーすれば済む話なので、断念します
>>195 鈴木 健二
の鈴木だけを赤文字に設定したセルの書式コピーして
鈴木 太郎
セルに貼り付けしても、鈴木だけを赤にはできなかった
(バージョンによって違うかもだが)
ロジックでやるしかないんじゃないかな
鈴木or宇都宮を赤にするとか
>>196 色々ありがとうございます
今回やりたいのは、鈴木だけを赤くした「鈴木 健二」というセルを作るのに、
事前にデータを作ってからセルに貼り付けたいということですから、
「鈴木 太郎」の「鈴木」が赤くならなくても特に問題ありません
この例で言うなら、コピペ以外の方法で、同じく鈴木だけが赤くなった鈴木健二の
セルを効率よく作りたい、ということですね
>>197 構造体とかでパラメータ設定すればやれないことはない
書式設定対象の文字列の開始オフセット位置と文字列長、フォント属性の設定値からなる構造体配列を作って、一括でRangeオブジェクトのプロパティに代入すれば良い
ただしパラメータを動的に指定する処理やらUIやらを構築する手間とか考えたら結局セルコピーでよくねってなる
office2010から2016へ変えたらマクロの遅さが気になって セルコピーを別の方法でやれないか考えてる
マクロが遅いんじゃなくてPCのスペックが貧弱過ぎるんじゃないか
>>198 そこまでする価値はないですね
自分が知らないだけで、なにか簡単な方法があるのではないかと思って
いたのですが、そもそも需要がない動作なんでしょうね
>>199 変えたのはExcelだけか?
実はOSを10に変えた時にExcelも入れ替えたのではなく?
>>201 そこまでやるならmhtか何かでコード生成してからxls変換してレンダリングする方がいいよねって話になってしまうからな
北海道のグラサンスーパーハゲザーはここにはこないのー?
フォルダ名を取得し名前を変える処理をしたいのですが、フォルダ名の頭に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
>>209 ・セルの書式を予め文字列にしておく
・
Cells(3 + I,1).Value = "'" & Str(f.Name)
・セルに取り込まずに処理する
どれか
>>210 頭に「'」つける案いただきます!
すっかり頭からぬけておりました。
ありがとうございます!
>>209 頭に'付けるとかセルの表示形式を文字にするとか
それVBAじゃなくてExcelの範疇では
VBAはそもそもビジュアルベーシックフォーアプリケーション エクセル(他office製品)のための言語 Excelの範疇も何もないよ
セルにフォルダ名を入れなきゃならない理由が全く分からない
マクロでCSV書き出ししたデータですが どうも1行ごとに最後のセルの末尾に勝手に改行コードが入っているようです これはなんとかならないでしょうか その改行コードもCRLFで言うところのCRだけのようで、見かけ上全くわかりません aaa,ddd,ccc とあったら、cccの末尾に見えないCFが張り付いている感じです urlエンコードで見ると ccc%0D みたいな感じです どうしたら綺麗に書き出せますか?
>>216 改行コードをなくした場合、行の区切りはどうするの?
完全に思い通りにしたい時はテキストファイルの生成を自力でやるしかない
>>216 ExcelではLFがセル内改行、CRLFが次の行
CRは意味を持たないので入ってても改行されない
消したければ普通にその文字を消せばいい
あと勝手に入ってるのではなく元々のテキストファイルに入ってるんだろう
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)、
若干気持ち悪いですが、趣味プログラムなので運用で対応します。
みなさんありがとうございました。
北海道のグラサンスーパーハゲザーはここにはこないのー?
>>216 Excelのsheetに読み込んでから、CRLF等を""に置換する
ではダメ?
一般論として例えば、Ruby のCSV の規格にも、 行区切り文字・列区切り文字・クォート文字などがある 特に設定しないデフォルトでは、それらは、 改行コード・カンマ・ダブルクォーテーションになる もし、それらが無ければ、CSVの要件を満たさないw つまり、CSVの規格ではありませんw
ルビカスが何を言おうと、世の中ではExcelが出力するCSVが標準のCSVだ
CSVは自前でテキストファイル読み込み+自前で区切り扱いが基本。 区切りが何であろうと、データの形式が何であろうと全て自分でコントロール出来るし速度も速い。
同意。てか、Excel標準のCSV読み込み仕様もうちょっとなんとかなりませんかね・・・?
それはさておき
>>216 &
>>221 (もう見てないかもだけど)
その「CSVファイルを配列に取り込むJavaScript」のコードに問題があるんじゃないかなと。
具体的には\n(%0A)でSplitしてるから\rが残ってるだけだと思うけどな。
モダンExcelが一般化してきた今ならクエリでCSVの開き方を指定して読み込むのがいいんじゃないの CSVをエクセルで直接開くといろいろ勝手なことをしてくれるので
PowerQueryのコードを書くのはVBA以上にハードルが高いぞ
PowerQueryコード書かなきゃいけないの? GUIでできる範囲だと不十分なの?
そんなにハードル高いか? テキストファイルの読み込みの処理をスクラッチするより明らかに楽だし処理速度も速いと思うが 例えば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
PowerQueryだったらもっと簡単だろう Csv.Documentにソースのパスとメタ情報を渡してテーブルを取得するだけだしGUIでステップ記録できる
CSV読み込みの話してんのになんで書き込みの回答してんだろうこの子
>>234 >>232 のコードについて言ってるなら、読み込んでシートに書き出してるわけで、クエリの使い方としてはオーソドックス処理だぞ
読み込んだ結果をシートに書き出さないならODCにデータモデルとして保存すれば良い
>>235 ODCにデータモデルとして→×
データモデルとして→○
>>230 全然。
基本的にはリボンの機能使った操作が1つずつのステップになっていく。
ステップの1つ1つがマクロみたいなもの。
「詳細クエリー」を見て初めて「コードはこうなってるんだ・・・」
という感じ。
もっとも、M Functionのレファレンスやパラメータあたり説明が
英語でもまだ不親切なので、
使えてない部分が多分にはあるけど。
ただ、VBAのように出来る範囲が広範囲なわけではなく、
取得したデータの成形に特化してる。
スクレイピングについては
Pythonみたいに取得対象のWeb画面で
IDやパスワード入力するとか、
ボタンを押すみたいなことも出来ない模様。
データの成形に特化と言ってもVBAでスクラッチすると恐ろしく面倒なJoinとかのSQLチックな処理は全て実行できるので、データ処理の面ではVBAより手軽で便利 あとAccessDBやSQL ServerやOBDCはもちろん、ファイルシステムとかExchangeサーバとかSharePointリストとか、およそデータベースとして扱えるデータストアの情報は全て取得できる フォルダ内のファイルの属性情報を取得する処理のためだけにいちいちFileSystemObjectのインスタンスとかを使ってスクラッチする必要がなくなると考えればめちゃくちゃ便利
>>227 みています
ご指摘の通り、\nでspritかけてました!
\nってCR+LFじゃなかったんですね…
この後都合があるのですぐには試せませんが、
その辺確認してみます。
ありがとうございます!
\nはLFじゃなかったか windowsの改行は\r\nだったような
EditBoxでは\r\nでRichEditBoxでは\nだねWindows
CR+LFの定数の vbCrLf か vbNewLine でいいんじゃね
>>239 やっぱり。
>>240-241 の人もいうとおり、OSだけじゃなくAPI関数ごとに改行コードの取扱いが違ったりすることもあるし、
テキストエディタに内蔵されてる正規表現なんかでも「\n」でCRLFに対応させてる例もあったりするから、
その辺はトライ&エラーで覚えていくといいとおもうよ。
北海道のグラサンスーパーハゲザーはここにはこないのー?
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" () Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long Expect end of statementとエラーが出ます。 なにがいけないのでしょうか?
>>247 ・DLL名(urlmon)の後の()が余計
・1行目と2行目の末尾に「半角スペース」+「半角アンダースコア」がちゃんとついているか確認
↓こんなかんじ
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _
ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
>>248 ありがとうございます。
スペースとアンダーバーが必要だったのですね。
初心者につき基本的な質問かもしれず恐縮なんですが、 @Range("A10:B12").Value = Range("A1:A2").Value とすると、A12:B12は#N/Aとなり、A10:A11、B10:B11はA1:A2の値が貼り付けられるのはなぜでしょうか。 ARange("A10").Value = Range("A1:B2").Value とすると、A10にA1の値が貼付けられるのはなぜでしょうか。 @については、入力元の行・列範囲が1の場合はそれをひと固まりと認識して、 出力先の行列範囲>1の部分も入力元の値を入れようとするため Aについては、エクセルの構成上、選択範囲の開始は左上端であり、 出力先が1セルしかない場合は入力元の範囲の開始セルのみを貼り付けようとするため などと理由(というか状況でしかない)を言語化してみたのですがいまいち腑に落ちず… もし仕組みをご存知の方がいらっしゃったら教えていただけませんか…?
Range の使い方ぐらい、検索すれば見つかるのじゃないの? 他人が作った仕様を、推測するのは時間のムダ それに、推測して当たっているように見えても、 仕様書で確認していない推測では、どのみち仕事では使えない 君のその推測は、確実なんだろうね? と、単に聞かれても、返答に困るw たぶん、間違いないと思いますと言っても、 たぶんじゃ困る、仕様書を確認してくれと言われるので、 結局、推測した時間はムダw
>>250 まずは右辺のセル範囲が定数、(複数セル参照)式でどうなるか試してみよう
試す、予想する、検証するのが大切
Power Queryの式がVBAで取得編集出来るの初めて知った 凄い便利だわ
>>240 -
>>244 ありがとうございます、お陰様で完全解決しました!
結論としては、
>>227 のご指摘が丸ごとそのままでした。
勉強になりました。。。
結局スレチになってしまいましたが、皆様ありがとうございました。
>>255 そうそうこのあたりの機能だな
流石にM言語はエディタ使って書いた方が綺麗に書けるからマクロ記録に頼る理由はないが
あとModelオブジェクトというのも追加されてて、そっちはデータモデル関連を扱える
VBAも本当にモダンExcel向けの機能が充実してきたなぁという感じ
モダンってオワコンWPFの印象が強すぎてちょっと・・・
WPFとSilverlightどっちを習得しようと悩んでた時期が、僕にもありました
>>259 silverlight懐かし〜
自PCでサバ公開して遊んだな〜
今では怖くてできないw
あのwebなのに何でもできる(未来)感は素晴らしかった
どうでもいいんじゃないの。 そんなのが会社のPCで普通に使えるようになるのは、どうせ何年も先の事だろう。
>今後数週間以内に企業向けの“Office 365”(E3/E5ライセンス)で利用可能となる。 読めないのか?後数週間でVBAは駆逐されるかもしれんのだぞ?
若い人は知らないだろうけど、昔、リニアモーターカーというのがあってね。
>>264 そのくだりを読んで数週間で駆逐されると思う方がおかしい
IE非対応な時点で察しろ
> 既存のVBAは比較的ハイスキルな開発者向けである どこの時空の話だろう
これWeb版の機能だろ。 そもそもExcel95の時代からマクロの記録機能は有るだろ。
↓のマクロを実行するとエラー438になって動きません。原因を教えてくださいm(__)m ・DE3とDS3の値のいずれかの高い数値が1であれば、11行目〜12行目を削除 ・DE3とDS3の値のいずれか高い数値が2であれば何もしない ・DE3とDS3の値のいずれか高い数値が3以上であれば、11行目〜12行目をコピーして DE3とDS3のいずれか高い数値−2回を、13行目以降に2行づつ貼り付ける *DE3とDS3はいずれも1以上の整数です Dim i As Integer Dim cnt As Integer, a As Range With ActiveSheet i = .Max(Range("DE3", "DS3")) Select Case i Case Is = 1 .Rows("11:12").Delete Case Is = 2 ' なにもしない Case Is >= 3 .Rows("11:12").Copy Set a = .Range("A13") ' 貼り付け開始位置 For cnt = 3 To i '3以上のときはその値回数分貼り付けを繰り返す a.PasteSpecial xlPasteAllMergingConditionalFormats '貼り付ける種類はお好みで Set a = a.Offset(2, 0) ' 貼り付け先を2行下へ Next cnt End Select End With End Sub
>>272 i = WorksheetFunction.Max(.Range("DE3", "DS3"))
やっぱり少し騒ぎになってたか お前らこれから少しは Javascript勉強しといた方がいいぞ
>>276 JSは癖があるけど、あれはwebの話
既にあるオブジェクトに対してどうこうするならVBAと特に変わらんぞ
adobeのJSは本当にクソだった
※オブジェクトに名前がついてないので、「topプロパティが一番大きいオブジェクトにはxx」などと名付けをしなければならなかった
VBAで無名関数とか即時関数は別にやらんやろ webのJS使ってる人が参入しやすいようにしてるだけやで
Googleスプレッドシートの マクロ(GAS≒Javascript拡張)を移植するだけだぞ
TypeScriptベースってあるけど 本家と比べてどこまで厳格なのか分からんが
Typescriptはアクセス修飾子をサポートしてるから即時関数でのスコープ管理はしなくていいだろ 無名関数は使いどころあるかもしれないが
wshのjscript使うのとはまったく違うのかな?
お前らってプログラミング言語の話題になると、何ですぐ時代遅れ論争始めるの?
結局仕事の効率を上げれるかどうかが肝だけど新しい言語を使ってる俺すごいで思考停止しちゃうんだろうなー
TSが時代遅れはともかくVBAはさすがにもう仕事の効率とかそういう次元の話じゃない クレジットカードの有効期限が迫ってるようなもんだ
Option Explicit
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub TableControl()
Dim ie As InternetExplorer
Dim targetURL As String: targetURL = "
http://www.ikachi.org/sample/sample10.html" ;
Set ie = GetIEObject(targetURL)
If (ie.LocationURL = "") Then
MsgBox "Plz Open the Web page"
Exit Sub
End If
End Sub
Public Function GetIEObject(ByVal targetURL As String) As InternetExplorer
Set GetIEObject = Nothing
Dim sh As Object
Set sh = CreateObject("Shell.Application")
Dim w As Object
For Each w In sh.Windows
If (TypeOf w Is InternetExplorer) And (w.LocationURL = targetURL) Then
Set GetIEObject = w
Exit For
End If
Next
End Function
でie.LocationURL = ""でエラーが出るのですが、booleanだがらでしょうか?
何にも分かってないバカが多い。 汎用言語は正に競合だらけだからこそ、VBAの優位性が理解出来ない。 VBAの対象となってるのは他言語じゃゴミしか出来ない。 今後、TSで同じようなことが出来るならTSに移って行くだけのこと。
>>289 > ie.LocationURL = ""でエラーが出るのですが
なぜかエラーの内容は極秘なんだよね…
>>289 そもそも、これVBAのコードなの?
なんか、初心者がコピペしたんじゃないの?
個人的に間違っちゃいないけど気になるのは、InternetExplorerで宣言してるのにCreateObject使ってる所。
間違ってると思うのはTypeOf。
VBAでこんな単語使ってるの初めて見た。
構文的にこの部分でエラーにならないのにびっくりした。
どちらにしろGetIEObjectでieが空っぽで帰ってる。
一応言っておくがTypeOf自体が間違いじゃない。 こういう単語を使ったコードもあり得る。 でも自分は見たこと無いし、今回のコードもここが間違ってる。
>>293-294 いや、コード的には間違ってない
>GetIEObjectでieが空っぽで帰ってる
のは間違いないけど、このコードが正しく動く前提として
IEで指定されたURLが開いてる必要があるだけ
まあ指定URLが開いていたら、下のIFがスルーされるから
示された部分だけでは何がしたいコードがよくわからんが
一応Win10の365で動くか試したみた結果ね つか気になってちょっと調べてみたけど TypeOf って日本語ドキュメントに記載ないっぽいな VBAのバージョンとかで使えないかもしれん なんにせよShellでIE取得して操作とかお勧めしかねるけどな
289です。 >> 292 すみません、エラー内容は「オブジェクト変数または With ブロック変数が設定されていません」です。 >> 293 Excel VBAでクローリング&スクレイピング(五十嵐貴之著)のP137に書かれているコードなのですが。 余りよくないのでしょうか。
>>297 > すみません、エラー内容は「オブジェクト変数または With ブロック変数が設定されていません」です。
原因は
>>295 が書いてる通りだと思うのでとりあえずIEでサイト開いてから実行してみて
> 余りよくないのでしょうか。
残念ながらあんまり良くはない
例えば
> If (TypeOf w Is InternetExplorer) And (w.LocationURL = targetURL) Then
とかVBAが短絡評価しない事を知らないみたいだし
北海道のグラサンスーパーハゲザーはここにはこないのー?
キタ━━━━。゚+.ヽ(´∀`*)ノ ゚+.゚━━━━!
>>298 そもそもShellWindowsオブジェクトはイテレータでIEオブジェクトを渡してるから型判定自体不要
修正版
Sub TableControl()
Const targetURL$ = "
http://www.ikachi.org/sample/sample10.html" ;
Dim ie As InternetExplorer: Set ie = GetIEObject(targetURL)
If ie Is Nothing Then MsgBox "Plz Open the Web page": Exit Sub
'残りのコード
End Sub
Public Function GetIEObject(ByVal targetURL As String) As InternetExplorer
For Each GetIEObject In CreateObject("Shell.Application").Windows
If GetIEObject.LocationURL Like targetURL Then Exit Function
Next
Set GetIEObject = Nothing
End Function
久々に書いたから変な部分あるかもしれないが、これで一応MsgBoxは開く
個人的には、こんなややこしい事せずに普通にVBAで開いた方が確実だと思う
AndAlsoやOrElseはVB.NET もうVB.NETでもいいからExcelに載せろよとは思う
はいネトウヨ論破wwww 現実という劇薬を投与されて憤死したなwwwww
>>301 ありがとうございます。
メッセージがちゃんと出ました。
基本的な事ですいません。 ActiveWorkbook.SaveAs Filename:=Cells(2, 36) & yyyy & "年" & mm & "月" & dd & "日" & ".xlsm" セル内の文章 と日付でセーブする機能を盛り込んでいます。 実行時ファイル名が変わってエラー無く、VBAが動き続けているのですが、 saveするフォルダ内に該当のエクセルファイルそのものが見当たりません。 見かけ上の問題だけか?と思い、停止してフォルダを検索しましたがエクセルファイルはありませんでした。 ActiveWorkbook.SaveAs Filenameというのは、新しく名前を付けて保存なので、中身はともかく実行されたらエクセルファイルは生成されますよね?
すいません。自己解決しました。 指定フォルダにsaveする記述がズレていただけでした。
キタ━━━━。゚+.ヽ(´∀`*)ノ ゚+.゚━━━━!
Excel2019で、 .ActiveWorkbook.SaveAs FileName:=FilePass, FileFormat:=51 ってやると、 'Book1' の変更内容を保存しますか? ってダイアログが出て保存できないね。 どうしたらいいだろう?お手上げです。
>>314 はいを押しても
'Book1' の変更内容を保存しますか?
って同じダイアログが出続けて保存できません。
>>315 Application.DisplayAlerts = False
そんなの出たっけ? CSVだとしつこく聞いてきたような記憶があるが。
>>313 「保存されたこと」にしてしまえば?
オブジェクト.Saved = True
間に何かのイベントが反応して、何も変更してないのに、変更したと見なされちゃってるとか?
揮発性関数を使ってるとファイルをオープンしただけで変更したと見なされる
CreateObject("Excel.Application") で C#からExcelを操作してます。
Excel2016までは正常にできてたけど、Excel2019になってこの症状が出ています。
>>316 いいえでも無限ループ
>>317 効果ありませんでした。
>>318 Excel2019で出るようになりました。
C#ってウソだろ? VBAの構文しか見えないが。 今はそんなことになってるのか。
どうせC#のコード内でExcelを呼び出してるんだろうね。
競馬やる奴、毛根をハーゲットに取り込む方法教えます
自作データベースをエクセルでも管理できるように 簡易CSV形式(つまりカンマで区切っただけ)のテキスト出力できるようにしたんだけど 文字コードがUTF-8だと自作→エクセルなら大丈夫なんだが エクセル→自作に戻すと文字化けする。 エクセルのCSVってShift_JISでしか出せないの?
あー最新版ならファイルメニューにあるんだな・・・ おれの2010だわ ありがとう
>>326 効果なし。
タスクマネージャーを確認すると、Excel終了できないで残ってるし。
Excel2019ってキングソフト以下の糞になったのかな。
>>332 残ってるのは自分がちゃんと解放してないからですな…
ADO使う時、VBAだとExcel8.0も12.0もいけるのに、VBSだと8.0しか使えない。 12.0を使おうとすると、プロバイダがないだのISAMがないだの言われる。 多分、VBAだと参照設定でADO2.8とか6.1を選べるけど、 VBSはCreateObjectで、自由に選べないのが原因じゃないかと思うんだけど、 具体的にdll指定する方法とか無い? え? Accessの何とかコンポーネント入れろって? 会社のPCだから、使う人の分申請するの面倒なんだよ。 え? そもそもVBSスレじゃないだろって? あっちは何か変なのが住み着いてるじゃん。クリボーみたいなAA貼って。
>>334 CreateObjectにバージョンまで書くだけ
気持ち悪いよねVBSスレ 死んでくれないかな誰とは言わないけど
>>333 そんなのちゃんとやってますわ。
Excel2016 までは普通に動いてたんですよ。
>>337 なにやってもダメ。タスクマネジャーから強制終了するしかない。
てか今日はなぜか再現しなくなった。
Excelって何かアップデート入った?それともWindows10起因かな?
普通、PowerShell, VBScript などで、 Excel, IE などを起動すると、プロセスが残る プロセスを終了させるには、名前で調べて、終了させないといけないから、 名前が一致すれば、無関係のプロセスも、終了させられてしまうw
>>334 VBS のスレ主のピッコロ大魔王は、すごい使い手だよ。
VBSで、5ch をスクレイピングしたりもするし
ただ、荒らしに粘着されてる。
コテハンは目立つから、どうしても粘着される
>VBSで、5ch をスクレイピングしたりもする スキルとしては下の下なんだが
でもまともなエディタないのにスクレイピングできるってちょっとすごいと思うわ
>>335 CreateObject("ADODB.Connection.6.1")も、
CreateObject("new:{B691E011-1797-432E-907A-4D8C69339129}")もダメだったわ。
ActiveXコンポーネントを作成出来ませんって。
何がダメ?
もういい加減IE辞めたら? あんたの会社セキュリティ意識なさ過ぎじゃない 大丈夫なの?表の仕事はしてない会社なのか
VBAを捨てられない組織がIEを捨てられるわけがないだろう
IE?
何の話?
>>335 はADOの話だし、
>>340 のスクレイピングはIEとは言ってないよな。
それともスクレイピングはIEでしか出来ないレベルの人?
>>348 何それ?
どうしてもダメなら、最悪MSQuery使うつもりだけど、
シート名の指定が変な特殊文字で面倒臭いんだよな。
>>106 これと同じ人なのですが、レコード番号が不正と出ます。
セルの指定が上手くいってないのだろうとはわかりますが、どうしたらいいかわかりません
すごい初歩的なとことで躓いている気がするのですがご教授ねがいます
Sub Test_Open()
Dim a As Byte
Dim strFilePath As String
strFilePath = ActiveWorkbook.Path & "\data.bin"
Open strFilePath For Binary As #1
Dim i As Integer
For i = 1 To 6
Put #1, Cells(i, 1), a
Next i
Close #1
End Sub
>>353 For i = 1 To 6 a = Cells(i, 1) Put #1, , a Next ありがとうございます! やっと一歩進めました ただ最終的に、ある行の1〜数万行のデータをその数値のままバイナリデータに変換したいので 現在だと 17 なんかは 11 00 のように入力されてしまうことと セルの Cells(i, 1) 数値の方を変更すると型の不一致と出てくることは何が原因でしょうか 小さすぎるかと思って As Byte を As Long にしてもダメでした
型の範囲よく判ってないならちゃんと調べた方がいいよ
型の範囲……調べてもそう難しくなさそうなのに何故か不一致の時は不一致に ただ、いろいろ試していたら行の指定や範囲の指定はなんとかなったんですが、 やっぱり数値が16進に置き換わってしまいます Dim a As Byte をStringとかに変えると まあ文字列になってしまうし
>>358 セルに入ってる数字は最大いくつ(何バイト分)なの?
もしかして、やりたいのはこういうことか? Sub Test_Open() Dim a As Integer Dim strFilePath As String Dim i As Integer strFilePath = ActiveWorkbook.Path & "\data.bin" Open strFilePath For Binary As #1 For i = 1 To 6 a = Val("&H" & Cells(i, 1).Text) Put #1, , a Next Close #1 End Sub
お手間をかけます
セルの値は00〜FFの範囲で セルの見た目そのままをバイナリに落とし込むことを目的としています
例えば書いていただいた
>>360 では
セルの値が 01 だと書き出したほうは 01 00 となるので
後ろの 00 は省いて書き込みたいと考えています
>>361 それなら最初の宣言を
Dim a As Byte
に戻すだけ
ああ、出来ました! i の範囲もLongにしたら数十万も対応できたので思っていたのが完成しました 長々と丁寧にお付き合いいただき、ありがとうございます!
>>363 エクセルの最後までいくとえらーでるんじゃね
実行するとめっちゃ重くなり、一度エラーがありましたが、 その時以外は、成功しています
話しは変わりますが、”Microsoft Office Desktop Apps” と表示されてる方がデスクトップ版じゃなくてストアアプリ版だって本当ですか?
一つのシート上の複数セルに関数が設定されています。 すべてのセルの関数の処理が一つ一つ処理されていき、最終的にすべてのセルの更新処理が終わったときに、あるマクロを動かしたいのですが、どうやればいいのでしょうか?
>>367 セルの関数を指定のタイミングと順番で処理したいってこと?
関数の入ったシートのEnableCalculationプロパティをFalseにして、
計算したい関数の入ったRangeのCalculateメソッドを順次呼べば一個ずつ処理できる
それで最後の関数の計算が済んだ後にマクロを実行するとか
一応関数の計算終了時に動かすマクロはシートのCalculateイベントに書いても実行できるけど、
シート全体が対象だからCalculateメソッドが走るたびに発火するから使えないと思う
>>370 ありがとう
試してみます
自分で作った関数を引数変えて500セルくらいが呼び出す状態なんです。
んで、かなり遅くて、全部が終わるまで5分位待つことになるので、それではつかいものにならないので、高速化を図りたいのです。
そろそろ python とか考えた方がいいデータ量だな
>>371 そういうのは、いちいちワークシートとか数式を使わずに、全部配列で処理すれば5秒で終わるよ
そう思っていた時代がありました。 セルに数式とかダセェぜ、これからはSQL
500セルに対するETL処理だからPowerQueryでインメモリ処理すれば良いのでは
>>375 DSUMなんて使うからだろw
というか、Dの付く奴は手軽だけど使わないのが基本じゃ無いの?
dsumよりサブクエリの方が速いのが納得いかん。 あんな遅いの、何であるんだ? 俺の使い方が下手なだけで、速く使える人もいるのか?
>>379 db関数はAccessから持ってきただけのなんちゃって関数だと思っている
実装後にブラッシュアップでも考えていたのかもしれないが、今となってはもう・・・
新聞配達しながらプログラミングのこと考えてたんだが オブジェクト指向こそプログラミング的発想の1丁目1番地で オブジェクト指向が解らないやつは3流のクズってことで結論出ました。
>>382 高評価
・プログラミングできるのに新聞配達?何も分かっていないだろうと思わせる
・コンビニ店員ではなく、新聞配達というというのも良いチョイス。考え事ができそうなイメージがある
・ただ惜しいのは「プログラミング的発想」。プログラミング的発想が原初のプログラミングを指すならさすがに手続き型になる
・恐らく元は別のコピペであることは容易に推測できる
コピペにしろ、なかなか良いチョイスではあるが、詰めが甘い
転記元の最終行を取得するところで1004エラーがでる Dim fl As String Dim WBo, Wbd As Workbook Dim a As String Dim ex As String Dim syamei As String Sub 変換ファイル選択() syamei = Range("B3") fl = Application.GetOpenFilename ThisWorkbook.Worksheets(1).Range("C1") = fl Set WBo = Workbooks.Open(fl) MsgBox "出力先を選択" With Application.FileDialog(msoFileDialogFolderPicker) .Show a = .SelectedItems(1) End With With ThisWorkbook.Worksheets(1) ex = a & "\" & .Range("B3") & "_" & Year(Now) & "_" & Month(Now) & ".xlsx" .Range("C2") = ex .Activate End With Set Wbd = Workbooks.Add Wbd.SaveAs ex ThisWorkbook.Worksheets(2).Activate ActiveSheet.Copy Wbd.Worksheets(1) ThisWorkbook.Worksheets(1).Activate End Sub
Sub 変換処理() Dim Wsd As Worksheet '請求書 Dim Wso As Worksheet '転記元 Dim i As Long 'ForNext用 Dim j As Long Dim ko As Long '個数 Dim Kohani As Range Dim fnkohani As Range Set Wsd = Wbd.Worksheets(1) Set Wso = WBo.Worksheets(1) Const Dhin = 1 Const Dtan = 2 Const Dko = 3 Const Dkin = 4 '転記元定数 Const Ohin = 4 Const Otan = 3 Wsd.Activate With Wso Range("E3") = Year(Now) & "/" & Month(Now) j = 7 For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(i, 1) = syamei Then MsgBox syamei End If Next i End With End Sub
>>384 もうちょっとテストしやすい形にしてくれ
>>384 最期から三行目ぐらいでエラー。原因は多分ファイルの構成かなんかだろう
>>385 エラーにならない
エラーになるファイルか、スクリーンショットでも貼ってくれ
>>386 たぶんこうじゃないかな
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
Excel VBA初心者です。
やりたいことに似ているサンプルを読み解きながら
勉強中です。
初歩的なことで申し訳ないのですが、ご教示いただければ
ありがたいです。
クローズメソッドの説明を
https://www.tipsfound.com/vba/11006 読んででいたのですが、説明文で
Call wb.Close(SaveChanges:=True) ' 変更を保存して閉じる
Call wb.Close(SaveChanges:=False) ' 保存しないで閉じる
というのが出てきました。
Call と付いている意味がわからず、call について調べてみたの
ですが、プロシージャの呼び出しについての説明しか見つけられず
困っています。
どうぞよろしくお願いいたします。
>>389 Callは引数に指定したプロジージャに制御を渡して呼び出すVB6のステートメントで使用するキーワードだよ
CallキーワードはVBAの文法上省略可能
Callを省略しない場合、呼び出すステートメントに渡す引数__ argumentlistは括弧括り・カンマ区切りの形式にしないといけない
つまり以下の二つの命令はどちらもCallステートメントで、同じ動作・効果をする
wb.Close SaveChanges:=False
Call wb.Close(SaveChanges:=False)
エクセル以外はインストール出来ないって特殊会社にこき使われてる社畜は無視してその他の人はVBAなんて覚える価値は全くないから騙されるなよ エクセルデータを読み込んで加工するなんて簡単な事
場合によりけりだろう Excelの読み込みができる言語ならエクセルデータの加工が可能なのは事実だが、VBAが手軽なのは間違いない 今やPower Queryの操作もVBAで行えるから、VBAを呼び出し元にして複雑なデータ加工を高速で行うことも可能になってる
>>389 call つかうと引数の括弧が必須になるんだよ
使わないときは括弧つけるとエラー
そんで変数=関数(引数) みたいに返り値を取る場合も括弧が必須になる
つまりcall 使うと括弧有無の記述を統一できるんだね
VBAでのPower Query操作ってクソだよね letからinまでのステップ全体がFormulaプロパティに長い文字列として収まってるだけ vbaの貧弱な文字列操作で弄りたくない
>>391 >>392 まず、基本的に対象が違う。
Excel以外はExcelブックとの連携であり、Excelファイル操作が主題。
ExcelではExcelを開いた状態で、Excel上での作業を効率化するもの。
従って基本的に競合しない。
何故、Excelファイルが使われるかと言えば、Excel上で何らかの作業をする為であり、その作業が仕事に大きな意味を持つから。
その大きな意味によってExcelというアプリケーションが使用されている以上、VBAの優位性は動かない。
>>390 >>393 わかりやすいご説明ありがとうございました。
もっと勉強して、みなさんの会話に混ざれるように
なりたいです。
職場でExcelのひな形をコピーして、顧客リストの顧客コードを
シートの指定のセルに書き込み、Book名にも付加して、名前を付けて
保存、というのを2000個くらい毎年度初めに作るのが若手のお仕事よ!
と仰せつかり、歴代の先輩方は手分けして「手作業で」やっていたと聞き、
「いやいやいや、何時代よ!」と勉強を始めました。
>>399 ここ煽りやアンチばっかだからもっとマシな場所に混ざりに行ったほうがいいよ
>>394 長くなるかどうかは書き方次第だろう
Let In構文はMの文法上必須ではないので、変数を極力使わずLispのような記法で短くまとめても良い
>>399 コーディング含めて1時間あれば出来そう
けど便利屋になるのだけは避けた方がいいぞ。
今後そういう処理は全部お願いってなって、雑用みたいな仕事ばっかり来るはめになる。
プログラマーは評価されにくく、いいように使われやすいから。
コードをしっかり管理して、そうならないようにな!
アホな職場上司もとい老害同僚からは 仕事減るから余計な事するな と言われる可能性も
まじでそういう馬鹿上司いそうで困るな しかも外のセミナーで自動化で人件費コストカットとか吹き込まれたら躊躇なくクビ切ってきそう
シート上に配置したコントロール(ボタンなど)の名前を調べたり変更したりするには どうすればよいのでしょうか シートにたくさん画像が貼り付けてあるので、それらを一斉に消去するために Public Sub pics_delete(sname As String) Dim delShape As Shape For Each delShape In Worksheets(sname).Shapes If (delShape.Name <> "btnDelete") Then 'delShape.name = btnDelete delShape.Delete End If Next End Sub こんな感じのコードを書いているのですが、配置したボタンの名前をワークシート上で 参照/変更することが出来ません 仕方ないので、一旦全てのシェイプが消えたあと再度ボタンを配置して、上記プログラムの コメント部分を切り替えています プロパティを見ても、オブジェクトとしてワークシートが選択されてしまうようで、ボタンを 選択した状態でプロパティを見てもボタンの情報が参照できません
>>407 shapesは図形
コントロールはフォームコントロールかActiveXコントロールで扱い方違う
>>408 あ、すいません
プログラム上ではなくて、excelの画面上でボタンの名前を確認、変更したいのです
ちなみにボタンは「開発」タブの「コントロール」で「挿入」から選べるものを使ってます
>>409 だから、フォームコントロールとActiveXコントロールのどっちなの
>>411 名前を調べるなんて煩瑣な処理にしなくても、フォームコントロールだけを消さずに画像だけを消したいなら下のようにやれば良いのでは
Public Sub pics_delete(sname As String)
Dim delShape As Shape
For Each delShape In Worksheets(sname).Shapes
With delShape
If .Type <> msoFormControl Then
If .Type = msoPicture Then .Delete
End If
End With
Next delShape
End Sub
delShape.Typeで取得できる図形タイプを表す定数値がMsoShapeType.msoFormControlだったらフォームコントロール、MsoShapeType.msoPictureだったら画像だと判断するようにする
他にも消したいタイプの図形があるなら削除判定の箇所で任意のMsoShapeType列挙体に当てはまるかType属性を持っているかどうかを判定させたら良い
>>411 ホームタブ右端の検索と選択→オブジェクトの選択と表示
からシート内オブジェクトリスト出てくるけどこれが名前だったかな
あとは新しいVBAウィルスが出てセキュリティ業者が騒いだらVBAは本当に終わりだな
>>414 それ前にも貼られたけど、今までのとの違いが分からんのだが
>>414 VBAでもできる範疇なら全く覚える気起こらん
>>412 本来はこれがやりたかった、shapeのプロパティをちゃんと調べていなかったので
出来なかった処理でした
他にも似たような処理があるので、コード使わせていただきます
>>413 私の質問に対する回答は、これが求めていたものでした
開発タブしか見ていなかったんですが、ホームタブでいけたんですね
お二人共ありがとうございました
>>417 そうか?
俺はVBAの代わりにTypeScript使えるなら乗換えるよ
>>420 どの程度使えるかだな。
全く同じことができるなら乗り換えるだろうな。
まったく同じことしかできないなら乗り換える要素がない
全く同じことができるなら、新規に憶えるだけじゃん。 それはこっちの労力だけで済む。 今後移行していくとすればその程度大した問題じゃない。 今まで他言語では出来なかったり、不便だったからVBAを使っていたわけでね。
>>422 同じことが楽にできるなら乗り換える理由になるでしょ?
今までと同じことをするだけなら、今までに書いたコードをそのまま使い回すのが一番楽だよな わざわざ書き直す手間はだれが負担するんだ
>>425 いうてVBAなんて実質的には大したことやってないのが大半だろ
資産価値なんかゼロだよゼロ
コーダーの能力が低すぎて驚くほど冗長なコードになってるのは多いけど
sheet("sheet1").select! さよか〜 個人的にはjQueryが一番嬉しい あれ、記述が超絶楽ちんなんだよ。cssセレクタとかExcel vbaと感覚的にかなり似てる部分があると思う $("sheets!").cell(1,2).backgroundcolor("red") とかね と書きながら思ったけどこれ別に言語買える必要ないな googleのapps scriptは冗長でかなりめんどくさい 強制的にアドイン扱いだしタイプが長い
>>425 書き直す必要は無いでしょ。
これからの話。
>>426 君のコードは大したことやってないの間違いじゃね?
ぶったけインテリセンス次第なんだよなぁ javascriptでインテリセンスが優秀なら移らない理由ないし インテリセンスが不自由ならVBAやめないし
>>429 VBAに大したことやらせなきゃいけないなら設計ミスだよ
それがPythonだったら同じことやってても倍の年収貰えるのにもったいない
VBAのセキュリティは大問題 まともな会社は使用禁止 あんたの会社は禁止されてるよね?
今まで、銀行、通信大手D社、保険、金融で働いたが禁止になってる所なんて無かったがね。 寧ろ、他アプリのインストールは基本禁止だったけど。
そういやあ、某電気メーカーとかも2ヶ所有るけどどっちも禁止じゃ無かったな。
>>437 VBA にどんなリスクがあるというのですか?
VBAはブックを開いただけで何でもやりたい放題で、脆弱性とかそういう以前の問題なの 例えるなら、訪問者に対してインターホン越しに応対するなどの身の安全を守る手段が何もなく、 無視するか家に上げるかの選択肢しかない
>>444 その例えは例えになっていないと思いますよ
具体的にどういう危険性があるのか、それがごく普通の Windows アプリ by win32api & MFC と比べてどのように危険になったのか、それを示していただけませんかね
>>444 そんなのアプリも一緒じゃん
バカなの?
〉無視するか家に上げるかの選択肢しかない
あぁ、真正バカですね
俺も知らんが、Excel脆弱性でググると色々出てくるってことは、そういうことなんじゃないの?
シート1のA行を1列目から右にセルに入ってる文字を配列に順番に入れるにはどうしたらいいですか?
1 2 3 A B C こ、こうか? 画面が横になってないかそれ。
>>449 WorksheetFunction.Index(取得したい範囲or取得した二次元配列,1)
>>449 dim ary as variant
ary = シート1.range(A行1列目から右のセル).value
それだと二次元配列になって使い勝手悪くないか? イテレータで回すならいいんだろうけど・・・
ミス WorksheetFunction.Index(取得した二次元配列,1,0) だった
>>453 「A行1列目から右」が一次元か二次元か判断付かん
>>449 Excelでは、縦の並びが列、横の並びが行
普通はA列1行目みたいな表現になる
配列って言われたら普通はVBAの話だと思うが、実はシート関数の話をしているんじゃないか?
>>446 まあ、マクロウィルスは作成が簡単というのはあるな。
VBAのプログラムを作成するプログラムが簡単に作成出来るので。
但し、Excelもそれを封じる為にセキュリティーセンター内で、そういうプログラムの実行をするための設定としての「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」のチェックがデフォルトで外れている。
このチェックを付けて運用するのは危険だな。
でもここでチェックが付いてるとVBAが無くても勝手にVBA組まれちゃうんで、VBAの有る無しにかかわらずExcel自体が危険だな。
従って
>>444 のVBAの危険には該当しない。
>>444 の言う危険って何だろうな?
所詮、よく知らない奴が知ったかぶりで語ってるだけ?
他の言語で業務を仕組化するって要は自分の価値を切り売りしてるようなもんだからな。 自分への属人性を排除して誰でも自分と同じ作業ができるようにする。 そんなんで金もらっても用がなくなれば切られるだけ。一時的に給料が上がるだけで自分にとって何のメリットもない。 それよりVBAで自分の仕事をブラックボックス化して属人化しといたほうが得。
>>459 転職後にそういうカスを追い詰めるのが趣味です
徹夜でプログラム読み切ってバグとミスを指摘し続けて「え、ここじゃないんですか?みた瞬間にわかりますけど・・(大嘘)」
で大概の人はイライラMAXでデバッグが手につかなくなるwざっこwww
>>459 ん?
他の言語ってWeb系の話?
普通は、コンパイルでコード見えなくなる他言語よりVBAの方が属人性は無いと思うけど。
>>460 簡単なプログラムばかり見てきたんだね。
俺が扱うコードでは他人が書いたもの含めてそんな大変なことしたくない。
Test(ByVal a As String) Test(ByRef a As String) ← こっちって型指定する意味ある? Test(ByRef a) か Test(a) だと何かまずい?
>>462 そりゃvbaなんてどう書いてもベタ書きにしかならんよ
ラムダ式やコールバック関数ほかなーんにも無い、順番に読むだけ
>>463 型が違う場合、コンパイル時点でエラーに出来る
けど型がふわふわのvbaでやる意味は薄いとは思う
Sub foo()
a = 1
Debug.Print Test(a)
End Sub
Sub Test(ByRef a As String)
End Sub
まあ、たまにタイプミスを発見できるとか、時間が経ってからコードに手を入れたい時に型が書いてあれば確認しなくてすむとか、そういう薄いメリットはあるかな
パスワードかけてるのにどうやって見るんですかねぇ、犯罪者さん。
>>465 型定義してないコードなんてよっぽどだな。
そんな所は碌なもんじゃねえw
>>467 VBAのパスワードは基本的に解除できる筈だが。
俺の知識が古い?
技術的に可能だから不正アクセスするのか 犯罪者は発想が違うな
>>470 俺のまわりでは普通はパスワード掛かってないがw
お前が自らの知識の無さを披露したから指摘しただけだよ。
まぁ3流プログラマじゃ数字の流れは盗めてもその数字が意味するところまでは汲み取れないのが現実 相手がプログラミングができないと思い込んで知識窃盗を試みて数値の流れを盗んだところで自己満足 それをどう使うかなんて役員に対して説明もできんだろ そんな奴はプログラミングできるぼくちゅごい!で思考停止してるアホだな。
>>467 プログラムは会社の資産だから別に不正アクセスでもなんでも無いよ?
自分の家の鍵を自分の鍵で開けてるだけだよ
それにvbaのパスワードとか秒で破られるもので防ごうってのも変な話
>>472 そんな誰にも分からないような高等な知識をわざわざパスワードかけて、毎回パスワード解除してるの?なんの意味があるの?手間なだけでは?
負け惜しみが酷い。 パスワード解除出来ることも知らない程度の奴の高度なプログラムなんて、こっちにとっては初心者コードじゃねーの? 精々、中級者までだろうよw
で、コードがかけたから何? 結局実務からseが要件定義しないとお前らは何もできないし、要件定義された内容を分割して指示通りにコード化してるだけだろ。 それのどこが偉いの?偉いのは実務だよ。 それにパスワードは外せて簡単に内容見れるとか言うなら俺が自分で計算やDB用ののdll書いてブラックボックス化を進めればいいのか いくらでもブラックボックス化はできるけど信用の上に立って簡単なvbaで処理してるにすぎんよ プログラマーが偉そうにするなら俺は協力しないし、会社命令でも手を抜くね まるで属人化排除が印籠かなんかで相手の気持ちも考えず従えとか言ってくる勘違い馬鹿に協力するわけねぇわ
>>477 あぁ、何か変と思ったらこのスレの人をプログラマーと思っていたのか
このスレの大半は事務の人間だよ
俺は両方の経験者だけど
あんたは自分でレベル高いと思っているかもしれないけど、それほどでも無いって自覚だけはしておいたほうが良いぞ
教養レベルのことを書いたらレベル高いって主張してるように見えるならお前も大したことないな 気をつけろよ
あれれ〜
>>460 でからんできてそれ言うの?頭大丈夫?
他人のエクセルファイル盗み見るとか公然と言うカスは教えてくんにも劣る犬畜生だという自覚すらないからな 教えてくんならググレカスで済むけどおしえてくれないならファイル盗むわとかほんと頭いかれてるわ
>>482 随分な言い様だな。
パスワード解除出来ることを知識として知っているかどうかの問題だろ。
俺の場合はかなり昔、といってもOffice2007が出て少しした頃だが、社内マクロのメンテナンスの仕事した時に、既に会社辞めた奴の作ったVBAにパスワード掛かってて、会社に了解を取って解除したことあるけど、実際に解除する奴なんてそんなにいないだろ。
だいたい、何が楽しくて解除なんてするんだよw
パスワード掛かってるコードが糞コードじゃないなんてこたあねーぞ。
他人のファイルって、、 勝手に個人のファイルを会社に持ち込むな
イチゴの苗を盗んでうちのイチゴは世界一とか言う人たちがいたなぁ 他人のエクセルファイルを盗んで一般化して得意になるって同じ精神構造なんだろうなぁ 日本の民度もここまで下がったらもうブラックボックス化して自衛するしかないね
コモディティとしか言いようがないVBAでコードを盗むだの何だのと言ってることが笑える
公表してもどうせ誰も読めやしないから、パスかけてないわってのが殆どだと思う。
パスワードで保護する価値はないだろ 価値があると思ってるのは自分だけ VBAは20年前に終わった古いコードでもう出尽くしてるから今更目新しいのはない あると思ってるのは誰かがもう採用済み
パワークエリとかスピル関連でVBAのオブジェクトモデルにもどんどん新しい機能が追加されているぞ 目新しいものがないと言い切るのはおかしい
>>489 他人が作った、他人の仕事専用のコードなんか読む意味がない
>VBAは20年前に終わった古いコード さすがにそれはないわ。 新しいバージョンから使えるコードがあるから。
>>490 コードをコビーされたくない財産と思っているのではなくて、書いた人の責任、管理を外れて、コードが勝手に変更されない為に保護するのが一般的。
他の言語では、変更可能な形で、実務者に配布なんてありえないからな。
オープンソースの歴史が示している通り、ケチケチするよりオープンにして仲間を増やしたほうが、自分の得になる。
列をコピーする際にクリップボードを使わずにコピーをする方法ってないでしょうか? Columns("A").Copy Columns("B").PasteSpecial (xlPasteValues) こんな感じでコピーをするとwindows10標準の「クリップボードの履歴」という機能が使われるらしく、負荷がかかってエクセルブック自体が強制終了してしまいます 数行のデータなら何も問題ありませんが数十万行くらいあると落ちます 「クリップボードの履歴」機能をオフにすれば問題なく処理されるのは確認済みですがオンの状態で作業をしたいです よろしくお願いします
>>497 Columns("B").Value=Columns("A").Value
Columns("B").Value = Columns("A").Value
Columns("B").Value = Columns("A").Value より buf = Columns("A").Value Columns("B").Value = buf の方がいいって本当かよ。
Columns(1).Copy Destination:=Cells(1, 2)
Destinationは厳密にはクリップボード経由だけど、履歴を残したくないって目的の
>>497 は達成できるな。
>>494 俺がメンテナンスしてた時もこれに関してパスワード掛けてたな。
そこは、みんなVBAを弄るので勝手に改変されていって管理出来ないという問題があった。
それであるフォルダにあるブックのVBA全てに有効期限とパスワード掛けるコードとかをその時作った記憶がある。
返事が遅くなりましたが理想通りの結果を得られました コピーしてからペーストという概念に捕らわれていましたがこんなこともできるのですね ありがとうございました
ExcelのかわりにGoogle spreadsheetが台頭してきましたが これにもマクロは使えるの?
>>505 ごめん。
元の質問が値貼り付けしてるから大丈夫だ。
>>508 GASがある
VBAよりは遥かに優れてるよ
なんかVBAの実効速度が今日から急に早くなったんだけどなんでだろう?
使うデータ同じで速度が変わったんなら裏でなんか重い処理でも動いてたんじゃないの
windowsのアップデートで妙に早くなることはたまによくあるな
>VBAよりは遥かに優れてるよ 言い過ぎ。 というか、シート内で出来ること以外は機能が殆どかぶってないと思うが。
>>510 Excelでいう「マクロの記録」みたいな機能ある?
だったら乗り換えたいかも
マクロの記録はあるが、乗り換えって・・。 使い分けだろう。
エクセルは多人数で同一ファイルの同時使用が出来ないからgoogleの方が遥かに便利
ローカルのExcelブックからDBに上げる・DBからブックに落とすだけのマクロは非常に多いからな VBAマクロの代替以前に、Googleスプレッドシートに移行した時点で不要になるゴミはとても多い
excelブックをメールで行ったり来たりさせてメールボックスパンパン →消した後に悲鳴 何度見たことか
>>520 どうしてもWinAPI叩きたかったら、C#とか好きな言語で書いてWebAPIでスプレッドシートに反映させればよい
帳簿に手足は必要ない
普通はその結果をDBなりに同期させる仕組みを考える方が面倒臭いと思うけど、仕事したことないんだろうね
VBAとGASだとさすがにVBAの方が上かな
GASはローカルファイルへのアクセス権がなさすぎるのと、他スプレッドシート扱うのがかなり面倒くさい。まぁしゃーないっちゃしゃーないんだけど
さっとスクリプト組みたい時はVBA+Excelシート以上にお手軽な環境は無いと思う
>>523 webに対しては確実にgoogleスプレッドシートの方が上だが・・・
どっちが上ってのは無いと思う。使い方次第だろう
>>523 DBならaccessとodbcでいいや
DB接続してないエクセルとか糞だろw GAS?情報共有が楽なだけで話にならん
>>523 そもそもexcelやaccessならADODBで簡単にデータベース連携できるし
そもそもみんなどういう風に使っているんだ? 俺は・・・ ・メインシステムはweb上にあり、ベンダーに開発してもらっている。csvを吐き出すシステムがある ・csvの元になるSQL部分は自作(しょっちゅう変わるから自分で作ったほうが早い)。 ・後はそのcsvに対してvbaでちゃーっと加工して配布(順序変えたり見やすくしたり) ・ローカルネットワークにもファイルを置く こういう使い方だとVBAの方が楽なんだよね。GASを使う理由があまりない。データが必要なら、都度csv落とせば良い ODBCとかめんどくさくない? php直接書いたほうが遥かに早いし楽だし、データの劣化を最小限に抑えられると思うんだけどなぁ
>>528 前のプロジェクトvbaのコード少し書くだけでDB連携してたぞ
そこのプロジェクトはなんでもできる系が多数いたけどな
>>529 Excelの仕様と、型付でデータが大変にぎやかになるのが辛かった
@が=記号の代わりになるとか知らんがな
番地データが日付になるのは勘弁しておくれやす〜
>>517 同時編集できるよoffice365で
しかもデスクトップに切り替えも出来る
社内のシステムへのログインをVBAで行おうとしたのですが、 特定の入力項目を小ウィンドの選択項目から選んででないとログインできません。 VBAを使って同じような入力内容に出来てるのですがダメです。 何かやり方があれば教えてください。
c++で自作したdllをシャドウコピーして呼び出したいんだけど、そんなことできますかね? できるなら教えてください
社内システムへのログインでエクセル開くの? キモくない?
うちもエクセルからだな 「え?URLのショートカットかなんかじゃなくそれ?」って思った
>>532 最後の手段はSendKeysとかWin32APIでマウス操作
社内のシステムへのログインが全世界どこも同じだと思ってる馬鹿は死ね
>>532 選択項目を選ぶと、非表示で隠れている部分にあるフラグが変わると見た。
あと酷いのになると、テキストボックスが2個重なっていて、 くそっ! 片方ダミーか! ふざけんな! とかさ。
>>539 まさに最近引き継いだものがその罠だった
セルA1に金額(例えば100)を入れて セルA2にセルA1の金額の数値を入れた次の文章 代金はセルA1円になります。 ↓ 代金は100円になります。 を表示させたいです。 自力で下記のまでは出来ました。 Range("A2") = "代金は(セルA1)円です" ですがセルA1の値を文章の途中に組み込めず困っています。 A2に表示された文章は後でコピー貼り付けに使用します (この部分は自分で出来ますが・・・)。 ご教授宜しくお願い致します。
>>541 1. VBAを忘れます
2. ="代金は" & A1 & "円です" をA2に入力します
3. (゚д゚)
>>542 有難うございます。わけ合って&関数は使えないのです。
私の説明が足りずすいません。
マクロを実行するとセルに直接文章を入力したようにしたいのです。
Cells(2, 1).Value = "代金は" & Cells(1, 1).Value & "円です"
有難うございます!そのやり方で今からやってみます!
D列に「集計」という文字が含まれていなければ、その行を削除して行間を詰めるために ↓のコードを使いたいのですが、Unionの.Rowのところで「参照が不正または不完全です」になります Sub Delete_Rows() Dim LastRow As Long '最終行の変数 Dim DereteRow As Range '該当する行を格納 Dim r As Long '処理の範囲を格納 Dim ws As Worksheet Set DereteRow = Nothing 'オブジェクトへの参照を解除 Set ws = Worksheets("Sheet1") ' F列を基準にシートの最終行を取得 LastRow = Cells(Rows.Count, 6).End(xlUp).Row For r = 2 To LastRow '2行目から最終行までB列のセルを対象にする 'D列のセルが"集計"を含まない文字列の行なら DereteRow に追加 If Cells(r, "D") <> "*集計*" Then Set DereteRow = Union(DereteRow, .Rows(r).EntireRow) End If Next r 'DereteRowに行が代入されていれば一括で削除するが、なければ処理を終了 If Not DereteRow Is Nothing Then DereteRow.Delete End If End Sub
>>546 そりゃWithもないのに
> .Rows(r).EntireRow
なんてされてもExcelは困っちゃうわな
ルーチン名はDelete_Rowsなのに変数名はDereteRowとか、wsは何に使うつもりなのかとか色々指摘したいところがありまくり
>>546 .Rows(r)の"."を消すかActivesheet.Rows(r)に切り替える
蛇足だが、コードにいろいろとおかしな点があるので指摘しておく
・DeleteRowを変数として宣言した直後、まだ何も代入していないのにSet DereteRow = Nothingとやるのは無意味
・ルーチン名をDelete_Rowsにするんだったら削除対象行の変数はDeleteRowではなくTargetRowsとかにした方が良い
・変数 r は「処理の範囲」ではなく「削除対象行判定のループで使用する行カウンタ」と説明しないと意味が通じにくい。「範囲ならばRangeオブジェクトじゃないのか?」と思うし、どの処理で使ってるかも分からない
・変数 ws は何のために宣言してるのか?
>>547 >>548 ありがとうございます。
↓で
"Set TargetRows = Union(TargetRows, ActiveSheet.Rows(r).EntireRow)"
の部分が「プロシージャの呼び出し、または引数が不正です。」になります
Sub Delete_Rows()
Dim LastRow As Long '最終行の変数
Dim TargetRows As Range '該当する行を格納
Dim r As Long '削除対象行判定のループで使用する行カウンタ変数
' F列を基準にシートの最終行を取得
LastRow = Cells(Rows.Count, 6).End(xlUp).Row
For r = 2 To LastRow '2行目から最終行までB列のセルを対象にする
'D列のセルが"集計"を含まない文字列の行なら TargetRows に追加
If Cells(r, "D") <> "*集計*" Then
Set TargetRows = Union(TargetRows, ActiveSheet.Rows(r).EntireRow)
End If
Next r
'TargetRowsに行が代入されていれば一括で削除するが、なければ処理を終了
If Not TargetRows Is Nothing Then
TargetRows.Delete
End If
End Sub
>>549 ちょっとググったらUnion(Nothing, ...)はダメみたいやね
> Set TargetRows = Union(TargetRows, ActiveSheet.Rows(r).EntireRow)
↓
If TargetRows Is Nothing Then
Set TargetRows = ActiveSheet.Rows(r).EntireRow
Else
Set TargetRows = Union(TargetRows, ActiveSheet.Rows(r).EntireRow)
End If
>>550 ありがとうございます。
エラーはなくなりましたが、"集計"の文字列を含む行も消えてしまいます
>>552 *集計* の行は残りましたが"*集計*"で、指定した文字列を含む(指定した文字列の前後に他の文字列がある場合)
ではないのですか
つまり、確認結果の通りです。 ワイルドカードが使えないので、LIKEかInstrを使ってください。
auto_openでユーザーフォームを開きます。 テキストボックスにデータを入力してエンターキーを押すとコマンドボタンに進んで コマンドボタンでエンターキーを押すとデータがシートに入力されて テキストボックス内がクリアされてテキストボックスにsetfocusします。 またデータを入力して、の繰り返しなんですが 1回目は上手く行くのに2回目に入力した時にエンターキーを押しても進まない現象が多々起こるんです。 そんな時は一度シートを適当にクリックしてユーザーフォームのテキストボックスに戻るとそれ以降はその現象は起きないんですが、正直シートには触らせたくないんです。 エンターキーで進まない現象は必ずマクロを起動させた一回目で発生します。 同じ様な現象で悩んでいる人は居ませんか? 解決策があれば知りたいです。
カーソルが消えて見えないだけで、実は進んでるんじゃないの? そういう現象なら知ってるが。
最少構成のソース試行錯誤してる間に解決するのもあるあるだしな
対処療法になるけど、起動直後に1回だけ自動でダミーのデータを送り込むマクロを仕込んでおくとか
>1回目は上手く行くのに2回目に入力した時に >必ずマクロを起動させた一回目で発生 どっちだよ
>>562 えっ?
後者の一回目は脳内変換で見なかったことにしたけど
昔は最小構成ソースを美しいコードとか言ってた時代もあったけど今じゃ可読性の悪いコードの見本 やっぱ誰でも見やすくないとね 自己満じゃダメよね
>>565 昔は少ないメモリがゆえのことで自己満なだけではないし、可読性の悪いコードになるとも限らない
知る限り一番縛りがキツイのはポケコン 昔は変数が一文字だけ。変数26種類で終了!って時代があって 可読性が悪いと死ぬ時代があった オブジェクトももちろんなし 今は多少可読性が多少悪かろうが余裕で読める
>>565 最小構成でなぜ可読性という言葉が出るのか
文字数じゃないんだぞ
最初はトラブルシューティング話をしていたのに、565がいきなり関係ないことを言い出した
integerとlongについて教えてください 今までは数値によりこの二つは使い分けた方がいいと思っていました しかし、ネットで調べるとintegerも結局longに変換?しているためlong型で統一した方がいいといったことが書かれています となると、integerの使いどころはどこになるのでしょうか?
>>571 昔の名残と言い切っていいと思う
今は使い分ける意味があんまりなくなってしまった
強いて言えば大きい配列にするとメモリの使用量が変わってくることぐらい
バイナリファイルの読み書きでも結果が変わるけど、そもそもバイナリデータの処理はVBAに向いてない
メモリの使用量が目に見えて変わってくる にしといて 突っ込まれそうだから
1048576行だから縦はLong。 16384列だから横はInteger。 異論ある?
縦はともかく、横が拡張されることなんかあるんかいな。
過去に拡張されたことあるから今後もあるかも って思うのは不思議じゃない
A列に今日の日付が入っている行であれば、同じ行の"B"cnt〜"AA"cnt+2を水色でぬりつぶす (対象はA列の4行目から最終行) と B列に数字の1が入っている行であれば、同じ行の"B"cnt〜"AA"cnt+2を赤色でぬりつぶす (対象はA列の4行目から最終行) というのをしたくて書いたのですが、エラーなどはなく、何も起きません 原因を教えてください。 Sub tes() Dim cnt As Long Dim buf As String Dim cnt2 As Long buf = Date For cnt = Cells(Rows.Count, 1).End(xlUp).Row To 4 Step 2 If Cells(cnt, 1) = buf Then Range(Cells(cnt, 3), Cells(cnt + 2, 27)).Interior.Color = RGB(173, 242, 249) End If Next cnt For cnt2 = Cells(Rows.Count, 2).End(xlUp).Row To 4 Step 2 If Cells(cnt2, 2) = 1 Then Range(Cells(cnt, 3), Cells(cnt + 2, 27)).Interior.Color = RGB(255, 0, 0) End If Next cnt2 End Sub
>>578 Forの条件が逆
For cnt = 4 to Cells(Rows.Count, 1).End(xlUp).Row
For cnt2 = 4 to Cells(Rows.Count, 2).End(xlUp).Row
VBA学びたいんだけど、office以外でVBA出来るところってない?
LibreOfficeで使える。 インテリセンスが使えないからだれも使わないしそれでもLibreOfficeつかうならpythonで動かす。
今から学ぶなら
>>414 かGoogleスプレッドシートのGASにしとけば?
どっちも無料だしVBAはレガシーでもうすぐ無くなるよ
>>580 MS Office以外でという意味ならLibre OfficeのマクロでVBAが使えるがMS Officeとの互換機能のための物だから完全ではない
>VBAはレガシーでもうすぐ無くなるよ 10年後も余裕で残ってると思うが・・。
別に先端の言語、例えばスカラーやハスケルを使ったとしてもやってることはVBAを使ってやることと同じじゃね。 それがオンプレやウェブを通じてデータを共有するかエクセルで個人でデータを扱うかの違いだけでさ。 目的がデータ共有じゃなくて個人のデータ分析・見える化なら簡素なVBAのほうが優秀に決まってるとおもうが。
他の言語ならGUIやらグラフ作成のプログラミングが必要なところがエクセルならなしでいいし自分用に簡単にカスタマイズできるとかチートだろ。 その便利さが分からないってちょっとかわいそうだと思うが。保持できるデータ量が少ないっていう人がいるかもしれないけど それこそDBと接続すれば解決だろ。なんで他言語信仰があるのか俺にはようわからんがー
Haskellって最先端なんか? 凄い古い言語って印象だけど
>>587 ゲーム作成には不向きだったな。ありゃーキツかった
あと機械学習にもまるで向いてない。vbaは内部的にシングルコア臭い。
通常の事務用途なら普通に最強なのは言うまでもないので、あえてそれを言ってないだけではないんだろうかね
関数型言語だから最新ではなくとも先端だと思うけどな
>>580 vbsでよくね
ちょっと遅い以外はVBAより使い所あるよ
VBAの利点なんてExcelに標準で載ってる以外にないだろ まあその利点が大きすぎて他ので代替できないんだけど はやくTypeScriptあたりが標準にならねーかな
Excelが起動してない状態ならどんな言語でも良い。 そもそもVBA使えないし。 でも、Excel起動した状態で、わざわざ別言語呼び出すのは糞だろ。 VBAが使える環境ってのは競合がいない。
Excel は、web プログラミングに対応していないから、 ウェブアプリでは、データベース・CSV の方がよい そうすると、Ruby, Python, Julia で、 VSCode, Jupyter Notebook で処理できる ローカルPC 内だけで処理できない場合は、他の言語がよい
>>595 >でも、Excel起動した状態で、わざわざ別言語呼び出すのは糞だろ。
別に糞ではない
専用アプリがたくさん出てきた今じゃエクセルなんてメモ帳くらいしか使わなくなった この先もなるならんと思うけど用途は縮小されるだろうな
スレ違いかもしれませんが、VSTOってどうなんでしょうか よく使われているのですか?
>>596 rubyだけはないかな
もう完全に更新停止しちゃったし
いつものruby厨が糞なのはわかるが年末にメジャーアップデートしたばかりだよ!
PHPでいいのにRuby JavaでいいのにKotlin 余計なもの作りすぎてやしないか? 学習しないといけない選択肢や実際に学習しないといけないリスクが増える。 OSにおけるWindowsに対抗したMac ワープロのWordに対抗した一太郎 スマホにおけるAndroidに対抗したiPhone にも同等のことが言える
>>603 自由競争社会ってのはそういうもん
選択肢が多くて選ぶのが嫌なら共産国にでも行けばいい
PHPでよくないしJavaでよくなかったから新しいものが作られるのは当然
未だに、Webサイトの最高速度は、Ruby on Rails。
他の言語は複雑だから、高コストで低品質になるw
表示速度が“異常な”Webサイト「dev.to」とか
https://dev.to/ 元乃木坂46 の川後陽菜のWebサイト、SKIYAKI とか
https://kawagopro.com/ 日本語不便だから簡素化しよう → わかる 日本語不便だからZ国語を作ろう → 意味不明
おれ今は何でもpowershell .NETやWin32API呼べるしね
>>606 WEBサイトが重くなる原因って、外部サイトから取り込む広告バナーやアイコンが原因なことも多いよな
そういうケースでは自分のサーバーをいくらチューンしても無駄だし
>>606 何の機能も無いんだからそりゃ早くて当たり前だ
>>603 Wordよりも一太郎の方が先じゃなかったか?
少なくとも国内では
>>597 そんな手間、普通はしないし、そんな汚いコード書きたく無いのが普通。
レガシーコード嫌ってもっと酷いコード書いて何とも思わないのは害悪だね。
>>599 それはアリだ。
会社内で使える環境、積極的に使っていく環境なら大いに活用すべし。
ただ、VSTOって名前は今でもその名前で良いのか?
もはや、名前なんて無くなった感覚だな。
俺も個人的に使ってる。
>>614 例えば、VBSからVBAを呼び出し、VBA経由でWin32APIを呼び出す。
VBAからShell関数で別exeを呼び出し、そのexeはtxtファイルを残すように作成されており、そのtxtファイルの内容を見て連携する。
あるフォルダを常に監視するプログラムが動いており、そのフォルダにファイルが置かれると其れを読んで動作するプログラムがある。別のプログラムがそのフォルダに指示するファイルを置いて連携する。
どれも、仕方なくそういうプログラムを書くことがある。
しかし、こういうピタゴラスイッチのようなシステムは汚い。
1言語で完結する方が良いのは明らかだ。
そんなこともわからない奴は素養が無い。
動けば良いなんて考えの奴とは組みたく無いね。
スパゲッティで炎上案件必至だ。
>>615 そういうシステムの場合は1言語で完結する方がいいって?
1言語でもやりたくないな
プロセス毎に担当とかならいいが
そのプロセス毎に言語が違って余計な手間が増えるのも非効率だな
>>615 >どれも、仕方なくそういうプログラムを書くことがある。
そんなプログラム仕方なくでも書くな
たからそんな頓珍漢なシステムしか作れないんだよ
素養なさすぎでしょ
>>618 だから
>>597 が正にそれだろw
バカがwww
ググルのスプレッドシートってまだまだだねぇ・・・ Excelの完成度の高い操作性に慣れると、あんなの使ってらんねーわ・・・
>>619 >>594 は糞ではないが
>>615 は糞
極端なものしか語れない/作れないの?
素養無いね。いやマジで
>>623 まだ伝わってね―のかよ。
>>615 は糞の例だっちゅうのw
Excel起動した状態で、わざわざ別言語呼び出すのも基本的に同じだ。
ちなみに、俺は実際には
>>615 のようなものを仕事で書いたことは無い。
しかし、世の中には
>>615 のような腐ったのはあったりする。
>>615 の内の1つは俺がネットワーク系のコード書いてた時にある技術的課題をすぐにクリア出来なかった時に上司や他のメンバーから提案されたものだ。
結局、Win32APIで何とかしたが。
自分でも書かないような極端な事例を勝手に出してそれに対してマウントとるオナニー気持ちいい? コミュニケーションの素養も無いね
>>626 プッw
話を変えようとしても無駄。
Excel起動した状態で、わざわざ別言語呼び出すのも糞。
ちなみに、極端でも無いのは上司や他メンバーが提案したことからも明らかだが。 糞だけど実際にはそんな事例は結構ある。
横からだけど VBAでは足りないことが多いし、言語も冗長でできれば書きたくない言語 けど、気持ちは分かるわ。自分もエクセル神、VBA最強と思ってた時期があったw
よろしくお願いします。 A1からA500まで順に走査し、セルの値が「あ」「い」「う」「え」「お」のいずれかなら同行のB列に「OK」と書く ↑ こういう命令を書きたいのですが、 if ws.cells(row,1)="あ" or ws.cells(row,1)="い" or ws.cells(row,1)="う" or ws.cells(row,1)="え" … then という書き方しかしりません。 たぶん、 「セルの値が「あ、い、う、え、お」のどれかの場合は、」という書き方があるんじゃないかと思います。 ひとつひとつORで並べるんじゃなくて、そのように書くにはどうすればよいのでしょうか? 教えてください。
select case a case "あ","い","う","え","お" cells (i,j) = "OK" end select
そもそも他言語使うのにエクセルシートを開くのがダサい
pythonでもjsでもいいからさっさとVBA廃止して欲しいわ
VBAよく使うし便利なんだけど嫌われている理由って何?
>>642 いつ切り捨てられるかわからないストレスの反動
最先端を追っかけて一般に広がったらダサく見えちゃう人のパターン?
使いこなせないけどとりあえずスカラー使っとけばマウント取れるという風潮
>>642 言語仕様が古臭すぎる
モダンな便利な仕組みが使えないしデフォルトの関数やライブラリも貧弱
Excelっていう表を使うのにリスト周りの機能が劣悪なのが個人的に最高に糞
sortやfilter、mapぐらいは用意しといてくれ
Excelは神じゃないし、VBAも別に古くないなんて言わない。 でも、VBAを使う場合では他に選択肢が無い。 他のモダンな言語使ってダサさ極まりないプログラムを書くことになる。 Excelを介さずにExcelのファイル作る場合ではVBAはお呼びじゃ無いし、Excelを介して何かする場合はVBA以外がダサイプログラムとなる。
だよな VBAでIE操作するなんてダッサイよな Excel VBAでWord操作するなんてもっての外だ
それはVBAでIEを操作したいんじゃなくて、 取り出したデータをシートに書き込みたいからVBAなんだよ。
pythonでExcelを操作したいんじゃなくてpythonで弄ったデータをシートに書き込みたいからWin32APIなんだよ
VBAはコレクションが貧弱すぎ そしてVBの言語仕様が大嫌い
VBAに継承があったら、もっと楽しくコード書けるのになあ
クラスはサポートしてるのに継承がなくてポリモーフィズムしか使えないからね クラスを作るのが面倒で仕方ない
せめてコンストラクタ(VBAだとInitialize)の引数は欲しかったわ
CADで書いたデータをDXFにしてメモ帳で開いて読み取って、エクセルシートにオートシェイプで書いたんですが、円の中にテキストがあるやつのみグループ化したいんですがいい方法ありますか? 調べると座標点から追ってみたいな方法しかないですか?
>>659-660 継承は愚策であることが判明しているのでは?継承よりも委譲をつかいなしあ
VBAよりpythonの方が実行速度が速いなら使ってもいいが、そうじゃないんだろ?
マクロの実行速度なんてほぼExcel側で決まるんだから言語変わっても変わるわけないだろ そもそもたかがExcelのマクロに実効速度とか要求するか?
ん、いや、pythonに何かしらメリットがなきゃ、乗り換える意味なんてないよなと思って。
VBAがないなら もうWindowsを使う意味はないってユーザーも多いのでは
手作業で数式を入れるだけならオンラインのスプレッドシートで十分だもんな
スプシでネイティブアプリ並の速度でかつVBAが使えれば言うことないんだけど
>>669 お前さんがメリットないと思えばそのままでいいんじゃね?
俺はpythonなら乗換えるよ
理由は
>>659-661 辺りに書いてある通り
端末にPythonインストールされてないし使えない。
っていうかPythonつかうならVB.netでいいんじゃないの?? C#でもいいし。
>>638 の話じゃないのか?
現状ならそりゃVBA使うしかないわけで
外部から制御するならC#でもPowerShellでもいいわな
Excel VBAスレでpython信者が何いってもねw
エクセル中心でやりたいことはvbaでも十分だよ 何かの作業のほんの一部にエクセル使うときは、そもそもエクセルをフレームワークとして使うこと自体間違ってる
得ろサイトの動画や画像を根こそぎゲットするためにサイトの解析してるんだけど ソースにないリンク(javaとかで生成されたリンク)ってVBAで取得できるの?
>>680 サイトごとに画像ファイルのデータベースの作りが違うから、不可能じゃないけどかなり面倒
画像のURLのパターンを調べるだけなら既成のアプリでパケットキャプチャしたり、自動運転してフラウザのキャッシュから拾った方が早い
エロサイトスクレイピングの最大の問題は、サイトの解析に夢中になるあまり、抜いてないのに疲れて賢者モードになってしまうこと
そういうのは、いつのまにかダウンロードが目的になってしまう 大量の画像を一気にゲットしても99%は好みじゃないから、どうせ見ないよ
漏れは、スクレイピングは、Ruby, Selenium WebDriver, Nokogiri を使うけど、 各サイトの解析が大変 例えば、5ch の投稿から画像ファイルだけを探すのに、 「div.message a」内のURL で、拡張子が「png jpg jpeg gif」のものだけを絞り込むとか、 こういう処理を、VBA で書くのは辛い 可読性が高い、Rubyなどを使わないと面倒
>>684 5chで探すとグロと宣伝の同じ画像だらけで集める意味ないとおもう
>>684 VBAでも簡単だけどな。
というか、世の中のスクレイピング見てると随分テキトーだなと思うね。
ページ内のタグ1つ1つをごっそり取ってくる処理書ければ、絞りこむ方法なんて簡単だろ。
どっちにしろ、スクレイピングなんて初心者とは言わないが、その程度の話。
情報なんてゴマンと有るんだから。
jsonから動的にHTMLを生成するページだとjsonファイルのURLを調べるのが面倒 そのままソースには書いてないことも多いし
VBAちょっと触ってみたけど難しいね 書き方独特すぎてちょっときつい
[VBA] Dim str As String: str = "hoge" [VB.NET] Dim str As String = "hoge" [Java,C# その他] string str = "hoge"; まぁ確かにVBAは冗長で繰り返し多いわな If Then構文もThen書かせるなと思うし
文字列から組み込み定数の値を取得する事は出来ますか? 例)”rgbRed" -> 255
[VBA] Dim str$: str = "hoge" [VB.NET] Dim str$ = "hoge" [Java,C# その他] string str = "hoge"; 大差ないな そもそも文字数の差なんて全体から見たら誤差みたいなもんだ
VBAならDimステートメントは省略できるからもっと文字数を減らせる
>>694 宣言+初期値設定だけ?
> If Then構文もThen書かせるなと思うし
そんなことまでケチつけるのかw
むしろSelect CaseのCaseの方が要らんだろ
>>697 どうかね、タイプ量って生産性に直結するのだが
そもそもVBAの型宣言文字ってごく一部のプリミティブ型にしか割り当てられてないじゃん
Class1 cls = new Class1(param);
の一行で変数宣言、引数付きコンストラクタへの引数付与、インスタンス生成代入が同時に出来るのは便利だぞ
それに慣れてしまったら、
Dim cls As Class1
Set cls = New Class1
cls.Init(param)
みたいにVBAでやるのが馬鹿らしくなる
>>696 いま手元に環境ないから試せないけどApplication.Evaluate("rgbRed")とかでできないかな?
>>700 タイプ量の話なら
Dim cls As New Class1
ってやるだけだろ
わざわざ自爆ネタを提供しに来るとか斬新だなw
>>701 Evaluateでは評価できませんでした。
>>702 汎用的な処理を省略したいなら関数を書けってなる
VBAに限らず基本的なことのはずだけど
定数名(文字列)から値を得るのって、昔はtlbinf32.dllでできたんだけどWindows10でなくなっちゃったんだよね GetExportedTypesでできそうなんだけど、すぐに使えるサンプルがネット上には見当たらない あとはVBAのソースをテキストファイルに書いてインポートとか
>>702 その書き方はJava等で一行でインスタンスを生成代入するのとは意味が違うので、比較対象にならない
有名な話だけど、DimステートメントでNewを付加した場合、Nothingで一度参照破棄しても変数を評価する度に新しいインスタンス参照が生成代入されるので、以下のようなコードがコンパイルエラーにならない
非常識な挙動なのでMSも非推奨と言ってるし、いまどき使うのはアウト
Sub Test()
Dim C1 As New Collection
Set C = Nothing
C.Add "エラーにならない"
End Sub
>>707 間違えた、Set C1 = Nothingだな
>>705 何を言ってるの?
>>707 だからわざわざ「タイプ量の話なら」って書いてあるんよ
わからなかったの?w
>>704 コーダーレベルの人には重要なんだろうねw
>>709 機能や挙動が等価でない構文を並べてタイプ量を比べても意味がないだろ
>>709 その場での記述量の話じゃないの?
引数付きコンストラクタだって元々タイプした関数だろ
>>711 それ以前にタイプ量云々っていつの時代の話だよ
ってことねw
>>712 ああコンストラクタの引数の話を言ってたのか
これは確かにVBAではできないし俺もすげー不便に思う
タイプ量の話じゃなくて別に初期化関数持つのがダメダメ
>>713 タイプ量はステップ数やコードの可読性低下、人件費とほぼ正相関するので、オーバーヘッド抑制のために下流はもちろん中流以上のPMクラスでもケアしなきゃならない基本中の基本だぞ
いつの時代も変わらない
まだこんな老害がいるんだな… 変数名は1文字に限るとか?w
>>706 変換テーブルでも用意するしかないですかね。
>>717 揶揄されてることも理解できないとか可哀想ですらあるw
タイプ量ってwww いつの時代だよ。 というか、タイプ量少ない奴は寧ろ組みたく無いわな。 頓珍漢なロジックで余計なことやってることでタイプ量がが増えたので無い限り、そんなもん気にするバカは真っ先に要らない。
そもそもVBAは構文が長いって話なのに プログラム全体で見てば間違いなく長くなる でタイプ量の話は流れの中で出て来た少ない方が良いよね程度の事なのに絡まれてる人が気の毒だわ
>>721 > タイプ量の話は流れの中で出て来た少ない方が良いよね程度の事なのに
老害にはそうでもないみたいよw ⇒
>>715 >>565 自体が最小構成ソースとかのオレオレ用語で意味不明なので再来かどうかもわからん
構文レベルのタイプ数の多さはまともなIDEがあれば気にならない つまりExcelのVBA環境だとゴミクズ
そもそも言ってる内容が正しいとは思えないが、そこは議論の余地がなくはない それよりオーバーヘッドって用語、使い方が間違ってると思うぞ
タイプ量が長いのもあるけど コードが長いと注意が分散されてミスに気付きにくくなるというのはあると思う 宗教戦争になるけど
深さ不明の入れ子の連想配列があります。 値は数値一つか、一つ以上の連想配列のどちらかです。 下記の様にタブインデントの回数で位置を示した図をテキストファイルで作成したいのですが、どうすればいいでしょうか。 A B C 653 D 993 E F G 534 H 331
スペースが潰れてしまったので修正します A B C 653 D 993 E F G 534 H 331
みなさんコード打ちはJIS配列でしていますか? USのほうがやっぱり打ちやすいのかな
VBA使ってる即ちプリインストール厨なんだから職場貸与のJISキーボードに決まってるでしょ 道具に拘ること自体は否定しないが、そんな奴がVBAなんてストレスMAXじゃないか? 捻れが大きすぎて正常な精神を保てなそう
>>728 連想配列とネスト深度を引数にとって出力を返す再帰関数を作る
連想配列の第一要素の型が数値ならば普通にネスト深度とKeyとValueから出力内容を生成して返し、連想配列だったら更に自身を呼び出すようにすれば良い
VBAを気持ちよく使い続けたいなら、今与えられている環境が最高であると信じて疑わず、余計な知識を仕入れないことだ 特に、作業環境に拘りはじめるといずれ確実にVBAがボトルネックであるという考えに至ってしまうため非常に危険
VBAで何でも作れると、VSなんて要らないと思われてしまうため非常に危険
excelVBAでDDEexecution使ってあるアプリを操作し、 そこでクリップボードに取得した画像をアクティブシートに貼り付けたいです DDE経由で取得したクリップボードが空っぽなのですが、 DDEterminateする前にオブジェクトに移さないとダメなのでしょうか?
別言語いじると、元言語に戻ったとき、思わぬブレークスルーがあるので、別言語は是非やるべきだと思う。
VBAでそこそこの物を作れるとは思うが他の言語使えるならわざわざVBAなんて選択しないよ
なので
>>740 が何を主張してるのかよくわからん
VBAでやらんといけない場合もあるから ってことも想像できないの?
じゃ他言語が使えてもVBA使うことあるってことじゃん、何言ってんのこいつ
日本語の理解力なさすぎw 他の言語が使える(状況)ならって話な
じゃ、状況って書けよ VBAでそこそこの物を作れるとは思うが他の言語使えるならわざわざVBAなんて選択しない ↑ この表現から「状況」って単語を読み取ってほしいって自分の言葉足らずを認めず他人をなじるただの馬鹿としか思えんわな。 素直に謝れよw
「小学生並みの表現力が誤解を招いたにもかかわらず悪態をついた卑しき自分が存在してすみません」って言え
たしかに「使える人」「使える状況」どっちにも読めるけど、俺は初見では「使える人」の方だと思った 判断の理由は、まずこの文章には主語がないこと そこで想像で「俺は」を補い読み進めると、次に同じ文章の中に「作れる」「選択しない」という単語が、また主格を伴わずに出てくる この場合は、すべての動詞の主体は「人」だと判断するのが自然
文章力で試験に失敗とかそんな経験ないけどなw そもそも今時ム板見てる人でVBAだけ使える人って珍しくね?
試験とか言い出して論点ずらそうと必死な奴を虐めるなよw
言葉の内容じゃなくて表現に文句つける奴は大体無能 完璧な意思疎通なんて無理なんだから曖昧な点は都度確認して ああそういう意図だったので済むのにネチネチとなんの生産性もない
>>742 VBA で何でも作れるのでは?
だって win32api を自由にコールできるのだから
>>766 非同期処理や並列処理はできないやろ
たぶん
簡単にできるなら書き方教えてほしいっす
別のEXCEL(多数)起動して並列処理もどきをやったことはあるんですが、無理やりな感じは否めないかな… ソース(ファイル)も分散するし (プロジェクトとしてフォルダに纏めるくらいしか…) VBAの知識だけでできるのはいいんだけど
sendkeysを使って 他のアプリを操作し ctrl +pgdnをしたいのですが実行されません SendKeys"^{PGDN}",True
>>771 まず第一に、SendKeysの確実性はそんなに高くないので、正しく記述しても必ずしも毎回動くとは限らないということを理解しておく必要があるよ
その上で
アクティブなウインドウに送るので事前に他のアプリをアクティブにしておく
他のウインドウをアクティブにするのにウインドウタイトルを指定する必要があるのでその記述にも気を配る
他のウインドウがアクティブになるのにタイムラグがあるのでSleepとかを使って調整する必要があるけどVBAには無いのでほかから借りてくるかApplication.Waitで代用する
どうしても動かない場合は、もっと簡単なケースで試す
Excel21016 現在フォルダを指定してその配下にあるファイルの一覧をシートに記載するのを作成中なんですが。 FileLen関数でファイルサイズを出してるんだけど戻り値がLiong型でそれを越えるファイルだとマイナスの値が 返ってきてしまう。そこでFileLen関数以外で正しくサイズを返せるものあるいは工夫ってあります?
Scripting.FileSystemObjectのFile.Sizeを使うとか
FileSystemObjectを使う機会は増えたな
あ、一覧か とりあえず負の数なら強引に変換するとか
それでも4Gまでしか扱えないから困るんじゃない?やっぱり根本的に解決するにはFSOが必要だよ
>>773 無理にVBA使わなくてもBATでいいんじゃ・・。
>>772 Sendkeysなんて絶対使わないというぐらいの考え方であるべき。
Sendkeys使うぐらいならWM_KEYUP使う。
普通はWM_COMMAND使う。
でもWindowsの設定とかストアアプリ系に入力したい時そういう考えだと詰む
>>788 つまねえよ。
方法なんていくらでもある。
>>789 Windowsの設定はいいとして、ストアアプリ系で他に使えるいくらでもある方法教えて下さい
>いくらでもある 何か前にも聞いたことあるな。 いくらでもある → 具体的にはどうするの → 絶対答えられない のパターン。 前とは別の人だといいね。
WindowsPhoneとかストアアプリとかアッというまに消えたよね
>>790 その詰むというアプリは具体的に、何てアプリで、どこで詰むんだよ?
アクセシビリティやUIAutomationもダメなのか?
その人じゃないが、UIAutomationのinvokePattern.Invokeでフリーズして詰んだことはある。
>>798 多分も何も、それ以外有るまい。
UIAutomationの前身だろ。
>>797 それは何かが足りないとか、他の方法も駄目なのかとか、いろいろ回避策有りそうだが。
プログラミング言語人気ランキング2020
https://active.nikkeibp.co.jp/atcl/act/19/00124/ 使用している言語のトップ10内にVBAが。まあ、実際そんなもんでしょう
C/C++がトップなのは日経がゆえなのか…
PL/Iが出てるのが懐い(ToT)
htmlが違和感。まあ言語だけど…
>>800 COBOLがC#の1/3もあるのか
すごいアンケートだな
COBOLは使いたくなくても使わざるを得ないんだよ
まあ業務で使ってる言語ならそれほど違和感無いな なんだかんだ言ってC/C++はつえーわ あといい加減HTML/CSSを入れるのをやめろと思うわ 言語と言ってもプログラム言語じゃねーし
Java と VBA が同じって有り得ないと思うが
だから職場で強要されてる言語のランキングでしょ 能率とか好みとか無関係
これと似たような理由だろ
COBOLは数十年に及ぶ後方互換性維持の実績があるから絶対にこのくらいの順位で落ち着く COBOL不要論とか妄言だからなマジで
アドインをショートカットで呼びだす方法が調べてもわからないのですがあるのでしょうか
業界が慢性的な人不足だから、ある程度メジャーな言語ならそりゃ絶対的にはどれでも依頼はとても多いさ どれを選んでも仕事は十分にあるのだから、どれとは言わないがあえて単価も人材市場評価も低いものを選ぶ必要はない
>>806 うちだけかも知れんがJava案件激減したよ
VBAは自前のツールとかちょっとしたデータ処理に使ってる人も多いし
VBAの将来性ってどうなんですかね? これがいい、っていう代わりがあればすぐにも移行するけど、それが示されないのにただ VBAは将来が… って言われてもなぁ…
現状維持か消えるかだろう どう考えても発展する余地はない
どちらにせよ今のCOBOL需要みたいなのは残るだろうね
ずっと10年以上VBAは終わりと言い続けてるやつがいるけど、ランキングを見ればわかるように現場では普通に使われてる WindowsというOSも終わりと以下略 一度広まってしまった物は簡単には消えないんだよ 生態系を壊してるブラックバスと同じ
自然淘汰を待っているのと積極的に対策してるのを同列に語るのはどうかと
VBAが終わったらMSオフィスを使う理由がなくなる
何をもって終わったというのか、後続が出なくても現場で使っていたら終わってないし
まあ既存のVBAマクロが新しいバージョンのExcelで動かなくなる日が来るとは思えないが、 VBEが廃止されて新規に作れなくなるのは十分にありうる 終わりがくるとしたらそれだろう 実際、VisualStudioなどのMS製品の多くは昔はVBAが入ってたわけだしな
>>819 もちろん病原菌も根絶は不可能
治療法を探して対処するしかない
>>825 クイックアクセスツールバーに入れてAltで呼び出すのが手軽なんじゃね
調べてもわからないってなんやねん・・。 俺もわからないからググったら、検索結果の1番上に出てきたじゃんか。
昔は何でもかんでもエクセルだったけど今は専用アプリが増えてエクセルの出番が減ってる 今後はもっとエクセルを使う場面が減るだろう エクセルが無くなる事はないにしても
質問です。よろしくお願いします。 ブックにある複数のシートをそれぞれ順に、いちばん左上が表示されている状態にしておく、という動作を作りたいです。 Do Name = (対象シートの名前) ThisWorkbook.Worksheets(Name).Select ThisWorkbook.Worksheets(Name).Range("A1").Select ActiveWindow.ScrollColumn = 1 ActiveWindow.ScrollRow = 1 (対象を次のシートに切り替え) Loop ↑ このように書きました。 しかし、この書き方では、このプログラムを動作中にたまたま他のブックが選択されてしまったりして、 当ブックがアクティブでなくなった場合、ActiveWindow.という部分でエラーがでるんじゃないかという気になりました。 とはいえ、ThisWorkbook.Worksheets(Name).ScrollColumn = 1 というように書いてもダメみたいです。 また、A1をselectするだけでは、表示が左上になりません。 何かいい方法ないでしょうか?
>>832 Application.Goto Sheets("Sheet1").Cells(1, 1), True
>>832 Application.ignoreRemoteRequest = false
>>832 です。
>>833-834 ありがとうございました。
確認なんですが、
Application.Goto というのは、自ブックのウィンドウがアクティブではなく、別のウィンドウがアクティブになっている状態で、
むりやり自分のブックとそのウィンドウをアクティブに変更するのではなく、
ひっそりと陰で、アクティブではない状態のまま、ただ「自分のブックの範囲の中ではこのシートがもっともアクティブ」という
解釈でやってくれるという理解でいいのでしょうか?
>>814 >>818 VBAはオワコン、オワコン、って言われてきたが
実際はマイナー言語の方が先に終わってるからな!
>>823 VBAをPythonやJSに置きかえればいいのにな
今はVBAの言語仕様が古くなってしまったから
>>830 そりゃ専用アプリの方が便利だろうが
エクセル自体の代替はほとんどないな
逆に1,1をselectして左上が表示される俺のエクセルは一体どうなってるんだ。。。
VBAはマクロ言語としては普通に使いやすいと思うけどな 汎用的な言語としてはクソだとは思うけど
>>840 VBA のどのような点が汎用言語として残念なのでしょうか?
>>838 JSはない
あの癖がありすぎて無理だろ
>>842 本音を言えばオレもクセが嫌いだけど
最近JSにクラス構文できてマシになった
本当はRubyで一番書きたいんだけど
Windowsに嫌われてて採用されなそうだから
>>842 俺もそれには同意したいがnodejsとかの状況見たらそんなことは言ってられないような気がする
↓宣言 Dim warota As String Dim kusa As String ↓ずれてるのがしっくりこないのでこうしてみる。 Dim warota As String Dim kusa As String 文字間が空いているのも嫌なので、 ↓もうこれでいいやwwwwってなる。 Dim warota As String, kusa As String
>>838 何頓珍漢なこと言ってんだよ。PythonはVBAより古いぞ。
1991年 Python
1993年 VBA
1996年 JScript
Pythonなんてゴミみたいな文法で、VBAとは比べ物にならない。
VBAも古くなったのは確かなので、VBA.NETに進化させるべきだな。
VBAはVBの長い歴史を引き継いでるんだから、VBAの登場時期だけでくらべても意味がない
>>848 VBは1991年登場だからPythonと同じ。構造化され、1964年のBASICとは別物。
VBAにはwith文(Python風のではなくPascal風の)があるので、同じオブジェクトに
対する連続した操作をすっきり記述できて、Excelに適している。
>>848 古いから駄目ってか?
お前の方が頓珍漢すぎるw
C++とか1983年だぞ
登場年よりどれだけ改訂されてるかだろ
発展の余地がないとか… 枯れてるからよいということもあるのにね
なんか、頓珍漢な議論になってるな。 Excelに搭載されてるなら何でも良いだろ。 搭載されてるかどうかが全てだぞ。 汎用的な言語とか意味が無い。 汎用的に使わないから意味が有るのに。
>>853 (あ、間違って書き込み押してしまった)
!#$%&
ずっとこればっか
integerやdoubleとか書いてない
フィルターで絞り込まれた表の一部分を選択した後、 下記のイベントを発生させるとメッセージボックスが2回ループします。 なぜなんでしょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim セル As Variant For Each セル In Target.SpecialCells(xlCellTypeVisible) MsgBox セル Next End Sub
>>864 863です。
書き忘れてました。セル範囲を選択します。
数に関係なく2回ループします。
>>863 targetと セル 変数の中身は何なんだろ?
>>865 Target.SpecialCellsでSelectionChangeが発生してる気がする
forのApplication.EnableEventsで一旦止めたらいいんじゃないか
>>866 レスありがとうございます。
targetの始めの中身はフィルターをかけた後に選択したセル範囲が入ってるはずです。
セルはfor each で格納するため初期値は何も入ってないはずです。
>>867 >
>>865 > Target.SpecialCellsでSelectionChangeが発生してる気がする
レスありがとうございます。
そうなんですよ。
msgboxが2回ループするということは、SelectionChangeがイベント発生中にもう一度発生しているということなんだと思います。
ただ今までマクロ使ってきて初めてのことで、色々調べてみたんですがどうしても分からなかったんです。
SpecialCellsってセルの再選択が発生するんでしょうか?
> forのApplication.EnableEventsで一旦止めたらいいんじゃないか
あとで試してみます。
Excelでメモリの使用量を知る方法ってない? タスクマネージャーのやつじゃなくて、Excel上で。 配列にどのくらいまでなら入れられるかの目安にしたいんだけど。
>>869 subの直後に
debug.print "Worksheet_SelectionChange start"
debug.print target.address(でいけるかな…)
forの中に
debug.print "セル" & セル.address
こうすると、どういう順で動いてるか、値も把握できて解析に役立つ
何なんだろと聞いたのはそういう事
動きがわからないときはどんどんdebug.print を埋め込んで可視化するのが解決の近道ですよ
>>872 ありがとうございます。
正直、debugprintはあまり使わずブレークポイントやイミディエイトウィンドウなどでチェックしてました。
試してみます。
>>871 昔のApplication.MemoryFreeに相当する空きメモリ情報はWin32APIのGetProcessMemoryInfoを使わないと取得できない
>>874 mjd?……
ホンマや。知らんかった…
というか、昔何かのBASICで ?書いてたような記憶が蘇ってきた…
ちなみに print #1とかにも使える〜
教えてくれてありがと〜
>>877 ネットでしか偉そうなこと言えない真正バカニートはそう言うことでしか精神状態保てないんだね
かわいそうに
>>841 ・名前空間がない
・クラスが継承出来ない
・局所関数が作れない
みたいなコード管理や再利用に関する機能が貧弱
そのせいで関数同士の関係が分かりづらくて
作った人しか分からないソースになりがちだと思う
一応プロジェクトを名前空間として扱えば頑張れるが作業に対するコスパが悪い
他人に簡単に理解されて得なことなんて一つもない 理解されない方が得 理解されて何の得があるんだよ
チームメンバーは他人じゃないよな いわば運命共同体 同僚は兄弟、同僚は家族
>>879 それ、よく言われてるけど、結局オブジェクトのスパゲティーができるだけだよな、、、
ちょっとしたシステムでもクラスが数千個もできて管理できないやつ
継承とか再利用って何か修正があった時の影響調査に時間ががかるだけで全然楽にならない
いまだにVBAで新規開発してるようなレベルの現場ならまあそうなるだろうな
>>885 他人の知識を共有化させてプログラムにしてお金を稼ぐ鬼畜
正義ぶっていい気になんな
Excelで会社の進捗表や推移表を作っているのですが VBAで作れるようになりたいです。 どの本から勉強するのがオススメでしょうか?
>>884 バカが使うとどんなツールでも意味ないというだけの話
>>887 VBAはExcelだけで実現が難しいことをやるためのもんなのでExcelでできることはあまりVBAを使わない方がいい
>>887 vbaの本の前に、プログラミングの基礎から学んだ方がいいのでは?
ExcelでVBA使うだけならプログラミング基礎からやる必要はない
>>887 そんな暇があったらMS Projectでも買え
クラウド版のサブスクリプションなら一人月額千円だから、お前の月給が30万ならお前をリプレースすれば300人分になる
>>884 >影響調査に時間ががかる
って時点で間違ったオブジェクト指向だな
変更時の影響範囲を限定するためのOOだぞ
>>887 表紙がやさしそうな本から読めば?
何冊も読む必要があるけど
最初から分厚いの読むより楽
あとVBAで作ることに意味があるのは
定型化や自動化できる部分なんで
業務を把握することがVBA以上に大事
>>894 どういう使われ方をしてるか確認しないのか?
リグレッションとかもしないの?
みんな理想通りにオブジェクト指向で作れてるんだな、、、
局所関数はむしろローカルスコープ内でイテレータに渡して使い捨てるだけというイメージだが 変数に仕込んであちこちで使い回したりしてるのか
>>878 お前みたいな馬鹿に対して周りが思っていることをはっきり書いただけだが
図星で悔しかったか?
実務経験1年で月収80万稼げるエンジニアになった理由
VIDEO 意識が低いエンジニアこそフリーランスになれ
VIDEO フリーランスエンジニアの週3労働ってどんな感じ?
VIDEO ぼくがスキルのない社畜ならこうやって脱する
VIDEO 初めて人を雇ったらもう二度とサラリーマンをやりたくないと思った話
VIDEO プログラミングは文系でも余裕で出来ます!理由を現役プログラマーが解説
VIDEO 貧乏人こそ社会不適合者
VIDEO 元ド貧乏が教える】貧乏を抜け出すための2つの考え方
VIDEO より良いオファー貰ってるのに転職しないとか何考えてるの?
VIDEO こういう宣伝は嫌われるからな。 次から気をつけろよ
>>879 >・名前空間がない
C言語にも名前空間はありません。そんなCでもうまくやっているのだから、どうでもいい問題でしょうね
>・クラスが継承出来ない
OO 界は継承は「ダメな子」「出来ない子」「要らない子」「出来ちゃった…」な存在なのは周知の事実
継承は排除されつつあり、かわりに継承と等価な委譲を使います。VBA でも委譲を使えばいいのです
>・局所関数が作れない
C言語にも局所関数はありません。そんなCでもうまくやっているのだから、どうでもいい問題でしょうね
>>896 VBAの話ですよね?
普通、理想通りのオブジェクト指向作れるでしょう
VBAの案件なんて一人で全部兼任でしょうに
>>901 どうでもいい訳ない……!
Cがあまり使われなくなった理由だろう
名前空間だけじゃなくてOOじゃないのが
>>898 お前みたいなネットでしか偉そうなこと言えない真正バカニートに対して周りが思っていることをはっきり書いただけだが
図星でしたか
かわいそうに
>>897 そう、ローカルスコープ内で定義できる使い捨て関数が欲しいってこと
現状だとイテレータを作るクラスにPublicで関数を公開しないといけないから管理しづらくなる
>>901 言語機能が安全なプログラミングをサポートしてくれるかって話なのに、
C言語ならうまくやる(根性論)で解決してると言われても困る
その委譲ってライブラリをラップする時とかで使う奴だよね
継承代わりに多用してたらスパゲッティの温床になるから、もし実務でやってるなら減らした方がいいよ
>>899 この人タイでよくエッチな店行ってると自慢して
それを動機にフリーエンジニアになれと言ってたよね。
われわれもほんとになれるの?
継承は、スマホアプリや他のいろんなプラットフォームで利用されてるぞ
>>903 >Cがあまり使われなくなった理由だろう
冗談でしょう?
C は今でもバンバン使われていますよ、linux は C で記述されており C++ は受け付けません
あと汎用ライブラリ zlib とかは、多言語から呼び出せるように、あえて C で記述しています
汎用ライブラリは、それが汎用性を目指せば目指すほど、C で書き直される運命にあるのです
>>905 >継承代わりに多用してたらスパゲッティの温床になるから、もし実務でやってるなら減らした方がいい
最近の動向は真逆ですよ
継承こそ、スパゲッティの温床であり、継承は is-a 関係以外では使ってはいけない、継承こそ制限されるべきです
私も
http://2chb.net/r/tech/1434079972/37 では継承を使っていましたが、
http://2chb.net/r/tech/1434079972/51 では委譲に変えました、委譲に換えて目障りなキャストが減りすっきりしました…
Excelvab初心者です。血からを貸してください。 ユーザーフォームで商品名をExcelのシート(商品マスター)に入力しています。 A列には番号が自動的にB列にはユーザーフォームで入力した商品名が入力されます。 B2に(例えば、まぐろ)が入力された状態で入力フォームにまぐろが入力されるとエラーがでるようにしたいのですがうまくいきません。お力をお貸しください
>>905 あなたのいう機能が無いと困るのは、どういうマクロを組むことを想定してのことですか?
あくまでVBAで設計するレベルの話で
それらの機能があったとして、すごい楽!!ってなる場面が思いつきません
>>910 テキストボックスのイベントであったような気がしますが
そもそも、その設計だと「まぐろ丼」と入力したい場合はどうなるのでしょうか
まぐろ「エラー!!!」丼という感じになるような
テキストボックスに入力をし終わってから、登録処理を実行する時にチェックをすれば良いのではないでしょうか
>>910 マグロの入力が駄目な理由は?
使用が禁止されている商品名だからなのか、既に登録済の商品であるマグロの重複入力を避けたいのか
入力制限の趣旨によってエラーチェックの実装が異なる
プライマリキーとかデータ制約の話ならSQL使うべきや
>>912 コメントありがとうございます。
データの重複をさけたいのです
>>911 返信ありがとうございます。
おっしゃるとおり
『テキストボックスに入力後の登録処理時にチェックする』
がやりたいことに近いです。
やり方をご教授いただければうれしいです。
現在の入力フォームはこのようは形です。 Private Sub btnEntry_Click() Dim rv As Integer r = Range("A" & Rows.Count).End(xlUp).Offset(1).Row Worksheets("商品マスタ").Range("A" & r).Value = r - 1 Worksheets("商品マスタ").Range("B" & r).Value = txtGoods.Text txtGoods.Value = "" txtGoods.SetFocus End Sub
>>908 高速な処理が求められるライブラリには
これからも速いCが使われていくだろうね
フロントエンドはPythonとかOOになる
AIとかがそうでしょ
Private Sub btnEntry_Click() On Error GoTo errorStep Const PRODUCT_TBL_NAME As String = "商品マスタ" Const PRODUCT_NAME_COLUMN As Long = 2 '商品名が登録されているカラム Dim productTbl As Worksheet Set productTbl = ThisWorkbook.Worksheets(PRODUCT_TBL_NAME) With productTbl Dim productRecord As Variant productRecord = .Range(.Cells(1, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft).Column)).Value End With Dim existsItem As Boolean existsItem = False Dim i As Long For i = LBound(productRecord, 1) + 1 To UBound(productRecord, 1) '1行目はタイトルなので+1にて検索を省く If productRecord(i, PRODUCT_NAME_COLUMN) = txtGoods.Text Then existsItem = True GoTo errorStep End If Next With productTbl .Range(.Cells(UBound(productRecord, 1) + 1, 1), .Cells(UBound(productRecord, 1) + 1, PRODUCT_NAME_COLUMN)).Value = Array(UBound(productRecord, 1), txtGoods.Text) End With With txtGoods .Value = "" .SetFocus End With errorStep: If existsItem Then MsgBox txtGoods.Text & "もとい、まぐろが重複しています", vbCritical + vbOKOnly, "重複" ElseIf Err.Number <> 0 Then MsgBox Err.Number & Err.Description End Sub
Excel VBAの手書きで入力する InkEditコントロールを利用しているんだけど、最初の一画目を横に引くと線が消えて右に進んでしまう。 (一を描くと手書きと認識されずに右に進むになってしまう) 逆に一画目を右から左に引くと同じように消えるけどバックスペースとして認識するのか入力文字が一文字消える。 何かのコントロールが入っているのかな? 一画目からきちんと手書き認識させるにはどうしたらいいのか教えてほしいです。
>>922 androidの手書き入力でも同じ問題が起きてる
設計したのがアメリカ人だからどうしようもない
書き順を無視して縦線から書くしかない
VBAで「タッチして描写する」を呼び出したい場合はどう登録すればいいですか?
>>917 Private Sub btnEntry_Click()
Dim r As Integer
r = Range("A" & Rows.Count).End(xlUp).Offset(1).Row
With Worksheets("商品マスタ")
If Application.CountIf(.Range("B:B"), txtGoods.Text) = 0 Then
.Range("A" & r).Value = r - 1
.Range("B" & r).Value = txtGoods.Text
lblAlert.Caption = ""
Else
lblAlert.Caption = "入力済です"
End If
End With
txtGoods.SetFocus
Application.Wait Now + 1 / 24 / 60 / 60 / 10
SendKeys "^a", True
End Sub
いつも思うんですけど、 With ActiveSheet .Range(.Cells(1, 1), .Cells(2, 3)) End With って、シンプルに ActiveSheet.Range(1, 1, 2, 3) にしてくれませんかねぇ。
シンプル重視か把握しやすさ重視は人によるんでないの
自分的にしてほしいのはこれ rows(3, 5) columns("a", "c") rangeはOKなのになんでダメなのか
>>928 範囲指定ならrows("3:5") columns("a:c")とか書けるけど、そういう意味じゃなくて?
>>929 変数使ったら「a & ":" & b」って書かなきゃならんのが嫌なだけ
& ":" &が嫌
>>928 二次元のオフセット値で座標確定しなきゃならないRangeと違ってRowsやColumnsは一次元のオフセットで場所を指定できるからね
行や列の指定に多次元引数を許容する実利が少ない
逆にRangeだって三次元以上のインデックスを指定できるようにする意味がないから二次元までのインデックスになってるわけで
>>925 Application.Wait Now + 1 / 24 / 60 / 60 / 10
これって、wait してる?
925だけど、ごめんなさい NOWだと秒未満が扱えないから、現在時刻が0.1秒超えるとコマンド実行分しかwaitしてないのか 以下の様に訂正します ×Application.Wait Now + 1 / 24 / 60 / 60 / 10 ○Application.Wait [Now()] + 1 / 24 / 60 / 60 / 10 []はワークシート関数らしいね
セルの組み合わせを検索したいんですがfind関数のAND使うしか無いですかね? A1セルかつB1セルの値をC,D列から検索するような事をしたいです。
みなさんが使ってるパソコンのスペック教えて下さい できれば機種もおながいします
>>935 AB列の値を結合した検索用の列を追加すればいいんじゃね
>>938 大喜利。
MMXペンティアムとかボケろってことでは?
datファイルやtxtファイル読んで配列に入れたい場合って、EOFまで一行ずつ読んで配列要素をredimするのがキレイで分かりやすい?
>>940 ありがとうございます
セルをグループ化するオブジェクトがあるかと思ったのですが、皆さんの反応見るとやり方工夫するしか無さそうなのが分かりました…
他の言語やってれば独学で(も)行けるが もし始めてなら入門書読んだ方が早いかも
>>947 サイトで調べてやろうかと思ったけどなかなか大変そうなので買って読んでみます!ありがとうございます!
VB.NET 廃止か まさかVBAより先に死ぬとはな
>>950 これは電子書籍無料ダウンロードはできないのね
見るだけか
https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/ 今後、Visual Basicを言語として進化させる予定はありません。
言語の変更を必要とする.NET Coreの将来の機能は、Visual Basicではサポートされない可能性があります。
プラットフォームの違いにより、.NET Framework上のVisual Basicと.NET Coreにはいくつかの違いがあります。
>>953 画像ファイル1ページずつならできないわけじゃないけど面倒やね
例えばクロームのデベロッパーツール使うと
>>957 死ぬのは、スレ違いネタに必死になってるおまえの方だよ
A列の数字に対してabc順に処理をしたいんですがどのような構文にすればいいでしょうか? A B C 1 a d 1 b e 1 c f 2 g i 2 h j 3 k l
>>964 abc順に進むカウンターでループ
BC列の各セルに対しfor eachループし、 カウンターと一致したら同行A列の数字に対して処理を行う
>>965 すみません説明が悪かったです
A列を組としてB列を男C列を女としたときに
1組の男、1組の女、2組の男、2組の女‥‥の順でそれぞれ上から処理する形です
>>964 の例で言うと
1-a (B1)
1-d (C1)
1-b (B2)
1-e (C2)
1-c (B3)
1-f (C3)
の順に処理したいって事?
オレ: >>965 すげぇ! >>964 が言ってる意味分かるんだ!! オレ: >>966 ?、組?男?女? 964を見てそれを想定するの、人類にはムリだよ… で? 結局「処理」って何なん? オレ: >>967 すげぇ! さっぱり分からん!! アルファベット順だろ A列がソートされてるんならIFで一個下と比較すりゃいいだろ されてないならソートしろ
>>966 1((a,b,c),(d,e,f)),2((g,h),(i,j)),3((k),(l)) かな
どうも、アルファベット順というのも座標の説明に使っただけで、それでソートするってわけでもなさそうだね
組もごちゃ混ぜになってるわけでもないっぽいね
なら
上から下へ進むループを組んで、組が変わったら位置を記憶して、その範囲でB列、C列の順にループ
すげーよな 昇順になってんだから頭から順番に処理すりゃいいんじゃね?としか考えつかない
別のブックのVBAをRUNしたらMsgBoxが出てきてボタンをクリックしないといけなくなったんですが、 VBAでボタンをクリックする方法はないでしょうか。 その別のVBAの方は修正したくないので。
タッチディスプレイでエクセルドロップダウンリストが選択しにくいのでVbaでユーザーフォームで ドロップダウンリストを全部表示させて選択式にしたいんだけど何か良い方法ありますか?
VBEの各種ウィンドウ(プロパティウィンドウとかローカルウィンドウとか)を マウスでドラッグすると、ウィンドウの枠がマウスポインタの動きから 遅れて動き、ウィンドウの枠がチラつくのは自分だけですか? CPU使用率は10%未満なのでスペックの問題ではないと思います。 OSはWin10でエクセル2010の環境です。
すいません。意味が分かりにくいので再投稿します。 VBEの各種ウィンドウ(プロパティウィンドウとかローカルウィンドウとか)を マウスでドラッグすると、そのウィンドウの枠がチラつきながら マウスポインタよりも目に見えて遅れて動きます。 これは直すにはどうしたら良いでしょうか。 CPU使用率は10%未満でメモリ使用率は50%未満なので スペックの問題ではないと思います。 OSはWin10でエクセル2010の環境です。
>>977 ドロップダウンじゃない方のリストボックスを使う
ユーザーフォームにこだわらなければ、空欄にリストの内容を表示して、イベントで拾ってもいいと思う
(インクの開始)とかをマクロボタンに登録可能? 各機能をマクロボタン化したいけど、どの機能がどのマクロか探しても出てこない…
これ? With Application.CommandBars If .GetEnabledMso("InkingStart") = True Then .ExecuteMso "InkingStart" End If End With
描画にインク機能があるが、再生が無い。 2019なのに何故?
>>983 まあ回答じゃないけど、その場で
Dim cb As Commandber
Dim ctl As CommandbarControl
For Each cb In Application.Commandbars
Debug.Print cb.Name
For Each ctl In cb.Controls
Debug.Print " " & ctl.Name
Next
Next
的なのを実行して調べるな。(出先なのでExcel触れないから間違ってるかも。NameはCaptionか?)
大量に出てくるからDebug.Printじゃ間に合わないだろうから、GUIにしてリストボックスとかにするのが現実的。
>OSはWin10でエクセル2010の環境です。 これだよ 2013以上にすると直るよ
Excelの内部構造が大幅に変わったのは2017からじゃなかったか
>>984 タッチパネルだとエラーがでたり、何も動かなかったりするね…
>>975-976 待ちになったままsendkey の行が処理されないですわ
>>992 されるわけない。
マルチプロセスにすべし。
>>993 こんな感じか
'CreateObject("Excel.Application")を宣言し変数を作成します。 Set myApp = CreateObject("Excel.Application") '以下のコードがエクセルを別プロセスで開くための肝になる点です。 myApp.Workbooks.Open "開く対象のファイルのフルパス" '
コピーした行を挿入したいのにpasteやらDestination:=Rowsやらinsertやら試してもダメだったけどPasteSpecialしたら通った よくわからん
pasteやらDestinationじゃそりゃ出来んだろう
>>996 そうなの?解説ページ見たんだけどな
ほかに行貼り付けする記述ってあります?
Excel×Python最速仕事術 マクロはもう古い!
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 105日 13時間 52分 40秒
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20241225194904ncaこのスレへの固定リンク: http://5chb.net/r/tech/1575297834/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「Excel VBA 質問スレ Part64 YouTube動画>9本 ->画像>4枚 」 を見た人も見ています:・Excel VBA 質問スレ Part61 ・Excel VBA 質問スレ Part68 ・Excel VBA 質問スレ Part67 ・Excel VBA 質問スレ Part66 ・PROJECT X ZONE 2:BRAVE NEW WORLD質問スレ [無断転載禁止] ・5chブラウザ「ChMate」質問スレ Part65 ・【エバクラ】FINAL FANTASY VII EVER CRISIS 【FF7EC】初心質問スレBattle.1 ・【FFRK】FINAL FANTASY Record Keeper 質問スレ4 ・【UE4】Unreal Engine 4 初心者質問スレッド part1 ・Stardew Valley 質問スレ 3 ・【MGO】METAL GEAR ONLINE 質問スレ Part14 ・Oracle 質問総合スレ14 ・【PS4】TES V:SKYRIM スカイリム 質問スレ4【SE】 ・【EDF5】地球防衛軍5の質問に全力で答えるスレッド 其の四 ・【DAW】REAPER Ver.3x系質問スレ【フリー版禁止】 ・Oracle 質問総合スレ12 [無断転載禁止] ・【FF14】FINAL FANTASY XIV 質問スレ136 ・【FF14】FINAL FANTASY XIV 質問スレ146 ・FL Studio 初心者&質問スレ Step 25 ・FL Studio 初心者&質問スレ Step 30 ・【FF14】FINAL FANTASY XIV 質問スレ134 ・【FF14】FINAL FANTASY XIV 質問スレ129 ・【FF14】FINAL FANTASY XIV 質問スレ128 ・【FF14】FINAL FANTASY XIV 質問スレ119 ・【FF14】FINAL FANTASY XIV 質問スレ137 ・【FF14】FINAL FANTASY XIV 質問スレ124 ・【FF14】FINAL FANTASY XIV 質問スレ161 ・【FF14】FINAL FANTASY XIV 質問スレ106 ・【FF14】FINAL FANTASY XIV 質問スレ135 ・【FF14】FINAL FANTASY XIV 質問スレ111 [無断転載禁止] ・【FF14】FINAL FANTASY XIV 質問スレ103 ・【FF14】FINAL FANTASY XIV 質問スレ174 ・【FF14】FINAL FANTASY XIV 質問スレ154 ・【FF14】FINAL FANTASY XIV 質問スレ108 ・【FFRK】FINAL FANTASY Record Keeper 初心者質問16 ・【FF15】FINAL FANTASY XV 攻略&質問スレ No.8 ・【FFRK】FINAL FANTASY Record Keeper 初心者質問15 ・【FFRK】FINAL FANTASY Record Keeper 初心者質問11 ・BF4のくだらない質問に誰かが答えるスレ Vol.18 ・テレビのADだったけど質問ある人 [無断転載禁止] ・ピンサロ嬢ですが、質問あれば´ `* partX [無断転載禁止]©bbspink.com ・【PS4PS5/XBOX/switch】APEX LEGENDS エーペックスレジェンズPart1277【転載禁止】 ・★100130 vip 「[ClickJapan AutoReporter3]」保守荒らし報告スレ ・専用スレが無い女子団体の為のスレッド【OZ ディアナ SEAd LLPW-X JTO COLOR'S プロミネンス etc.】 Part5 ・【ジュースジュース】Juice=Juice総合スレ Part.202【段原・井上・工藤・松永・有澤・入江・江端・石山・遠藤・川嶋】 ・【宣伝】Football Manager 日記スレ42【禁止】 ・【バーチャルYouTuber】ENTUM(エンタム)アトチスレ1741【ナイツオブマシュマーそれはエンドラの騎士】 ・【Special Force】スペシャルフォース 5on5 晒しスレPart87 ・【競馬界に震撼】巨大詐欺ネットワークが関与か!?競馬YouTuberケイタ・ナツ・サスケpart65 ・ZEPに関するくだらねぇ質問はココで聞け! Vol.1 ・【ビエラ】Panasonic VIERA 液晶専用スレ [無断転載禁止] ・質問に答えない出品者 vs 自己中&値切り乞食 ・【日テレG+】ACL ペルセポリス×アルサッド 2nd ・ブシロード KNOCK OUT、RISE、SB他 非K-1【総合スレ】535 ・【SUBARU】4代目(SJ)フォレスター 98【FORESTER】 ・【バ一チャルYouTuber】ENTUM(エンタム)アンチスレ1479【高みの見物】 ・SCANDAL vs チャットモンチー vs ステレオポニー 4 ・Jane スキン晒しスレ Part15【萌専用】 ・【バーチャルYoutuber】にじさんじ有ンチスレ9320【szrn36】 ・NEC VersaProスレ 22台目 [無断転載禁止] ・☆ホモが気になった画像を貼るスレ☆ Part.41 ©bbspink.com ・バグダッド・カフェ 4Kレストア-BAGDAD CAFE- ・【バーチャルYoutuber】楠栞桜アンチスレ#840【次スレいらねー( °×° )】 ・【LAA】大谷翔平応援スレ part214【DH/P】 ・【バーチャル】hololiveファスレ33078【youtuber】天音かなた引退しないで❤ ・男子マラソン・長距離総合スレ Part270
05:49:04 up 13 days, 16:13, 0 users, load average: 7.29, 7.21, 7.36
in 2.0471570491791 sec
@0.070483922958374@0b7 on 122519