X



Excel VBA 質問スレ Part50 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 7e6d-ffY6)
垢版 |
2017/08/27(日) 12:40:17.57ID:LjjEWylk0
!extend:checked:vvvvv:1000:512

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

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

※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/

※前スレ
Excel VBA 質問スレ Part49©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1498410914/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0002デフォルトの名無しさん (ワッチョイ a511-P7rv)
垢版 |
2017/08/27(日) 13:54:51.09ID:jYGHj9310
いちおつしないとおちちゃうよ
0004デフォルトの名無しさん (アウアウウー Sa91-xxBf)
垢版 |
2017/08/27(日) 16:42:30.51ID:TgR8VSWoa
初心者です。お時間がありましたら、アドバイス願います。
「自分のペースでゆったり学ぶ EXCEL VBA」という本を使って
勉強しています。シートを任意の場所にコピーするという項目で、
エラーが出てしまいます。

Sub 納品書シート作成()
 ThisWorkbook.Worksheets("納品書").Copy _
After := ThisWorkbook.Worksheets(3)
End Sub

これを実行すると、「修正候補:式」と出て、「After :=」の部分が赤色になります。
何が問題なのでしょうか。よろしければ教えてください。

EXCEL2010を使用しております。
0005デフォルトの名無しさん (ワッチョイ 4a06-oKtA)
垢版 |
2017/08/27(日) 17:08:53.71ID:WmqrsSrM0
>>4
こっちも2010
そのプロシージャまんまコピーして(勿論「納品書」シートも作って)実行したけど正常終了
念のためワークシート数を2枚にして実行すればエラーになるけどそれはインデックスが有効な範囲にないというエラーで
そちらのエラーにはならない。

一応確認しておくけど、VBEditorの画面で上のデバッグ(D)からコンパイルをしてエラーは無い?
0006デフォルトの名無しさん (ワッチョイ fe6d-VVOB)
垢版 |
2017/08/27(日) 17:09:02.52ID:LjjEWylk0
>>4
時間がないやつは最初からアドバイスなんて出来ない。読むのめんどくさいだけだからそういう社交辞令は書かないほうが良い

で、2010だけどエラーが出なかった。式はおかしくないはず
Worksheets(3) は、3つめのシートを表す。シートが3つ以下だとエラーが立つが、その場合は「インデックス~」のエラーになる
もし可能ならブックごとアップロードしてほしい
0008デフォルトの名無しさん (アウアウウー Sa91-xxBf)
垢版 |
2017/08/27(日) 18:33:58.27ID:TgR8VSWoa
>5,6,7
ありがとうございます。
デバックというのを試してみましたが、同じような結果になります。

ファイルをアップロードしてみました。Dkeyは1111です。
http://www.dotup.org/uploda/www.dotup.org1351357.xlsx.html
0013デフォルトの名無しさん (ワッチョイ 4a06-oKtA)
垢版 |
2017/08/27(日) 22:32:38.03ID:WmqrsSrM0
>>8
まず最初にエクスプローラーのツール→フォルダーオプションの
表示タブで”登録されている拡張子は表示しない”のチェック外せ。
んで、拡張子xlsxとxlsmの違いについてVBAのその入門書の最初から読んで
勉強し直せ
0014デフォルトの名無しさん (ワッチョイ 392c-0bAf)
垢版 |
2017/08/27(日) 23:11:29.74ID:y/dGwO3j0
vbaってpcのスペック関係あるん?
オフィス2010の32ビットでメモリー4gで全てのシートの枠線を一括して色変えろってのをやってるけど
すぐ動作しなくなるんだよね、俺のマクロが可笑しく書いてるだけかな
0018デフォルトの名無しさん (ワッチョイ 293d-oKtA)
垢版 |
2017/08/28(月) 00:21:31.22ID:uF0tQjXI0
どのくらいの大きさのものか、どのくらいの処理から重いと言うのかにもよるけど、
>>14と変わらない環境で5000行50列を縦横別々の判定で罫線引いてセルの背景色を行毎に変えて重要項目に個別に色付けてって処理でも五秒もあれば完了するし、
実務に影響が出るほど遅いって事なら、たぶんUnionでセルをまとめずに一つ一つに処理が発生するような事してるのでは?

処理の順番や組み合わせ次第で装飾的な処理はかなり軽く出来るはず。
GPU並の応答速度をセルに要求するなら知らんけど。
0019デフォルトの名無しさん (ワッチョイ 86aa-oTLP)
垢版 |
2017/08/28(月) 06:09:18.70ID:4ejthJEF0
銀行にはデータセンターがあって、機械で文字識別に失敗したものが、処理される

3人の職員が、画像を見ながら、金額を打ち込んで、3人とも同じなら合格

殴り書きの人がいるから。
これは、郵便局でも同じ

スレ違いだけど
0022デフォルトの名無しさん (ワッチョイ 6f06-X0kF)
垢版 |
2017/09/01(金) 18:23:17.66ID:aTcGbRyI0
すみません、途中で投稿してしまいました。

点数 人数 名前
10 0
9 1 hoge
8 4 foo bar moge
7 5 piyo poo…
6 9 …


こういう感じのn行×3列の表があります。
人数は、1列目の点数を取った人の数です。

人数を上から足していって、初めて10を超えた行より上の行の背景色を変える、ということは、
「条件付き書式」で可能でしょうか?
0023デフォルトの名無しさん (ワッチョイ 333d-b8Mh)
垢版 |
2017/09/01(金) 18:36:17.67ID:phDteRqs0
>>22
ここVBAスレだからエクセルのスレで聞いた方がいいのでは。

VBAやってる人間って基本的にエクセルの機能知らなくて、
自分で実装した後にそういう機能がある事知って悶絶するのが普通だし。
0024デフォルトの名無しさん (ワッチョイ ff11-BPzU)
垢版 |
2017/09/01(金) 18:46:07.83ID:A4rxsWGh0
>>22
人数の累積が10以上かどうかを示す列を追加したら
こんな感じで出来るんでない?

=OR(AND($D4=0, $D5=1), $D5=0)

D列が累積10以上かどうかの列
0なら10未満、1なら10以上
上の例は5行目に設定した条件付き書式
0026デフォルトの名無しさん (ワッチョイ 43aa-k/3h)
垢版 |
2017/09/02(土) 10:28:20.75ID:m6EVfTkB0
Sub SetGUID()
'On Error GoTo Err_Check:
Dim ref As Reference
End Sub

でコンパイルエラーが出ました。Referenceをで意義してなとのことです。
Referenceをインポートしなければいけないのでしょうか?
0028デフォルトの名無しさん (ワッチョイ 43aa-k/3h)
垢版 |
2017/09/02(土) 11:56:02.84ID:m6EVfTkB0
ありがとうございます。
003022 (ワッチョイ cfd3-X0kF)
垢版 |
2017/09/02(土) 18:32:32.23ID:JEC7rQdw0
皆様ありがとうございます。
累積人数の作業列を用意するやり方でできました。
003128 (アウアウカー Sa07-darD)
垢版 |
2017/09/02(土) 21:49:19.26ID:BeXWDCQaa
>>29
何で列を追加する必要がある?
一番上のセルを絶対座標にして下のセルの行番号を相対にすれば各行迄の累積人数取れるじゃん。
0035デフォルトの名無しさん (ワッチョイ 53db-6h2J)
垢版 |
2017/09/06(水) 01:23:13.87ID:QcvNAHMq0
ExcelではなくPowerPointのVBAになるのですが、該当するスレがないので質問させてください。

PowerPointのpptxにmsoEmbeddedOLEObjectの形で埋め込まれているエクセルファイル(xls,xlsx両方あり)を、
マクロを使って連続的に(複数埋められている)取り出し、別ファイルに保存したいと考えています。
(大本のファイルの破損のため、埋め込みファイルから復元する必要がある)
zipに拡張子変更して解凍、とすれば取れるのは知っているのですが、ファイル名の対応が取れなくなるため、
マクロ上で番号を付けて保存するのが目的です。

大まかにこのような形になるはず、と、抜き出し直前までの処理を作ったのですが、実際の保存処理について、
いろいろ試したのですがうまくいきませんでした。
PowerPoint上でのVBAマクロはニッチすぎてググっても情報に出くわさず、ましてやデータの抜き出しのような
ものはさらに見当たらない状態で、詰んでしまいました。
どのようにすれば保存できるか、ご教授願えますでしょうか?

For Each oSld In ActivePresentation.Slides
  For Each oShp In oSld.Shapes
    Select Case oShp.Type
      Case msoEmbeddedOLEObject
        If (Left(oShp.OLEFormat.ProgID, 5) = "Excel") Then
        'ここに処理を入れるはず
End If
    End Select
  Next
Next
0036デフォルトの名無しさん (ワッチョイ ff11-BPzU)
垢版 |
2017/09/06(水) 01:53:39.78ID:x6m+UIsj0
>>35
SaveAsやSaveCopyAsで動かないってことなのかな?
PowerPoint/Excelのバージョンやうまく行かなかった方法とエラー内容書かないとわからないね
正攻法でダメなら新しいExcelブックを作ってコンテンツコピーして保存するとか
0037デフォルトの名無しさん (ワッチョイ 43e3-3QX8)
垢版 |
2017/09/06(水) 11:39:49.13ID:12U08c7K0
エクセルVBAの課題ですがコードがわかりません。教えてください
下記がコードになります。
参考書の該当構文はInStrRev関数を使う事になるのですが半角スペースを指定する方法がわかりません
Dim temp As String
Dim pos As Long
Dim vName As String
Dim i As Long

For i = 2 To 6
temp = Cells(i, 2).Value
'半角スペースの位置をInStrRev関数を使用して取得し、変数posに代入する

'「氏名」から「名」のみを取得して変数vNameに代入する


Debug.Print vName
Next

考えたコードは下記でシングルクォテーションの間にスペースを入れればスペースを検索できるかと思ったのですが
エラーになりました。
pos = InStrReV(VPath," ")
ちなみに、B列に氏名、C列にフリガナが入力されています。
003828 (アウアウカー Sa07-darD)
垢版 |
2017/09/06(水) 14:58:34.88ID:8y9+dC+fa
>>35
取りあえず出来たけど今PC閉じたんで書き込めない。
PC開ける環境までもう少し待ってくれ。

>>37
良さそうなんだけど、1つ教えてくれ。
VPathって何だ?
コードの中に見あたら無いんだが。
tempとVPathの関係はどうなってる?

と書けばミスに気付くんじゃないかな。
004028 (アウアウカー Sa07-darD)
垢版 |
2017/09/06(水) 18:33:42.98ID:8y9+dC+fa
>>35
PC開ける場所が無いから駅のホームで開けたったわ。

さて、PowerPointでやってみようとしたらマクロの記録って無いんだな。
どうせ、オブジェクトの埋め込みって他でも似たようなもんだろと思ってWordで埋め込みを記録してみた。
で、出来たコード見てPowerPointでも同じようにいけそうと見当を付けてからWord上で今度は埋め込まれたExcelオブジェクトを右クリックメニューから開くのを記録しようと思ったらメニュー表示されなくて記録出来なかった。
で、記録は出来なかったけどWordでも同じようにいけそうと分かったのでWordで埋め込みオブジェクトについてググったら下記が見つかった。

https://support.microsoft.com/ja-jp/help/408493

これを参考に下記の真ん中の文でいける思って実行してみたらブックは出来てたけど開くとシートが表示されない。
表示リボンの再表示ボタン押したら表示されたんで、保存前に表示しとけば良いのかと思って再表示処理のコードをPowerPointにあわせて修正したのが最初の文。
それからシートが表示されてないブックをVBEのプロジェクトエクスプローラで見ると他のブックも表示されてる。
PowerPointに張り付けたExcelオブジェクトは複数で、それらが開いたまま保存すると参照も保存されるようなので保存後に閉じる最後の文の処理を追加して他への影響を回避した。
(開いて保存を繰り返すと後の保存では前に開いて保存後に開いたままになってるのが影響する)

'hogeの後、連番のファイル名で保存
oShp.OLEFormat.Object.Windows(1).Visible = True
oShp.OLEFormat.Object.SaveAs "C:\Users\hoge\Desktop\hoge" & CStr(i) & ".xlsx"
oShp.OLEFormat.Object.Windows(1).Close
i = i + 1
004137 (ワッチョイ dbe3-otRg)
垢版 |
2017/09/07(木) 09:48:18.13ID:YyZpQ4AD0
38できました。ありがとうございます。
サンプルコードコピペで何となく打ってたので変数が違ってました。
それ以外の変数は課題の変数名なので、なぜといわれても。
VBAもなかなか難しい
0042デフォルトの名無しさん (ササクッテロラ Sp3b-r1nS)
垢版 |
2017/09/07(木) 16:44:12.32ID:wb4fzXuzp
どなたかご存知でしたらご教示ください
ADODBのレコードセットから特定のフィールドを削除するにはどうしたら良いのでしょうか

Set rs = cn.Execute(select * from foo)

rs.Close

rs.Fields.Delete(n)

rs.Open

レコードセットが開いていると Delete メソッドがエラーになるので、いったん Close してから Delete するのですが、再度 Open したときに削除したはずのフィールドが復活してしまいます
0043デフォルトの名無しさん (ササクッテロ Sp3b-xWDE)
垢版 |
2017/09/07(木) 20:34:42.24ID:ddaTRsKCp
起動済みのインターネットエクスプローラを操作する上手い方法ありますか?
0049デフォルトの名無しさん (ササクッテロラ Sp3b-r1nS)
垢版 |
2017/09/07(木) 23:53:31.42ID:wb4fzXuzp
>>45
Save メソッドですか?

Recordset をファイルまたは Stream オブジェクトに保存します。

とMSDNに書いてあるから、やりたいこととは少し違う気がします
とはいえ、削除をコミットしたいという感覚は間違いありません

>>46
>>42のSQLはあくまでサンプルですが、SQL文そのものはインプットなので、編集はできない状態だと考えていただきたいです
その上で結果のレコードセットを編集して出力することを考えています
0053デフォルトの名無しさん (ササクッテロレ Sp3b-r1nS)
垢版 |
2017/09/08(金) 11:23:59.37ID:E+LN5uAqp
>>52
レコードセットから列を削除したいのです
やりたいことはこんな感じです

'1.クエリの実行
Set rs = cn.Execute("select A,B,C from foo")

'2.レコードセットから列Bを削除する
rs.Fields.Delete("B")

'3.残った列A,CをA1セル起点に貼り付ける
Range("A1").CopyFromRecordset rs


このとき、Fields.Delete メソッドはレコードセットが開いているとエラーになってしまいます
なので、>>42のように前後にClose、Openで挟んだのですが、Open実行時に削除したはずの列が復活してしまいます
005528 (アウアウカー Sa43-G+Vk)
垢版 |
2017/09/08(金) 12:57:54.99ID:pmDC3Jkna
>>54
>>49でSQLは編集出来ないということらしい。

なんか、物凄く特殊なことしてるね。
レコード数から2次元配列作って1件ずつ入れてくといった泥臭い方法ぐらいしか無いんかね。
0061デフォルトの名無しさん (ドコグロ MMba-Qch9)
垢版 |
2017/09/08(金) 21:20:35.90ID:hXO+Cn8GM
>>55
> SQLは編集出来ないということらしい。
ああ、なるほど見落としてたわ
なら俺も泥臭い方法かSQLをパースして特定の列を抜いたSQLを組み立てるとかのトリッキーな方法しか思い付かんわ
006242 (ササクッテロレ Sp3b-r1nS)
垢版 |
2017/09/08(金) 23:59:54.71ID:E+LN5uAqp
みなさんレスありがとうございます

>>55
やっぱりそうするしかないのでしょうかね
いったん配列に落とすとセルに貼り付けた時データ型やレコード数なども気にしなきゃならなくなるので、できればレコードセットのままなんとかしたいのですが…

>>57
そうなんだろうけど、CopyFromRecordsetだと全フィールド張り付いてしまいます
ループで1セルずつ貼り付けて行くと、>>55の言うような「泥臭い方法」と変わらなくなってしまいます

>>58
なるほど、レコードセットでどうにかできなければそれが一番いい方法かもしれません

>>60
それも考えましたが、rs2に複製の際にエラーが出てしまいました
今は手元に環境がないので、エラーの内容についてはまたの機会にします

>>61
SQLは select * になるかもしれないし、予想がつきません
0065デフォルトの名無しさん (ワッチョイ 0b11-r1nS)
垢版 |
2017/09/09(土) 02:28:27.21ID:oVzpXcHU0
>>64
正規表現を使うといいかもです

スマホで手打ちしてるんで細かい部分で間違いがあるかもしれませんが、イメージはこんな感じです
(特にスラッシュのエスケープとか)

Dim strOrg as Sting
Dim strNew as Sting

strOrg = ※文章を代入

With CreateObject("VBScript.RegExp")
.Pattern = "http:////.*$";
.IgnoreCase = True
.Global = True
strNew = .Relpace(strOrg, "")
End With
0066デフォルトの名無しさん (ワッチョイ dbaa-nhGI)
垢版 |
2017/09/09(土) 09:08:52.36ID:ioyoiZXd0
コンパイルエラー:subまたはfunctionが定義されていませんと出ます。
Callされる関数の引数に問題があるのかと思うのですが、原因が分かりません。

Call ShowInIE(ie, "http://www.vba-ie.net/";, , 0, 0, 700, 200)

Sub ShowInIE(ie As InternetExplorer,
url As String,
Optional viewFlg = True,
top As Integer,
left As Integer,
width As Integer,
height As Integer)
を設定して渡すで良いのでしょうか?

ttps://pastebin.com/aJLAUnfc
0068デフォルトの名無しさん (ワッチョイ b7e4-NEns)
垢版 |
2017/09/09(土) 10:42:29.03ID:0n3DLxd60
マクロにパスワードかけてたのだが、どうも破られてるらしき兆候があって
ぐぐった結果見つけたこのページの「マクロのパスワードを解除するマクロ」
を試したらほんまに解除できてびっくり
http://neos21.hatenablog.com/entry/2016/09/30/081709

これで破られない対策って誰かご存じないですかね?
自分で根ほり葉ほり動作調べてたら一日かかりそう
0072デフォルトの名無しさん (ワッチョイ dbaa-nhGI)
垢版 |
2017/09/09(土) 13:21:02.45ID:ioyoiZXd0
>>71
ありがとうございます。出来ました。
0074デフォルトの名無しさん (ワッチョイ b7e4-NEns)
垢版 |
2017/09/09(土) 13:49:29.47ID:0n3DLxd60
「ない」ってあんたそんなズバリと(^ ^;

APIのエキスパートなら自分でどうとでもするだろうけど
人に聞いて知ってるような方法はないってことですね
しょーがないか
0075デフォルトの名無しさん (ササクッテロル Sp3b-6vZA)
垢版 |
2017/09/09(土) 14:33:51.65ID:OsDiJ+6Ap
>>68
パスワードの文字数を多くするとか
記号を使うとか文字の種類を多くする
0076デフォルトの名無しさん (ワッチョイ b7e4-NEns)
垢版 |
2017/09/09(土) 14:42:58.59ID:0n3DLxd60
そういう問題じゃないんで・・
パスワードを解析するんじゃなく、記録してるとこからそれ自体引っ張り出して
解除させちゃうマクロらしいから、パスワードの複雑さ関係がないんで
0077デフォルトの名無しさん (ワッチョイ ff1e-uK4n)
垢版 |
2017/09/09(土) 15:11:07.11ID:5iFRXle+0
まず使い方が間違ってる

Excelのパスワードの目的は秘密を守るためじゃなくて、
素人がマクロやシートをうっかり改変して業務に支障を来すのを防ぐのが目的と言われてる

簡単に破れる方法であっても、意図的な操作がなければ破られることはないんで、目的は達成できている
0082デフォルトの名無しさん (ワッチョイ 173d-QyhX)
垢版 |
2017/09/09(土) 17:28:22.68ID:uXhmIN/20
MSの公式見解だとパスワードはワークグループを分けて誤操作を防ぐ為のものであって、セキュリティ性は無いとされているね。

一応、VBAはバイナリファイルを読み書き出来るから、自分で暗号化技術調べてAES的な暗号化ファイルとか生成出来るぞ。
でも苦労して実装しても運用する奴らが素人だと暗号化した意味が無くなるから作り損だぞ。
0084デフォルトの名無しさん (ワッチョイ 5ab3-R8ON)
垢版 |
2017/09/10(日) 05:17:37.27ID:MQQa++S20
>>83
しかし、LibreOfficeのCalcからならあっさり見えてしまうんだな。
見えるからコピペし放題
0094デフォルトの名無しさん (ワッチョイ b66d-AjbO)
垢版 |
2017/09/10(日) 09:51:20.19ID:emM90UQN0
>>91
vbaには無い。
こういうのは一般事務の女の子向けに男がヘラヘラ書いたもの、ってかvbaが安易に書き換えられる仕様は常識

会社の基幹システムはもちろん無理だけどね
変更許可は絶対に降りない。然るべき手続きが必要
0095デフォルトの名無しさん (ワッチョイ ff1e-uK4n)
垢版 |
2017/09/10(日) 10:26:56.59ID:7PCuqjJO0
>>94
基幹に近い所でVBAが動いてるうちの会社みたいなところもあるんやで
一部上場でテレビCMもガンガン流してて誰でも知ってる大企業

入力ミスをなくすためにワークシートにロックかけて入力から印刷までフォームなしのVBAで組んである
モッサリでめっちゃ使いにくいシステムで見積書とか作らされてる
下っ端の俺にはどうしようもない
■ このスレッドは過去ログ倉庫に格納されています

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