VBAを始めたのですが、例文をコピペして記述した下記のコードがエラー(構文エラー)になります。
構文エラーは4行目のCall文以降すべてで起きているようです。
どこがおかしいのでしょうか、詳しい方ご教示願います。

以下コード

Sub LeCroyDSOTest()
Dim dso As Object
Set dso = CreateObject("LeCroy.ActiveDSOCtrl.1") 'ActiveDSO のインスタンスを生成
Call dso.AboutBox ‘About box コントロールの表示
Call dso.MakeConnection("IP:172.24.160.216") ‘ オシロスコープへ接続
Call dso.WriteString("C1:VDIV 2", 1) ‘ C1 を2 Volts/Div に設定
Call dso.WriteString("TRMD AUTO", 1) ‘トリガをAUTO に設定
End Sub

A 回答 (1件)

「‘」を「'」に直してもダメですか?


具体的には以下のようになります。
--------------------------------------------------------------------------
Sub LeCroyDSOTest()
Dim dso As Object
Set dso = CreateObject("LeCroy.ActiveDSOCtrl.1") 'ActiveDSO のインスタンスを生成
Call dso.AboutBox 'About box コントロールの表示
Call dso.MakeConnection("IP:172.24.160.216") 'オシロスコープへ接続
Call dso.WriteString("C1:VDIV 2", 1) 'C1 を2 Volts/Div に設定
Call dso.WriteString("TRMD AUTO", 1) 'トリガをAUTO に設定
End Sub
--------------------------------------------------------------------------
「VBAの構文エラー」の回答画像1
    • good
    • 1
この回答へのお礼

GooUserラック様

早速のご回答ありがとうございます。
仰るとおりでした。
全く気づきませんでした。
(例文をコピペしたものなので、まさかそこが・・・。)

お礼日時:2017/05/19 15:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q【VBA】 for next 繰り返し処理の入れ子の処理速度について

こんにちわ
マクロを作成しております。
入れ子した繰り返し処理に躓いております、
もしよろしければ高速化のアドバイスをいただければと思います。


B2から下方向に値をいれております。
C1から横方向に同じ値をいれております。
B1-C1,B1-D1,B1-E1・・・最終まで
、というようにリーグ戦の総当たり結果表のような
結果を出力しようとしています。
値は数値で差分を整数で出すだけで、
重複した結果は不要ですので階段状に出力させています。

B列70行程で処理に40秒程かかってしまう状態です。
何か余計な処理や修正したほうがよさそうな箇所ははありますでしょうか?

excel2013
win8 メモリ4G

_______________
Sub test3()

Dim sh As Worksheet
Dim m As Long, i As Long, j As Long

Application.ScreenUpdating = False '非表示

Set sh = Worksheets("test")

m = sh.Cells(Rows.Count, "B").End(xlUp).Row

For i = 1 To m - 1
For j = i To m - 1

sh.Cells(j + 1, i + 2) = _
Application.WorksheetFunction.RoundDown( _
Abs(sh.Cells(1, 2).Offset(i, 0).Value - sh.Cells(1, 2).Offset(0, j).Value), 0)
      ’小数点切り捨てなど入れてます。
      ’単純にi+jにしても処理時間は変わりませんでした。
Next j
Next i


End Sub
_______________

以上です、よろしくお願いします。

こんにちわ
マクロを作成しております。
入れ子した繰り返し処理に躓いております、
もしよろしければ高速化のアドバイスをいただければと思います。


B2から下方向に値をいれております。
C1から横方向に同じ値をいれております。
B1-C1,B1-D1,B1-E1・・・最終まで
、というようにリーグ戦の総当たり結果表のような
結果を出力しようとしています。
値は数値で差分を整数で出すだけで、
重複した結果は不要ですので階段状に出力させています。

B列70行程で処理に40秒程かかってしまう状態です。
...続きを読む

Aベストアンサー

コードをそのままで、B列200行程度実行しても一瞬で終わります。

コードの問題では無いですね。
PC環境かエクセルの問題だと思います。

そもそも、そのエクセルに直接文字入力した場合、入力の度に待たされる事は有りませんか?

Qvbsでは漢字の変数は使えないのでしょうか。

下記はエラーになります。
Option Explicit
Dim 氏名

氏名=InputBox("氏名を入力して下さい")
MsgBox(氏名)

ここで、氏名をnameに変更すると正しく実行します。
Option Explicit
Dim name

name=InputBox("氏名を入力して下さい")
MsgBox(name)

漢字の変数を使う方法は無いのでしょうか。

Aベストアンサー

もうお答えは出ているようですが、私からも回答します。

2byte 文字を変数にすると、

\kanjitest.vbs(2, 5)
「Microsoft VBScript コンパイル エラー: 文字が正しくありません。」

のエラーが出ます。
Unicode VBSにしても、やはりエラーが出ます。

もともと、String 型で認められる所以外では、2byte 文字は、ハングしますから、仕方がありません。VBAとは違いますから。
これを、HTA にして、Charset を、UTF-8 にしても、エラーは出ます。諦めることでしょうね。

QVBA コンパイルエラーの解消法

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示のため実行ができません。
ご指摘、よろしくお願いいたします。

Sub kopipe1() '施工体制台帳
Dim sh As Worksheet
Dim sh1 As Worksheet
Dim sb As Long
Dim m As Long
Dim p As Long
Dim c As Long
Dim i As Long
Dim end1 As Long

Set sh = Worksheet("sheet1")
Set sh1 = Worksheet("施工体制台帳 (下請け) ")


end1 = sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
sb = 1
p = 1

For i = 2 To end1 Step 1
sb = sb + 1
c = cell(p, 9)

sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
sh.cell(sb, 3).Copy Destination:=.sh1.Range(c).Offset(2, 27) '代表者名
sh.cell(sb, 4).Copy Destination:=.sh1.Range(c).Offset(4, 1) '郵便番号
sh.cell(sb, 5).Copy Destination:=.sh1.Range(c).Offset(5, 1) '住所
sh.cell(sb, 6).Copy Destination:=.sh1.Range(c).Offset(6, 24) '電話番号
sh.cell(sb, 7).Copy Destination:=.sh1.Range(c).Offset(13) '業種1
sh.cell(sb, 8).Copy Destination:=.sh1.Range(c).Offset(14, 12) '許可者1
sh.cell(sb, 9).Copy Destination:=.sh1.Range(c).Offset(14, 15) '区分1
sh.cell(sb, 10).Copy Destination:=.sh1.Range(c).Offset(14, 17) '許可1-1
sh.cell(sb, 11).Copy Destination:=.sh1.Range(c).Offset(14, 20) '許可1-2
sh.cell(sb, 12).Copy Destination:=.sh1.Range(c).Offset(14, 27) '許可年月日
sh.cell(sb, 13).Copy Destination:=.sh1.Range(c).Offset(16) '業種2
sh.cell(sb, 14).Copy Destination:=.sh1.Range(c).Offset(17, 12) '許可者2
sh.cell(sb, 15).Copy Destination:=.sh1.Range(c).Offset(17, 15) '区分2
sh.cell(sb, 16).Copy Destination:=.sh1.Range(c).Offset(17, 17) '許可2-1
sh.cell(sb, 17).Copy Destination:=.sh1.Range(c).Offset(17, 20) '許可2-2
sh.cell(sb, 18).Copy Destination:=.sh1.Range(c).Offset(17, 27) '許可年月日2
sh.cell(sb, 19).Copy Destination:=.sh1.Range(c).Offset(21, 28) '健康保険
sh.cell(sb, 20).Copy Destination:=.sh1.Range(c).Offset(22, 28) '厚生年金保険
sh.cell(sb, 21).Copy Destination:=.sh1.Range(c).Offset(23, 28) '雇用保険
sh.cell(sb, 22).Copy Destination:=.sh1.Range(c).Offset(25, 3) '現場代理人指名
sh.cell(sb, 23).Copy Destination:=.sh1.Range(c).Offset(29, 7) '主任技術者氏名
sh.cell(sb, 24).Copy Destination:=.sh1.Range(c).Offset(31, 3) '資格内容
sh.cell(sb, 25).Copy Destination:=.sh1.Range(c).Offset(33, 3) '安全衛生責任者
sh.cell(sb, 26).Copy Destination:=.sh1.Range(c).Offset(25, 26) '安全衛生推進者
sh.cell(sb, 27).Copy Destination:=.sh1.Range(c).Offset(27, 26) '雇用管理責任者
sh.cell(sb, 28).Copy Destination:=.sh1.Range(c).Offset(29, 26) '専門技術者名
sh.cell(sb, 29).Copy Destination:=.sh1.Range(c).Offset(31, 26) '技術資格内容

p = p + 62
Exit For
Next i
End Sub

皆様、いつもお世話になっております。
初心者なりに考えてVBAを組んでみたのですが、「Sub または Fanction が定義されていません」とエラー表示が出てきます。
自分なりにコードに間違いがないか検索ながらやってみたのですが、うまくいきません。

どなたか、知恵をお貸しいただけないでしょうか。



テーブルの入っているSheet1から、シート”施工体制台帳~”の該当するセルにデータのコピーを行うためのVBAです。
業者の数だけループするように組んだつもりなのですが、エラー表示...続きを読む

Aベストアンサー

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).Copy Destination:=.sh1.Range(c).Offset(2, 1) '会社名
とりあえず、Cells と sh1 のコンマは取るけれども、
sh1.Range(c).Offset(2, 1) これでは可読性を落とすばかりで分かりません。

これ自体を直すよりは、最初から作り直したほうが早そうです。
たぶん、一覧で横に並んでいるものを、別のシートの各場所に振り替えていくわけで、それが、ページごとになっているというわけでしょう。

まず、 sh1.cells(sb, 2).Copy ですが、
その列の2 を変数にすべきですね。

受ける側が、Offset で書かれてしまうと、手がつけられなくなってしまいます。

sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")

このようにまとめてしまい、以下のように纏めたものから呼び出すようにします。
しかし、実際にやってみると不具合が生じるので、それを配列で渡すようにします。

注:以下は、私の想像で書かれたものであって、実際に合っているのかは分かりません。
このようなスタイルにしてみたらという、あくでもこちらの提案です。

'//
Sub Test1()
 Dim Rng As Range
 Dim i As Long, j As Long, sb As Long
 Dim c As Variant
 Dim sh As Worksheet, sh1 As Worksheet
 Set sh = Worksheets("sheet1")
 Set sh1 = Worksheets("施工体制台帳 (下請け)")

 
 Set Rng = sh1.Range("J3,AJ3,J5,J6,AG7,I14,U15,X15,Z15,AC15,AJ15,I17," & _
 "U18,X18,Z18,AC18,AJ18,AK22,AK23,AK24,L26,P30,L32,L34," & _
 "AI26,AI28,AI30,AI32")
 
 end1 = sh.Cells(Rows.Count, 2).End(xlUp).row
 
 i = 2
 sb = 2
 For j = 1 To end1
 a = (j - 1) * 62 + 1
  For Each c In Rng.Offset((j - 1) * 62 + 1)
   c.Value = sh.Cells(sb, i).Value
   DoEvents
   i = i + 1
  Next
  i = 2
  sb = sb + 1
 Next
End Sub

今のところ、変数に代入する以外のコードはほとんど間違っているわけですから、どれがどうと言えないと思います。
他の方との重複を含みます。
・Worksheet(---) ->Worksheets(----)
・sh.Range(".Cells(Rows.Count, 2)").End(xlUp)
  ↓
sh.Cells(Rows.Count, 2).End(xlUp).Row
・c = cell(p, 9)
  ↓
 c = Cells(p, 9) ただし、最後に、p = p + 62の後、Exit For では、1回キリでおしまいになってしまいます。

おそらくは、Dim c As String --Cells(p, 9).Address(0,0)
のはずです。
 
・sh.cell(sb, 2).C...続きを読む

QVBAを使ってIEのあるWEBサイトに自動ログインし、フォームに入力する処理を考えています。しかし、

VBAを使ってIEのあるWEBサイトに自動ログインし、フォームに入力する処理を考えています。しかし、その処理の中で下記の「発注入力フォーム」ボタンをクリックする処理方法がわかりません。
どなたかアドバイスをお願いします。

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>メインメニュー :: WEB発注メールフォーム</title>
<link href="css/menu.css" rel="stylesheet" type="text/css" />
</head>

<body>

<div id="wrapper">

<div id="user_name">
<p>
ようこそ
</p>
</div>

<div id="menu_area">
<div id="gnavi">
<ol>
<li id="gnavi1"><a href="./tutorial/index.html">チュートリアル</a></li>
<li id="gnavi2"><a href="./?mode=order">発注入力フォーム</a></li>
<!-- <li id="gnavi3"><a href="#">修正依頼フォーム</a></li> -->
<li id="gnavi4"><a href="./tutorial/about.html">発注・使用に関して</a></li>
<li id="gnavi5"><a href="./?mode=contact">総合お問合せ</a></li>
<li id="logout"><a href="./?mode=logout">ログアウト</a></li>
</ol>
<p style="font-weight:bold;color:white;font-size:13px;">
似顔絵・写真撮影・交通案内図のサービスを<br />
ご要望の際は、一度お問い合せ下さい。
</p>
</div>
</div>
</div>

</body>
</html>

VBAを使ってIEのあるWEBサイトに自動ログインし、フォームに入力する処理を考えています。しかし、その処理の中で下記の「発注入力フォーム」ボタンをクリックする処理方法がわかりません。
どなたかアドバイスをお願いします。

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;...続きを読む

Aベストアンサー

すごい勘違いがあるような
下は、fc2 ブログの新投稿のロジック
クリックっても
If sel.value = "ログイン" Then
sel.Click
End If
だけなんだけど・・・

Set netobjIE = CreateObject("internetExplorer.application")
url = "http://admin.blog.fc2.com/ *****/new"

With netobjIE
.navigate url
.Visible = True
Do While .Busy = True
DoEvents
  Call Sleep(200)
If .Busy = False Then
Exit Do
End If
Loop
Do While .document.readyState <> "complete"
DoEvents
   Call Sleep(200)
If .document.readyState = "complete" Then
Exit Do
End If
Loop
’ お約束の待ち処理
Dim in_str As String
Dim doc As HTMLDocument
Set doc = netobjIE.document
Dim sel As IHTMLInputElement

in_str = "ログイン FC2 - 無料ホームページ"
'Debug.Print InStr(IE.document.Title, in_str)
If InStr(netobjIE.document.Title, in_str) > 0 Then

Set sel = doc.getElementsByName("id")(0)
sel.value = "*****@qg8.so-net.ne.jp"

Set sel = doc.getElementsByName("pass")(0)
sel.value = "*******"

Set sel = doc.getElementsByName("image")(0)

If sel.value = "ログイン" Then
sel.Click
End If
’これは・・ログイン しかないからだけど

すごい勘違いがあるような
下は、fc2 ブログの新投稿のロジック
クリックっても
If sel.value = "ログイン" Then
sel.Click
End If
だけなんだけど・・・

Set netobjIE = CreateObject("internetExplorer.application")
url = "http://admin.blog.fc2.com/ *****/new"

With netobjIE
.navigate url
.Visible = True
Do While .Busy = True
DoEvents
  Call Sleep(200)
If .Busy = False Then
Exit Do
End If
Loop
Do While .document....続きを読む

Qボタン一個で表示非表示切り替えマクロについて教えてください。 長文失礼します。マクロ初心者です。 ま

ボタン一個で表示非表示切り替えマクロについて教えてください。
長文失礼します。マクロ初心者です。
まず画面は以下の通りです。

ー A B C ・・
1 取引名 区分 費目
2 ◯システム 前期 円
3 空白 後期 円
4 空白 実績
ーーーーーーーーーーーーーーーーーーーーー
5 ▲システム 前期
6 空白 後期
7 空白 実績
ーーーーーーーーーーーーーーーーーーーーー

・ (★3行ずつ×10〜15コ分続く)
・ (★取引名がないとこは3行とも空白)
ーーーーーーーーーーーーーーーーーーー
20 小計 前期計
21 後期計
22 合計
23 実績計 (★小計欄は4行)
ーーーーーーーーーーーーーーーーーーーーーー
ここまでで1項目、(運用、保守などで区切っています)
次は保守の、同じのが。という風に1000行以上続きます。

別のファイルの取引no.と一致したら費目金額を反映させるマクロを取り込みボタンに設定中なので、
このフォーマットは変えられません。

そして、今回作成しなければならないのが、
表示非表示切り替えボタンです。
3行の一番上に取引名が入り、下2行は空白です。
一番上に取引名が入ってなかったら、以下の3行まとめて非表示/表示を切り替えたいんです。
現状、基本は1項目につき3行ずつ×10ですが
取引名が多数あるものはその分増やしているので統一はしていません。

また、各項目1つでも取引名があれば小計欄は非表示しない。
0だったら小計欄も非表示にする。
というルールです。


先方のお願いは
ボタン一個で、表示をクリックしたら表示され、ボタンの名前は非表示に変わり、非表示をクリックしたら非表示になり、名前は表示に、ということなのですが、


全然できてないのですが、
私が今考えていたコードは

If 切り替え.Caption = ”表示” Then
For i = 2 To LastRow Step 3
★まずここで、3行ずつ回すも、小計欄は4行なのでどうしたらいいのか
続き

If Cells(i,1) <> ”” And _
Cells(i,1) <> ”小計” Then
icnt = icnt + 1
EndIf
値があったらカウントし
後に、icnt>=1 Then
小計欄は残す、という流れをイメージしたのですが…


If Cells(i,1)= ”” Then
Rows(i).Hidden

If Cells(i,1) = ”小計” Then
If icnt>=1 Then
という流れにする場合、
もし残すなら、
次の項目からまたスタートとなるにはどうすればいいのか…
非表示の場合まとめて4行はアクティブセル+3という式にしたらいいのか、、
すみませんがもしよろしければコードをご教示ください。

ボタン一個で表示非表示切り替えマクロについて教えてください。
長文失礼します。マクロ初心者です。
まず画面は以下の通りです。

ー A B C ・・
1 取引名 区分 費目
2 ◯システム 前期 円
3 空白 後期 円
4 空白 実績
ーーーーーーーーーーーーーーーーーーーーー
5 ▲システム 前期
6 空白 ...続きを読む

Aベストアンサー

こんにちは

ご質問文で一番わからないのが、項目と次の項目の間は隙間なく連続しているのか、空白行や再度タイトルが記されていたりしないのかといったことでしょうか。
空白行がある場合は、きちんと行数が決まっているのか、気まぐれに1行だったり2行だったりするのかということ。


はっきりしないので、コードは示せませんが、少しは考え方のヒントにでもなれば・・・

方法はいろいろあると思いますが、ひとまとまりで考える行数が一定ではないので、ご提示のようにFORループで一律にStep 3としたのではうまくいかないと思います。

一例として、調べる対象の行(先頭行)を変数rwとして、順に見ていくものと考えた場合

 rw = 2 '←対象行の初期値
 Do While rw <= LastRow
  If Cells(rw, 1).Value = "小計" Then
   '小計の場合の処理
   ' ~~~
   rw = rw + 4 '←次の行(4でよいのか不明ですが)
  Else
   '3行セットの場合の処理
   ' ~~~
   rw = rw + 3 '←次の行
  End If
 Loop

のような考え方にすれば、対象の行数が異なる場合でも、条件分けして処理をすることで、次に参照する行までの行数を変えることが可能です。
上の例では、小計欄の4行の1行目には必ず「小計」と記されていて、それで識別しても良いとの保証があるものと仮定しています。(取引名には「小計」というものは絶対に存在しないなど)

こんにちは

ご質問文で一番わからないのが、項目と次の項目の間は隙間なく連続しているのか、空白行や再度タイトルが記されていたりしないのかといったことでしょうか。
空白行がある場合は、きちんと行数が決まっているのか、気まぐれに1行だったり2行だったりするのかということ。


はっきりしないので、コードは示せませんが、少しは考え方のヒントにでもなれば・・・

方法はいろいろあると思いますが、ひとまとまりで考える行数が一定ではないので、ご提示のようにFORループで一律にStep 3としたのではうま...続きを読む

Qテキストファイルの途中行から読み込む方法について

こんにちは
テキストファイルの1から2行目をのぞき、3行目からPCへよむといったことは
かのうなのでしょうか?全部よむことはできたのですが、特定の行を指定してなど
読み込む方法がありましたらおしえてください。
宜しくおねがいいたします。

Aベストアンサー

テキストの最後が改行で終わっている場合uboundを-1しますが
そうでない場合は-1しなくてもいいですね

set fs = CreateObject("Scripting.FileSystemObject")
set f1=fs.OpenTextFile("x.txt")
allLine=f1.readALL
lines=split(allLine,vbcrlf)
j=""
for i=3 to ubound(lines)
j=j&vbcrlf&i
next
msgbox j


j=j&vbcrlf&i→j=j&i
とすれば当然改行は入りません

QVBAで抽出とコピペのループがうまくいかない?

Excel2010のVBAに詳しい方、至急です。
前回も同様の質問をして、回答していただいた方のアドバイスをもとに自分でも改善?してみたつもりなのですが無理だったので再度質問させていただきます。

ポケモン図鑑という表をタイプごとにリストを抽出して、
そのデータをA列に数値が入っている行から最後の行までをコピーして、
抽出した際の条件と同じ名前のシートに所定の場所に貼り付け、最後に貼り付け先のシートのとある箇所をコピーして、ポケモン図鑑というシートにデータをペーストするというマクロなんですが、実際に通しても数値が0となってしまいます。
メッセージボックスで入力した後、「終了しました」と出るのですが期待通りに抽出してコピー&ペーストができていないようで困っています。
だれかたすけていただけませんか。

※抽出する項目
lightening※1
fire※2
water
leaf
wind
dragon

※1抽出する際、テキストフィルターのユーザー設定で
「lightening」からはじまる「伝説・幻」を含まないという条件で抽出しなければならない。
※2抽出する際、テキストフィルターのユーザー設定で
「fire」からはじまる「伝説・幻」を含まないという条件で抽出しなければならない。

Sub Pokemon()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim hizuke As String, wnum As String
Dim rng As Range
Dim i As Long, imax As Long
Dim j As Variant, c As Long
Dim sname As String
Dim fsh As Variant
fsh = Array("lightening", "fire", "water", "leaf", "wind", "dragon")
hizuke = InputBox("ポケモンを捕まえた日付を入力して下さい")
If hizuke = "" Then Exit Sub
If IsDate(hizuke) = False Then
MsgBox "日付不正"
Exit Sub
End If
Set sh1 = Worksheets("ポケモン図鑑")
With sh1
Set rng = .Range(.Cells(4, 5), .Cells(4, .Cells(4, Columns.Count).End(xlToLeft).Column))
End With
j = Application.Match(CLng(CDate(hizuke)), rng, 0)
If IsError(j) Then
MsgBox "該当日付がありません"
Exit Sub
End If
wnum = InputBox("選択した日付が何週目になるかを入力して下さい")
If wnum = "" Then Exit Sub
If wnum < 1 Or wnum > 5 Then
MsgBox "週不正"
Exit Sub
End If
Application.ScreenUpdating = False
c = wnum * 2 + 3
For Each sh2 In Worksheets
For i = 0 To 5
If sh2.Name = fsh(i) Then
With sh2
If .Cells(5, c) <> "" Then
.Range(.Cells(5, c), .Cells(.Cells(Rows.Count, c).End(xlUp).Row, c)).ClearContents
End If
End With
Exit For
End If
Next i
Next sh2
With sh2
If .Cells(5, c) <> "" Then
.Range(.Cells(5, c), .Cells(.Cells(Rows.Count, c).End(xlUp).Row, c)).ClearContents
End If
End With
End If
Next sh2
With sh1
imax = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 6 To imax
If .Range("A" & i).Value <> "" Then
sname = .Range("D" & i).Value
Select Case sname
Case "lightening","fire","water", "leaf", "wind", "dragon"
Case Else
sname = ""
End If
End Select
If sname <> "" Then
Set sh2 = Worksheets(sname)
sh2.Cells(sh2.Cells(Rows.Count, c).End(xlUp).Row + 1, c).Value = .Cells(i, j + 4)
End If
End If
Next i
For i = 32 To 40
Set sh2 = Nothing
Select Case i
Case 1
Set sh2 = Worksheets("lightening")
Case 2
Set sh2 = Worksheets("fire")
Case 4
Set sh2 = Worksheets("water")
Case 6
Set sh2 = Worksheets("leaf")
Case 7
Set sh2 = Worksheets("wind")
Case 9
Set sh2 = Worksheets("dogagon")
End Select
If Not sh2 Is Nothing Then
.Cells(i, j + 4).Value = sh2.Cells(sh2.Cells(Rows.Count, c + 1).End(xlUp).Row, c + 1).Value
End If
Next i
End With
Application.ScreenUpdating = True
MsgBox "ポケモン抽出コピペ終わり!"
End Sub

Excel2010のVBAに詳しい方、至急です。
前回も同様の質問をして、回答していただいた方のアドバイスをもとに自分でも改善?してみたつもりなのですが無理だったので再度質問させていただきます。

ポケモン図鑑という表をタイプごとにリストを抽出して、
そのデータをA列に数値が入っている行から最後の行までをコピーして、
抽出した際の条件と同じ名前のシートに所定の場所に貼り付け、最後に貼り付け先のシートのとある箇所をコピーして、ポケモン図鑑というシートにデータをペーストするというマクロ...続きを読む

Aベストアンサー

プログラム自体の動きは全くチェックしていません。
色々おかしいところがありますが 自分でデバッグくらいできるように
ならないとダメだと思います。

42行目と 50行目の「End If」はどこに掛かっていますか?
51行目の Next sh2はどこに掛かっていますか?
最後の方の「dogagon」てつづりは合ってますか?
61行目の「End If」と 62行目の「End Select」の順番は合ってますか?
67行目の「End If」はどこと以下同文

初心者レベルでいいので VBAについての勉強を先にすべきだと思います。

QCBool関数について VB6とVB.netの違い

VB6のCBool関数で
#付きの論理文字列? #TRUE#,#FALSE#
を読み込ませるとそれぞれbool値のTrue,Falseに変換してくれます。

.NET(2013)に移行して、互換の関数であるCBoolをそのまま使うとエラーが発生して変換できませんでした。
CBool関数について検索したりして調べたのですが、これらの文字列に対する処理が書かれたものは見つかりませんでした。

#TRUE#,#FALSE#をbool値に変換するには、文字列でそのまま比較して変換してやるしかないのでしょうか?

なぜ、こんなことを質問しているかというと、Write関数(WriteLine関数)でbool値をファイルに出力すると#TRUE# または #FALSE# で出力されるので、それをそのまま読み込みたいのです。
もちろん、例えば数値の1,0に変換して出力しておくなどの方法もありますが、それだと過去のファイルとの互換性がなくなるため、VB6で出力したファイルが使用できなくなります。

VB.NETでもWrite関数(WriteLine関数)で出力すると#TRUE#または#FALSE#と出力されるのでそれをそのまま読み込みたいのですが、VB.NETでは読み込めないというのは片手落ちの気がするのですが。

VB6のCBool関数で
#付きの論理文字列? #TRUE#,#FALSE#
を読み込ませるとそれぞれbool値のTrue,Falseに変換してくれます。

.NET(2013)に移行して、互換の関数であるCBoolをそのまま使うとエラーが発生して変換できませんでした。
CBool関数について検索したりして調べたのですが、これらの文字列に対する処理が書かれたものは見つかりませんでした。

#TRUE#,#FALSE#をbool値に変換するには、文字列でそのまま比較して変換してやるしかないのでしょうか?

なぜ、こんなことを質問しているかというと、W...続きを読む

Aベストアンサー

VB6とVB.NETは似てるけど別物と考えた方がいいです。

#TRUE#を Trueとして読むなら、Input関数が使えます。
https://msdn.microsoft.com/ja-jp/library/tty8298b(v=vs.90).aspx
おそらく、 VB6互換のWriteで書いたものは、同じく互換のInputで読む、というのが想定している使い方なのでしょう。


私なら、#True#も変換できる自家版Cboolを用意します。
#true# と #false#を大文字小文字区別無しに判定させればいいだけなので。

Q[VBA] 変数を使いたいです。

すいません教えてください。
以下3つの変数があります。

ARG1 = "a"
ARG2 = "b"
ARG3 = "c"

これを

For i = 1 To 3
 MsgBox ARGi
Next

みたいに表示させたいんですけど
何かいい方法ありますか?

Aベストアンサー

こんにちは!

一例です。

Dim i As Long, myAry As Variant
myAry = Array("a", "b", "c")
For i = 0 To UBound(myAry)
MsgBox "ARG" & myAry(i)
Next i

こんな感じではどうでしょうか?m(_ _)m

QVisual Studio プロパティページの『文字セット』の意味?

私は普段 Gnu 等のコンパイラを使っている物です。Visual Studioが使用する文字コードについて理解できなくて困っています。
どうか愚かな私に一筋の光明をお与えください。

タイトルに示したようにプロパティページの『文字セット』の設定を「ユニコード」から「マルチバイト文字」に、あるいは「マルチバイト文字」を「ユニコード」に変えることは何を意味しているのでしょうか。
デフォルトのVisual studuioでは、今でもソースファイルは Shift-jis です。
私は、「『文字セット』をユニコードに設定することは、プリプロセッサの中で、ソースファイルが勝手にユニコード(多分utf-16)に変換されているのではないか。」と考えています。
私の考えは誤りなのでしょうか?

Aベストアンサー

>char
>hoge [] = ”hogehoge....”;
>[何かの型]
>wHoge [] = ”愚かな私”;
>と書くと、変数にはASCIIコード、あるいは Shift-jis が入力されることになります。
>一体、ユニコードには何時変換されるのでしょう.....

変換されない…かと思われます。
まあ、実際に試したワケでもないのですが……。

https://msdn.microsoft.com/ja-jp/library/windows/desktop/ff381407(v=vs.85).aspx
TEXT()マクロを使っていれば適切に変換してくれますが、そうでないのならば変換はされないでしょう。
「マルチバイト文字セット」だった場合でも
wHoge [] = L”愚かな私”;
だったなら、wHoge[]に入るのはUNICODEになっているかと思われます。(ただし、型の方が入る場合でしょうけど)



VC++2010EEで実験。

#include <stdio.h>

void main(void)
{
 char szStr1[10] = "あ";
 wchar_t szStr2[10] = L"あ";
 char *pt;

 pt = (char *)&szStr1[0];
 printf("szStr1[0] = 0x%02X\n", *pt);

 pt = (char *)&szStr2[0];
 printf("szStr2[0] = 0x%02X\n", *pt);
}

を「マルチバイト文字セット」でコンパイル&実行すると、
szStr1[0] = 0xFFFFFF82
szStr2[0] = 0x42
「Unicode文字セット」でコンパイル&実行すると、
szStr1[0] = 0xFFFFFF82
szStr2[0] = 0x42

ちなみに、ソースコードはShift-JISとなっています。
L"あ"が、コンパイルの時点でUNICODEに変換されています。
"あ"はコンパイル時点でもShift-JISのまま。

TCHAR使用していないのでこうなります。
tchar.hを追加して、szStr1とszStr2をTCHARで作成すると…どちらかが型エラーになります。

>char
>hoge [] = ”hogehoge....”;
>[何かの型]
>wHoge [] = ”愚かな私”;
>と書くと、変数にはASCIIコード、あるいは Shift-jis が入力されることになります。
>一体、ユニコードには何時変換されるのでしょう.....

変換されない…かと思われます。
まあ、実際に試したワケでもないのですが……。

https://msdn.microsoft.com/ja-jp/library/windows/desktop/ff381407(v=vs.85).aspx
TEXT()マクロを使っていれば適切に変換してくれますが、そうでないのならば変換はされないでしょう。
「マルチバイト文字セット」...続きを読む


人気Q&Aランキング