VBAなんでも質問スレ Part2 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
VBAを使った質問ならなんでもござれ
本来の対象であるオフィスアプリを操作する以外の話もOK
ゲーム作り、Webアクセス、外部アプリの操作
COM(ActiveX)、Win32API、.NET Framework、DirectXなどなど
VBAで実行するものであればなんでも質問してください
VBAを開発環境としていろいろ作っちゃいましょう
前スレ
VBAなんでも質問スレ
http://peace.2ch.net/test/read.cgi/tech/1342087380/
関連スレ
Excel VBA 質問スレ Part36 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1419718732/
Access VBA 質問スレ Part1
http://peace.2ch.net/test/read.cgi/tech/1328536426/
VBプログラマ質問スレ(Ver.6.0 まで) part64
http://peace.2ch.net/test/read.cgi/tech/1393069842/
Excel総合相談所 118 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1430352555/ vba初心者でわからないところがあって質問したいんですけど、ここで大丈夫ですか? ExcelとAccessは専門スレが別にあるけどな >>647
その宿題をやるには「フォームの作成」という作業が必要で、それは文章だけの掲示板じゃとても説明できない 二次方程式 VBAのキーワードでぐぐればそれなりに情報はあるよ 学校でExcelの課題出るのか
全員Excel入りのWindows機もってる前提なのか なきゃ学校にあるPC使うだけやんけ
変な事気にする奴やな >>653
商業科の電卓名人みないな奴は、もぅおらんのか VBAで3つ数値があった時、最大値を表示させたい時
下記URLのNo.4の回答のelseifを使ったものがありますが、
elseifを使わずにelseだけで表示しようとすると、
どのようになるのでしょうか?
宜しくお願いします
ttps://oshiete.goo.ne.jp/qa/5352661.html 分かりづらそうなので追記で、下記のところです。
宜しくお願いします
a = 10
b = 200
c = 30
Max = a
If b > Max Then
Max = b
ElseIf c > Max Then
Max = c
End If Max = a
If b > Max Then
Max = b
Else
If c > Max Then Max = c
End If >>658
ありがとうございます
試してみたいと思います そもそも657では最大値求められないだろ。
なぜ他の2つと比較してから決めないのか すいません、まだ初心者でまだ理解が追いついていなくて
とりあえず最大値求めるにはこういう形...とかで覚えようとしてて....頑張ります 658でも最大値は求められない
試しに
a = 1
b = 2
c = 3
で試してみるといい。Maxが2になってしまう
Ifだけでやる場合の正解の一例
Max = a
If b > Max Then Max = b
If c > Max Then Max = c >>661
If Elseの構文は、最初のIfの条件が成立したらElse以降は処理されずEnd Ifまで飛ばされる
つまり、
a = 1
b = 2
c = 3
だった場合、
b > Maxが成立したらc > Maxの部分は飛ばされてしまうからMaxは2のまま終わってしまう elseやelseifは先行条件でTrueにならない場合にしか実施されない仕組みなことを理解しましょう >>661
このレベルを形で覚えようとしている貴方にプログラミングは向いてない ID変ったかも知れませんが>>656です
皆さんありがとうございます
>>665
手痛いレスですが、出来るところまで頑張ろうと思います。プログラマーではないですが基本は覚えないと連携し辛い位置の役職のため頑張ります。 本当のプログラミング初学者なら仕方ない。制御構文なんてどの言語も似てるので、1つ覚えれば次は勘が効くようになるよ、長い目でがんばりなされ 最大値を求めたいならWorkSheetFunction.MAX使えば良いんじゃね? パニックを、5人がかりでやれば楽勝だろ、とか言ってるようなもの。 VBA初心者です。少し長くなってしまいますが質問です。
・やりたいこと
1:現マクロ有効ブックのsheet1にフォームボタン設置する。
2:押すとC:\Users\Public\動物まとめ.xlsx をバックグラウンドで開き、その中のシート名"カピバラ情報"の E列4行目から5行目6行目...と、空白が来るまでの情報を取得しする。
3:現マクロ有効ブックに新しくsheet2を作り、その新シートのA1からA2A3...に取得した情報を書き込む。
現在のマクロは下記ですが上手くいかないです。
Option Explicit
Sub practice()
Dim i As Long
i = 4
Dim fullPass As String
'セルのB3に C:\Users\Public\動物まとめ.xlsxと記述
fullPass = Range("B3")
Dim wb As Workbook
Dim Anothersheet As Worksheet
Workbooks.Open fullPass
Set Anothersheet = wb.Worksheets("カピバラ情報")
Sheets.Add After:=ActiveSheet
Range("A1").Select
Do While Cells(5, i).Value <> ""
i = i + 1
Loop
Call wb.Close
End Sub
上手く情報を取得できないのでアドバイスお願いします。 >>675
wbに何も代入されてない。
AnotherSheetへの代入もこけるはず。
AnotherSheetが正しく生成されたとしても、その後使用されていないから何かとってこれるはずがない。 >>675
fullpass じゃなくて、fullpath ね。 >>675
行列指定が逆?
5行目を右方向に評価してくような感じになってるけど、新規に作ったシートが対象になってるから、一周もループしてないよね? >>675
Cell値を取るときは、デフォルトにまかせずちゃんとプロパティ指定しよう。 >>675
バックで開いたつもりのブックに新規シート作っちゃってない?
ブックのフォーカスを制御するとか必要かも。 ID変わりましたが>>675です。
>>676‐>>680
遅い時間帯でありながら見てくださって
ありがとうございます。
色々と不十分だったのですね。
指摘箇所を直したりして
また報告しようと思います。 >>675
最初に注意すべきなのは、いきなりRangeやCellsは絶対に使うべきじゃないってこと。
ちゃんと省略せずにWorkbookやWorksheetから書くようにする。
しかしそれだとコ―ドが長くなるのでそのために今回のコードのように変数で受けるかWith文を使う。
以下はスマホ上で書いてるんで動くかは不明です。 Option Explicit
Sub practice()
Dim i As Long
Dim fullPath As String
Dim wb As Workbook
'Anothersheetじゃ分かりにくいんでopnShtに変更。
Dim opnSht As Worksheet
'追加シートは変数に受けないの?
Dim addSht As Worksheet
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
fullPass = Thisworkbook.Worksheets("Sheet1").Range("B3").Value
'B3に出鱈目書いて動かしたらどうなるんだろう?
Set wb = Workbooks.Open(fullPath)
Set opnSht = wb.Worksheets("カピバラ情報")
With Thisworkbook
Set addSht = .WorkSheets.Add( After:=.WorkSheets("Sheet1"))
End With
'Range("A1").Selectって何の為に有るの?
'iの初期値を一番最初に書いてたけど、初めて見たとき何だか分からんかった。
'使う直前に関連処理と一緒にまとめた方が分かり易いよね。
i=4
Do While opnSht.Cells(5, i).Value <> ""
i = i + 1
Loop
'元のCall wb.Closeなどという書き方をしたことが無いのでいつもの自分の書き方に変更。
wb.Close False
End Sub >>680
フォーカスを制御すべきじゃない。
いきなりRangeやCellsを使うから上手くいかないのであって、きちんとブックやシートから書けばフォーカスを制御しなければならないことは滅多に無い。 早速間違いだ。
fullPassと書いてる所が一ヶ所ある。
fullPathに直しておいてね。 >>684
まぁ、そうかもね。
でも最初はいろいろ試してもいいんじゃない? >>682‐685
ありがとうございます
深夜のご指摘から>>685まで参考にしていて
現在デバッグしてますが、“カピバラ種類”のシートが上手く取得できていないようです。
ちなみに
'セルのB3てどこ?
'多分ボタンのあるシートかなと推測。
その通りです、分かりづらくてすいません。
改行制限のためいくつかコメントは掲示板に書き込むとき省いてしまいました。
'Range("A1").Selectって何の為に有るの?
ですが 、新シートのA1から書き込む為に書きましたが、デフォルトでA1から書き込むみたいですので
無駄なマクロでしたね。 少し言葉足らずでした。
iのカウント(空白行までループ)は上手く出来ているので、現マクロ有効ブックの新シートに取得情報を
書き込めていないようです。 >>688
うん?
Do〜Loopの中はiのカウントアップしてるだけなので、あなたが省略した(と勝手に思ってるんだけど)コードが動いていないということ?
念のためにいうと、元々のコードには情報を取得するコードが全く無いからこのコードだけじゃ取り込めないのは当たり前だよね。 すいません、
不覚に気づき、
dim j as long
j = 1
を追加し、ループを
Do While opnSht.Cells(5, i).Value <> ""
addSht.cells(j,1) = opnSht.Cells(i, 5)
j = i
i = i + 1
Loop
にして上手くいきました、ありがとうございます。 細かい修正として
j = i
i = i + 1
の部分も
i = i + 1
j = i - ○
のようにして、
無駄にできてしまう空白もなくしました。
お付き合いしてくださった方、
ありがとうございました。 質問です
ワークシート上にすでに引かれている複雑な枠線をコードとしてどうにか変換というか取得できる方法はないでしょうか… >>693
返事ありがとうございます
すみません、私の頭では理解できません…よかったらもう少し詳しく教えてもらえませんか >>694
罫線を描く動作は理解できてる?
マクロ記録で簡単に調べられますよ。
例えば、2行2列選んで、縦横斜め全てに実線入れて
記録されたものを見ればどのような構造で描かれているのか
分かります。
記録の際は、xl〜の定数でよいですが、取得の際は数値で
返ってくるので注意。
調べたければオブジェクトブラウザで調べてもよいですが、
イミディエイトで、?xlThin みたいに簡単に確認する方法も
あります。
でも、取得して使うなら数値のままでもOKです。
ここまではOK? >>695
>>696
会社でとある先人の作ったエクセルのフォーマットがあるのですが、それを使って作業するおばあちゃんが度々壊してしまうのです
セル結合やセルの幅など複雑になっている物なので、壊してしまったパソコンの不得意なおばあちゃんはいつも四苦八苦していて、どうにか入力された数値以外の罫線や列幅などだけボタン1つ簡単に戻せるものを作ってあげたいと考えています
頂いたヒントを元にもう少し頑張ってみます
結局わからなければまた質問させてください
ありがとうございました >>697
シートの保護じゃダメなの?
おばあちゃんには特定セルに数値入力させてるだけなんでしょ? >>697
シート保護で十分みたいですね。
もし何らかの理由で保護できないのであれば、
同フォーマットの隠しシートから書式貼り付けした方が早そう。
セル結合もあるし、1セルずつ罫線情報取得とか効率悪すぎ。 >>698
>>699
それがわかりながらあらゆる所(不規則)を動かさないといけない時があったりで、保護だと都合が悪かったんです
フォーマット自体を大幅に変更できればもっと色々と簡単にできるのですが、それも他のおばあちゃんたちが前の方が良かった〜なんて必ず言うので見た目を崩すことはできません
担当のおばあちゃんorおばさんが変われば書式貼り付けのための範囲選択も上手くできないだろうから(全選択など知りません)また誰かが黙って長時間四苦八苦する事になってしまいます
無駄にすべて最初からやろうとしたりも平気であります
平均年齢49才の職場なので仕方ないんです
誰にも聞かずに戻したい部分を戻せるような、とーーってもわかりやすい説明付きのボタンをユーザーフォーム上にでもいくつか作ってあげたいと思っています
崩してしまうパターンはだいたい把握できているので、それが最善かなと… >>700
いや、だから隠しシートから自動的に書式修復をかければという意味で言うたのですが、、
トリガーはファイルオープンでも、ボタンでも。
試しにやってみたけど、罫線やセル結合は問題なく修復できるみたい。
入力規則とかは引き継げないみたいなので別にケアする必要があるかも。
行挿入、列挿入とかされて座標がかわるようなことされないならこれで十分では?
自分がよくやるのは、表のエリア毎に範囲名をつけて、そのエリア単位で最初に表組みした
ときと同じ要領で表作成を記録していき、コードを整理して修復マクロにします。
これなら起点となるセルが壊されなければ行挿入、列挿入にもある程度柔軟に対応
できるし、式や入力規則の修復も追加できる。
まぁ、利用者は作成者の想定を軽く超えてきますけどね。 >>701
理解力なくてすみません、、、
そしてありがとうございます
そのやり方を取り入れてとりあえず一度作ってみます! ディム a アズ インテジャー
コンスト b アズ バリアント = ファルス
この読み方はあってますか? マジか!
自信なくなってきたわ。
フォー イーチ 〇 イン、スターコンブ、ブイビーナロウ、コンカット、
ナンバーフォーマットローカル、ドゥ ホワイル、イズナメリック、
デカー ファンクション セットウインドウロング リブ "ユーザー32" エリアス、
バイバル 〇 アズ ブーラン、アプリケーション.ハウンド、オプション エクスプリシト。 numeric ニューメリック
alias エイリアス
boolean ブーリアン >>709
>>707が言う通りDeclareじゃね? declare デクレア(デクレアー)
発音記号を見るとディクレィアーなんだけど、音声ではディよりデに近く聞こえる
https://en.hatsuon.info/word/declare パワポでExcelのVBAにある
Application.OnUndo
みたいなことって出来ない? Application.CommandBars.ExecuteMso "Undo" >>716
そっちだね
あるいはパワポの内部変数(たとえば図形のRGB値とか)の変化を検知してイベント上げるとかでもいいんだけども 質問スレでいつも思うんだけど、どんな状況でそれが必要なの?
Excelで出来るんなら、逆にExcelをパワポっぽく見せるという手もあるんじゃないの? 勉強もかねてパワポのアドイン作ってるのよ
だからExcelじゃなくてパワポで出来なきゃ意味がない
その機能自体が必須で欲しい訳ではないから出来ないなら出来ないで諦める 何か斬新な使い方って無い?
ワードでファミコンみたいな。 Functionで値を返すのと、ByRefで返すの、どう使い分けたらいいのか、わからなくなってきた。
どっちでも返せる状況なら、どっちがいい? 他人とか将来の自分が読みやすいようにFunctionで Function一択
ByRefは古い書き方で互換性のために残してる
これから作るプログラムには使うべきじゃない >>721
どちらでもいい状況ならFunctionの方が使い易いのでFunctionにした方がいい
あと>>724はアホだからスルーで ByRefが互換性維持のために存在するという話は聞いたことがないぞ sortのcustomorderって、セル値を入れられたりはするのでしょうか?
複数のセル値を優先順位としてデータを並び替えるマクロを作成したのですが動作が遅いので改善出来ればと考えています。(forとifで判定する手法をとっています)
よろしくお願いします 標準のソート機能で出来ないことでもやるの?
駄目ならSQL使うとか。 さて、名前付き範囲ってVBA@Excelで使えないんだろうか。
もし使えたとして、実行時間はどうなのだろうか。
色々と謎が多い。 >>732
それ使うと後でエラー見つけるのめんんどくさくなる >>732
使えるよ
Application.Namesでコレクション取得して名前つき範囲にアクセスできるし、シートのRangeプロパティの引数ラベルとして名前をそのまま使ってセル取得できる 名前をキーにして名前付き範囲にアクセスするときはリスト形式になってるNamesコレクションの要素に対して正規表現か何かで逐次マッチ検索してるはずだから、名前付き範囲が増えれば増えるほどアクセスが遅くなる なんで正規表現?
完全一致でいいじゃろ?
SortedListなら量に正比例して増えることはない >>737
> 正規表現か何かで逐次マッチ検索してるはずだから
なんだその意味不明な思い込みはw
普通に考えてハッシュなりB-Treeなり使ってるだろ
そもそも逐次検索だとしても遅さが気になるほど大量の名前付き範囲使う時点でなにか間違ってると思う 会社でブラウザの検索結果のページで
いっぱいURLのリンク先が表示されるのですが
そのたくさんのURLのそれぞれを開いたページ(毎回違うけど50ページくらいある)のデータを取得するVBAのコードを考えています。
IEの定番のCreateObject("InternetExplorer.Application")とDOMツリーの方法で実現できてはいるのですが
1つ1つページを開いて取得して閉じる、という作業がネットワークの遅さで異常に時間がかかります。
この複数のページを同時で取得する方法ってないでしょうか?よく知らないけどJavaでいうスレッドみたいな? >>741
VBAはマルチスレッド非対応だから無理 >>741
VBAでマルチスレッドは基本的に出来ないと考えるべき。
物凄く不安定だし、Excelのオブジェクト(Rangeとか)を触った途端にExcelが消える。
で、マルチスレッドは出来ないけどマルチプロセスは出来る。
1.プログラムのブックに指定のURLのページの情報を取ってくるプロシージャを作る
2.複数のExcel.Applicationを使って、自分自身のブックを別のExcelから開くメインプロシージャを作り、その中でobjExcel.Runを使って情報を取ってくるプロシージャを動かすようにコードを書く。
3.ブックを保存する。
4.メインプロシージャを動かす
たぶん、こんな感じでできたはず。 ■ このスレッドは過去ログ倉庫に格納されています