Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: В формуле счетесли(R3C5:R3C45;"+") ошибка

Программа на Си вычисляет строку формулы и и вставляет её в ячейку.
До EXCEL 10 работало
Теперь выдаётся сообщение об ошибке для формулы, например, счетесли(R3C5:R3C45;"+")
Я что-то в жизни пропустил?
Ответ:
muk07
сами не замечаете своего высокомерия
Да, именно мое высокомерие заставляет проявляться ошибки напрограммированного 15 лет назад чуда. А прочитать советы Вы, видимо, не в состоянии из-за опять же моего высокомерия.
muk07
Каждый раз следует ответ на подменённый вопрос.

Это Вы, видимо, про себя. Потому что изначально был от меня такой вопрос:
The_Prist
есть Formula, FormulaR1C1, FormulaLocal, FormulaLocalR1C1. Что используете Вы и в каком виде?

Где ответ?
The_Prist
А что записано в PutVal?

Где ответ? Правильно, автор его зажал, как и многое другое.
А на остальные вещи Вы получили ответ, но вот дать ответ на встречные вопросы Вы уже были почему-то не в состоянии.

На то, что Вы даже руками формулу не можете ввести без ошибки(на скрине Вы это продемонстрировали) Вы получили ответ сразу и разъяснение почему ошибка может быть вообще в этом случае(стиль ссылок не соблюли). Но нафиг это Вам читать и вдумываться, когда все эти косяки можно просто свалить на Microsoft? Да, он не идеален. Но в данном случае виноват не он, а Вы, как разработчик того кода, который дает ошибку на элементарной записи. Все, добавить больше нечего. Вы просто не хотите искать и понимать ошибку - проще остаться на старой версии, где листов по умолчанию создается больше 1 и стиль ссылок, видимо, тоже всегда А1. Но это все до поры до времени. Когда-нибудь и это даст осечку и виноватых дальше самого себя искать будет негде. И ответы на вопросы при таком подходе - тоже.

Удачи в разработках!
Вопрос: Столкнулся с ошибкой оператор "/" невозможно применить к операнду типа "группа методов" и "(int)&qu

Столкнулся с ошибкой при написании кода.

Ошибка: оператор "/" невозможно применить к операнду типа "группа методов" и "(int)"

Подчеркивается "Xp /2"

C#
1
2
3
4
5
6
7
8
9
10
private void basePoints(int x0, int y0, double alfa, out int[,] points)
        {
            points = new int[2, 3];
            points[0, 0] = (int)Math.Round(x0 + Xp / 2);
            points[1, 0] = y0;
            points[0, 1] = (int)Math.Round(x0 - Xp / 2);
            points[1, 1] = (int)Math.Round(y0 + h);
            points[0, 2] = (int)Math.Round(points[0, 1] + Rk * Math.Cos(fi));
            points[1, 2] = (int)Math.Round(points[1, 1] - Rk * Math.Sin(fi));
        }
Ответ: спасибо

Добавлено через 5 минут
А если я задал формулу и программа сама считает?
Вопрос: Замена символа "=" на "=" для обновления формулы

Всем привет!

Задача такая: 1С сохраняет таблицу на винт в формате xls. В этой таблице в некоторых клетках указаны формулы одного из двух видов:

1. "=RC[-1]*RC[-4]" (перемножить две колонки, чтобы получить значение третьей)
2. "=СУММ(R[-82]C:R[-1]C)" (поле "итого" в подвале)

После сохранения таблицы 1С (ввиду ее ограниченных возможностей) дополнительно открывает получившийся файл через OLE, дорисовывает в его модуль макрос и выполняет этот макрос:

Sub RenewEveryFormula()
Cells.Replace What:=""="", Replacement:=""="", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End Sub";

Задача макроса - найти и заменить во всём файле символ "=" на "=" (макрос я записал через встроенный механизм икселя, вручную через ctrl+F заменив "=" на "=").

До выполнения макроса все клетки с формулами содержали в себе эти формулы в виде текстовых значений (=RC[-1]*RC[-4]). После выполнения макроса иксель хватается за голову и начинает видеть эти формулы именно как формулы. И всё это прекрасно работает и достаточно быстро, здесь проблем нет.

Проблемы есть с формулами итогов (=СУММ(R[-82]C:R[-1]C)). Указанный макрос подмены знака равенства не заставляет иксель правильно отреагировать. Вместо этого иксель в этих клетках оставляет ошибку "#ИМЯ?". "Показать этапы вычисления" по этой функции:



Похоже, ему что-то не нравится в названии функции "сумм"?

Я пробовал запускать тот же макрос вручную в этом документе повторно - нет результата.
Пробовал снова через ctrl+F найти и заменить все "=" на "=" - результат корректный, все формулы, включая итоги, сразу определяются.

Кто-то сталкивался с такой ситуацией? Почему иксель ругается с ошибкой "#ИМЯ?" ?

p.s. то, что "сумм" написано маленькими буквами, не влияет на ситуацию (пробовал и с большими).
p.s.s. написать "sum" тоже не канает.
Ответ: Офф
Алексей(Казанский) всего лишь сообщает участникам темы о кроссе(что надо бы сделать топикстартеру). Есть у кого желание делать уже кем-то сделанную работу - ради Бога. Однако не у всех оно есть. Я вот тоже активно не люблю кросспостеров и считаю необъявленные кроссы неуважением к чужому труду.
Вопрос: Как Макросом изменить в формулах "ОКРУГЛ" на "=ОКРУГЛ"

Здравствуйте форумчане! Возникла потребность в следующем:
С помощью макроса изменить в диапазоне Range("CF31:UP31") в формулах "ОКРУГЛ" на "=ОКРУГЛ", как бы подставляя знак "="
Формулы разные в этом диапазоне и они там такие:
Code
1
ОКРУГЛ($Q31*$R31*EF31-EF31;99)
Code
1
ОКРУГЛ(($BA$15+СУММ($DF$15:$DF$30))*ВПР($HF31;$Y$35:$AY$381;2;1);0)
Code
1
ОКРУГЛ((ЕСЛИ(СЧЁТЕСЛИМН($HF31;">="&HH$13;$HF31;"<"&HH$14)=0;0;$Q31*$R31*(($BA$15+СУММ(HH$30:HH$30))*$BA$14)-($BA$15+СУММ(HH$30:HH$30))*$BA$14));99)
Пробовал записать макрорекодером. Записать то удалось, но вот макрос получается не рабочим и при его запуске ничего не меняется и ничего не происходит. Может VBA не может понять что ему нужно делать, не знаю даже в чём проблема.
Вот такой код я записал Макрорекодером и он не работает:
Visual Basic
1
2
3
4
Range("CF31:UP31").Select
    Selection.Replace What:="ОКРУГЛ", Replacement:="=ОКРУГЛ", LookAt:=xlPart _
        , SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
Ответ: pashulka, а в одну строчку как? по компактнее. да и прошлый вариант в одну строчку не сработал.

Добавлено через 15 минут
pashulka,
Visual Basic
1
2
Range("CF31:UP31") = "ULTRA(ХЗ,1)""
MsgBox Range("A1") 'Проверка
этот наоборот добавил слово ultra, а я просил, чтобы слово ultra заменялось на знак "="
Этот:
Visual Basic
1
 Range("CF31:UP31").Replace "ULTRA(", "'=(", xlPart
не работает. нажимаю и ничего не происходит

Добавлено через 58 секунд
pashulka, а этот:
Visual Basic
1
[CF31:UP31].Replace "ОКРУГЛ(", "'=ОКРУГЛ(", xlPart: [CF31:UP31].FormulaLocal = [CF31:UP31].FormulaLocal
сработал только без знака '. т.е. заменять на =ОКРУГЛ

Добавлено через 14 минут
pashulka, в чём прикол? первая строка почему то в самом начале имеет знак '. Как его убрать? из за этого макрос не работает. На других строках знака ' нет. наверно потому что я там макросом не "проходил". после запуска макроса... не помню точно где и когда, появился знак ' и его убрать невозможно даже в ручную
Вопрос: "Метод Золотого сечения" не выводит результат функции в listBox

Здравствуйте! В С# я новичок. Я сделала программку по нахождению минимума "Методом Золотого сечения", но когда я пытаюсь вывести значения функции на listBox, он у меня ругается на аргумент. Помогите понять, что я не так сделала. Вот тут код главной формы (ругается на listBox1.Items.Add("Ответ: " + Gold.goldAlgorithm(func, FX, a, b, tol).ToString());:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Collections;
using info.lundin.Math;
 
namespace Gold
{
    public partial class Form1 : Form
    {
        string FX;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            FX = textBox1.Text;
            double a, b, tol;
 
            a = Convert.ToDouble(textBox2.Text.Trim().Replace(".", ","));
            b = Convert.ToDouble(textBox3.Text.Trim().Replace(".", ","));
            tol = Convert.ToDouble(textBox4.Text.Trim().Replace(".", ","));
 
            var Gold = new GoldClass();
            listBox1.Items.Add("Ответ: " + Gold.goldAlgorithm(func, FX, a, b, tol).ToString());
            listBox1.Items.Add("Значение функции: " + Gold.FX.ToString());
            listBox1.Items.Add("Количество итераций: " + Gold.i.ToString());
            listBox1.Items.Add("Delta: " + Gold.Tol.ToString("0e0"));
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
А тут код самого алгоритма Золотого сечения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System.Collections;
using info.lundin.Math;
 
namespace Gold
{
    class GoldClass
    {
        public int i { get; set; }
        public double FX { get; set; }
        public double Tol { get; set; }
 
        public double goldAlgorithm(parse func,string FX, double a, double b, double tol)
        {
            double tau, x1, x2, f1, f2;
 
            tau = (Math.Sqrt(5.0) - 1) / 2.0;
            x1 = a + (1 - tau) * (b - a);
            f1 = func.fx(x1);
            x2 = a + tau * (b - a);
            f2 = func.fx(x2);
            int i = 0;
            do
            {
                i = i + 1;
                if (f1 > f2)
                {
                    a = x1;
                    x1 = x2;
                    f1 = f2;
                    x2 = a + tau * (b - a);
                    f2 = func.fx(x2);
                }
                else
                {
                    b = x2;
                    x2 = x1;
                    f2 = f1;
                    x1 = a + (1 - tau) * (b - a);
                    f1 = func.fx(x1);
                }
            } while (Math.Abs(a - b) >= tol);
            return i;
        }
    }
}
Ответ: valera_21 parse я создала в отдельном классе
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using info.lundin.Math;
using System.Collections;
 
namespace Gold
{
    class parse
    {
        private Form1 mf;
        public string strFunction = "";
        public parse(Form1 MF)
        {
            mf = MF;
        }
        public double fx(double x)
        {
            try
            {
                Hashtable H;//В данном классе будет находится переменная значение начальной точки и ключ переменная в математическом выражении
                ExpressionParser e;  //Данный класс находится в библиотеке info.lundin.Math, Занимается парсингом математических выражений      
                e = new ExpressionParser();//Создание обьекта класса ExpressionParser;                
                H = new Hashtable();//создание обьекта класса Hashtable
                H.Add("x", "");//добавление ключа "x" - символ который нужно заменить в на заданное пользователем число 
                H["x"] = x.ToString();//присвоение элементу с ключом "x", значения начальной точки
                return e.Parse(strFunction, H);//Данная функция Parse выполняет разбор и вычисление математического выражения
                //аргументами являются: строка (формула) математическое выражение введенное пользователем, и обьект hash в котором содержится
                // ключ "x"  и значение начальной точки
            }
            catch (Exception ex)//Обработка исключений
            {
                throw new Exception("В целевой функции имеется ошибка!");
            }
        }
        public double fxsh1(double x, double eps)//функция вычисления первой производной
        {
            return (fx(x) - fx(x - eps)) / eps;
        }
        public double fxsh2(double x, double eps)//функция вычисления второй производной
        {
            return 20 * Math.Pow(x, 3);
        }
    }
}
Вопрос: Создать цикл Анализ "что если"-"Подбор параметра."

Добрый день.
В excel на работе есть классическая задача, которая решается с помощью подбора параметра. В столбце AO формула, в столбце AS значение, которое должно получиться в столбце AO, в столбце AL изменяемое значение, являющееся составной частью этой формулы.
И всё бы было хорошо, если бы таких строк не было 613. 613 раз применять подбор параметра как-то очень грустно, возник вопрос, возможно ли это как-то автоматизировать?
Мне решение видится как некий цикл, который для строк со 2 по 614 берет необходимые данные из столбцов AO, AS и AL и выполняет для каждой строчки подбор параметра. Возможно ли это на практике? Есть ли способы попроще/попродуктивнее? Гугл молчит, у меня такое ощущение, как-будто я первый, кто столкнулся с такой проблемой. Заранее спасибо за помощь.
Ответ:
Сообщение от Казанский
Никита Перчик, пробуйте. Если подбор параметра не привел к решению, ячейка покрасится в желтый.
Спасибо большое. Вы избавили мою офисную жизнь от многочасовых страданий.
Вопрос: Добавляются кавычки к пробелу при записи формулы в имя листа

Добрый день всем!

при записи формулы в имена листа =ПРАВСИМВ(форма3!P11;ДЛСТР(форма3!P11)-ПОИСК(" ";форма3!P11;4)) добавляет дополнительные кавычки =ПРАВСИМВ(форма3!P11;ДЛСТР(форма3!P11)-ПОИСК("" "";форма3!P11;4)), как это обойти?
также столкнулся с тем, если пользователь фильтрует таблицу появляются имена "фильтр базы", что при чтении вызывает ошибку

чтение формул
Код Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 Set iList = ActiveSheet
        If iList.ProtectContents = True Then
            MsgBox "Рабочий лист " & iList.Name & " защищён ", vbCritical, "Ошибка пользователя !!!"
            Exit Sub
        End If
        For Each n In iList.Names
            iList.Range(Split(n.Name, "_")(1)).FormulaLocal = GetValue(iList, n.Name)
        Next
 
Private Function GetValue(ByRef Sh As Worksheet, ByVal Parameter As String) As String
    ' возвращает ранее сохранённое значение в скрытом свойстве книги
    On Error Resume Next
    GetValue = Sh.Names(Parameter).RefersTo
    GetValue = Split(GetValue, "#")(1)
    '    If InStr(1, GetValue, "ЕСЛИ", 1) > 1 Then
    '        GetValue = Replace(GetValue, "ЕСЛИ", "IF")
    '        GetValue = Replace(GetValue, "ДЛСТР", "LEN")
    '    End If
End Function
запись формул
Код Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Set iList = ActiveSheet
               Set iSource = iList.UsedRange.SpecialCells(xlFormulas)
        sh1 = iList.Name: If InStr(1, sh1, " ", vbTextCompare) > 0 Then sh1 = Replace(sh1, " ", "")
        For Each iCell In iSource
            ff = Application.ConvertFormula(Formula:=iCell.Address, FromReferenceStyle:=xlA1, _
                    ToReferenceStyle:=xlA1, ToAbsolute:=xlRelative)
            SaveValue iList, "ИмяПерем" & sh1 & "_" & ff, iCell.FormulaLocal
            iCell.Value = iCell.Value
            '                SaveValue iList, "ИмяПерем" & sh1 & "_" & ff, iCell.Formula
        Next
 
 
Private Sub SaveValue(ByRef Sh As Worksheet, ByVal Parameter As String, ByVal NewValue As String)
    ' создаёт в книге WB скрытое имя Parameter со значением NewValue
    Dim n      As Name: On Error Resume Next: Err.Clear
    NewValue = "#" & NewValue & "#"
    Sh.Names(Parameter).RefersTo = NewValue
    If Err Then Sh.Names.Add Parameter, NewValue
    Sh.Names(Parameter).Visible = False
End Sub
Ответ:
Сообщение от Султанов
при записи формулы в имена листа... добавляет дополнительные кавычки..., как это обойти?
Это происходит не только при записи формулы, а при записи любого текста или числа - свойство имени .RefersTo содержит формулу, которая, если ее вычислить, даст исходный текст или число. А для вычисления формулы есть метод Evaluate.
Сообщение от Султанов
также столкнулся с тем, если пользователь фильтрует таблицу появляются имена "фильтр базы", что при чтении вызывает ошибку
Проверяйте, что имя начинается с ИмяПерем.
Вопрос: Вычисление логических операций по формуле

Программа должна считать по заданной формуле. Программа написана для процессора 8086 под управлением DOS.
Создал объектный файл через Tasm, затем через т-линк получил ехе. Программа запускается но после ввода значений всех аргументов формулы она не выводит ответ. Пытался проверить через td.exe, но все равно не очень понятно где ошибка.
P.S. заранее благодарен

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
;Лабораторная работа №2
 
; вычисление по формуле: w1 and w2 xor (d1 xor b1) or (b2 or b3)
; Ограничения:  не вводить отрицательных чисел;
; Сегмент стека
; Начало сегмента стека  (директива segment)
stacksg segment para stack 'Stack'      ; резервирование 1024 ячеек памяти под стек
 db 1024 dup (?)
;Конец сегмента стека  (директива ends)
stacksg ends
; Сегмент данных
;Начало сегмента данных  (директива segment)
datasg segment para 'Data'
;
; ячейки памяти b1, b2,:,bm, определенные директивой db;
b1 db 0
b2 db 0
b3 db 0
;
; ячейки памяти w1, w2,:,wn, определенные директивой dw;
w1 dw 0
w2 dw 0
  
; ячейки памяти d1, d2,:,dk, определенные директивой dd;
 d1 dd 0
 
; списки параметров для ввода с клавиатуры значений, занимающих один байт, 
; (т.е. значений b1, b2,:,bm), слово (w1, w2,:,wn)  и двойное слово (d1, d2,:,dk)
;
 vvod_b label byte
 max_b db 4
 fact_b db 0
 field_b db '0000','$'
 
 vvod_w label byte
 max_w db 6
 fact_w db 0
 field_w db '000000','$'
 
 vvod_d label byte
 max_d db 10
 fact_d db 0
 field_d db '00000000000','$'
;
; ячейки памяти, используемые процедурами ascii_binb, ascii_binw, ascii_bind, bin_ascii и др.
 ascval db "                  ","$";поле переведённых данных
 binval db 0                         ;результат преобразования
 asclen db 20                        ;длина введенного символьного числа
 mult10 db 1                         ;фактор умножения
 binval_w dw 0
;
; символьные константы 
 soob_p db 'Здравствуйте уважаемый пользователь',0dh,0ah,'$'
 soob_f db 'Программа вычисляет по формуле w1 and w2 xor (d1 xor b1) or (b2 or b3)          ',0ah,0dh,'$'
 
 s_b1 db 'Введите b1',0ah,0dh,'$'
 s_b2 db 'Введите b2',0ah,0dh,'$'
 s_b3 db 'Введите b3',0ah,0dh,'$'
 s_w1 db 'Введите w1',0ah,0dh,'$'
 s_w2 db 'Введите w2',0ah,0dh,'$'
 s_d1 db 'Введите d1',0ah,0dh,'$'
 
 soob_o db 'Ответ будет равен:',0ah,0dh,'$'
 soob_vixod db "Для выхода нажмите любую клавишу","$"
 soob db 'До свидания',0ah,0dh,'$'
 
 
 
 
 
 perevod_cursora db 0dh,0ah,"$"
 oshibka_v db "Ошибка ввода!(введите другое число)","$"
;
; ячейки промежуточных результатов
;
 rez1 dd 0
 rez2 dd 0
 rez3 dd 0
 rez4 dd 0
 rezult dq 0 
 kol dq 0
 osh_v db 0
 prom dw 0
 promd dd 0
 fml dd 0
 stroka db 2
;
; Конец сегмента данных  (директива ends)
datasg ends
 
; Сегмент кода
; Начало сегмента кода  (директива segment)
codesg segment para 'Code'
 
; Начало главной процедуры (директива proc)
 begin proc far
;
; Директива, устанавливащая  соответствие сегментных регистров  сегментам (директива assume)
;
  assume cs:codesg,ds:datasg,ss:stacksg
;
; Команды, которые должны быть в любой EXE-программе
;
  push ds
  xor ax,ax
  push ax
  mov ax,datasg
  mov ds,ax
 
;очистка экрана
;
  mov ax,0600h                     
  mov bh,02                 
  mov cx,0000        
  mov dx,314fh      
  int 10h       
   
  mov ah,02     
  mov bh,00     
  mov dh,01     
  mov dl,00     
  int 10h       
 
;Вывод на экран сообщения  'Привет, пользователь!!!!!',
  mov ah,09     ;Вывод приветствия
  lea dx,soob_p   
  int 21h         
 
formula1:
 
;Вывод на экран сообщения  'Эта программа производит вычисления                             
; по формуле формуле w1 and w2 xor (d1 xor b1) or (b2 or b3)
 
  mov ah,09     ; w1 and w2 xor (d1 xor b1) or (b2 or b3)
 
  lea dx,soob_f
  int 21h
 
;**********************************************************************
; ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b1  
;**********************************************************************
; вывод на экран сообщения: 'b1= '   
povtor_b1:
 
  mov ah,09     
  mov osh_v,0
  lea dx,s_b1
  int 21h
 
; ввод с клавиатуры  значения переменной b1  
  mov ah,0ah        ;Ввод с клавиатуры значения B1
  lea dx,vvod_b
  int 21h
 
;перевод введенных данных из ASCII-кодов в двоичный код   
  call ASCII_bin_b  ;Преобразование из кода ASCii в двоичный код
;
;результат преобразования  процедура помещает в ячейку binval_b 
;занесение двоичного значения в ячейку памяти с символьным именем b1    !! b0
 
  mov b1,al
  mov prom,0
  call cursor
        cmp osh_v,0
        je ii1
        jmp povtor_b1
ii1:
 
;*******************************************************************
;       ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b2
 
povtor_b2:
; вывод на экран сообщения: 'b2= '   !! b00
  mov ah,09     
  mov osh_v,0
  lea dx,s_b2
  int 21h
;
; ввод с клавиатуры  значения переменной b2     !! b00
  mov ah,0ah        
  lea dx,vvod_b
  int 21h
;
;перевод введенных данных из ASCII-кодов в двоичный код  
  call ASCII_bin_b  ;Преобразование из кода ASCii в двоичный код
;
;результат преобразования   процедура помещает в ячейку binval_b 
;занесение двоичного значения в ячейку памяти с символьным именем b2   
  mov b2,al
  mov prom,0
  call cursor
  cmp osh_v,0
    jz ii2
    jmp povtor_b2 
ii2:
;**********************************************************************
;        ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b3
povtor_b3:
 
 mov ah,09
 mov osh_v,0
 lea dx,s_b3
 int 21h
 
 mov ah,0ah
 lea dx,vvod_b
 int 21h
 
 call ASCII_bin_b
 
 mov b3,al
 mov prom,0
 call cursor
 cmp osh_v,0
      jz ii3
      jmp povtor_b3
ii3:
;*********************************************************
;       ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа d1
povtor_d1:
 
; вывод на экран сообщения: 'd1= '
  mov ah,09     ;Вывод сообщения 'Введите d1= '
  mov osh_v,0
  lea dx,s_d1
  int 21h
 
; ввод с клавиатуры  значения переменной  d1 в ячейку NAMEFLD_d списка параметров NAMEPAR_d
  mov ah,0ah        ;Ввод с клавиатуры значения d1
  lea dx,vvod_d
  int 21h
 
  call ASCII_bin_d  ;Преобразование из кода ASCii в двоичный код
; занесение переведённого значения (двойное слово) из binval_d в d1
  mov word ptr d1,ax
  mov word ptr d1+2,dx
;
  mov prom,0
  call cursor
  cmp osh_v,0
    jz ii4 
    jmp povtor_d1
 
ii4:
;********************************************************************
;       ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w1
povtor_w1:
; вывод на экран сообщения: 'w1= '
  mov ah,09     '
  mov osh_v,0
  lea dx,s_w1
  int 21h
 
; ввод с клавиатуры (функция ОАh) значения переменной w1
  mov ah,0ah        
  lea dx,vvod_w
  int 21h
 
; перевод введенных данных из ASCII кодов в двоичный код 
  call ASCII_bin_w  
;
; занесение двоичного значения в ячейку памяти с символьным именем w2 
  mov w1,ax
;
  mov prom,0
  call cursor
  cmp osh_v,0
    jz ii5
    jmp povtor_w1
 
ii5:
;*****************************************************************************
;       ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w2
;*****************************************************************************
povtor_w2:
;
; вывод на экран сообщения: 'w2= '
  mov ah,09     ;Вывод сообщения 'Введите w2= '
  mov osh_v,0
  lea dx,s_w2
  int 21h
;
; ввод с клавиатуры (функция ОАh) значения переменной w2
  mov ah,0ah        ;Ввод с клавиатуры значения w2
  lea dx,vvod_w
  int 21h
;
; перевод введенных данных из ASCII кодов в двоичный код  (вызвать процедуру  ASCII_binw) 
  call ASCII_bin_w  ;Преобразование из кода ASCii в двоичный код
 
; занесение двоичного значения в ячейку памяти с символьным именем w2 
  mov w2,ax
 
  mov prom,0
  call cursor
  cmp osh_v,0
    jz ii6
        jmp povtor_w2
ii6:
 
;отсюда
 
; Вычисление по формуле:  w1 and w2 xor (d1 xor b1) or (b2 or b3)
                        
;
;1. Логическая операция d1 xor b1
    xor ax,ax
    xor bx,bx
    mov ax, word ptr d1
    mov bx, word ptr b1
    xor ax,bx
    mov word ptr rez1,ax
    xor ax,ax
    mov ax, word ptr d1+2
    xor ax, bx
    mov word ptr rez1+2,ax   ;rez1:=d1 xor b1 
    
 
 
;2. Логическая операция b2 or b3
    xor al,al
    xor bl,bl
    mov al,b2
    mov bl,b3
    or al,bl
    xor ah,ah          
    mov word ptr rez2,ax    
    
 
;3. Логическая операция w1 and w2 
    xor ax,ax
    xor bx,bx
    mov ax,w1       
    mov bx,w2       
    and ax,bx        
    mov word ptr rez3,ax
    mov word ptr rez3+2,bx  ;rez3:=w1 and w2
 
;4. Логическая операция rez3 xor rez1
 
     xor ax,ax
     xor bx,bx
     mov ax, word ptr rez3
     mov bx, word ptr rez1
     xor ax,bx                         ;ax:=rez3 xor rez1    
     mov word ptr rez4,ax             
     xor ax,ax
     xor bx,bx
     mov ax, word ptr rez3+2
     mov bx, word ptr rez1+2
     xor ax,bx                         ;ax:=rez3+2 xor rez1+2   
     mov word ptr rez4+2,ax            ;rez4:=rez3 xor rez1    
 
 
 
;5. Логическая операция rez4 or rez2
    xor ax,ax 
    xor bx,bx
    mov ax,word ptr rez4
    mov bx,word ptr rez2
    or ax,bx
    mov word ptr rezult,ax  
    mov word ptr rezult+2,bx
    xor ax,ax
    xor bx,bx
    mov ax,word ptr rez4+2
    mov bx,word ptr rez2+2
    or ax,bx
    mov word ptr rezult+4,ax
    mov word ptr rezult+6,bx   ;rezult:=rez4 or rez2
    
 
 
    
    
;
; Вывод результата на экран
;
; Результат  из двоичного кода перевести в код ASCII (вызвать процедуру  bin_ascii )
call bin_ASCII      ;вызов процедуры перевода из bin в ASCII   
;
; Вывод на экран сообщения "Результат равен = "
mov ah,09h  ;
lea dx,soob_o   ;
int 21h     ;
;
; Вывод  на экран полученного в результате вычисления значения (в коде ascii)
mov ah,09h
lea dx,ascval
int 21h
 
call cursor
 
 
    mov ah,0        
    int 16h           
;
; выход из главной процедуры (возврат в DOS,   команда  ret)
  ret
;
; Конец главной процедуры  (директива endp)
 begin endp
;
; Процедуры, вызываемые из главной процедуры
;====================================================================    
;ASCII_binb           ;процедура перевода из ASCII в bin для байта
; 
; Начало процедуры (директива proc)
ASCII_bin_b proc            ;процедура перевода из ASCII в bin для байта 
; Вход: список параметров vvod_b должен быть заполнен;
; Выход: al=число в bin
;
; Тело процедуры
    xor ax,ax
    xor cx,cx
    mov prom,ax
    mov osh_v,al
    mov al,fact_b
    mov cl,al
    dec al
    mov si,ax
    mov bx,1
met1_b:
    mov al,field_b[si]
    cbw
    cmp ax,30h
    jb error_b
    cmp ax,39h
    ja error_b
    and al,0fh
    mul bx
    add prom,ax
    mov ax,bx
    mov bx,10
    mul bx
    mov bx,ax
    dec si
    loop met1_b
    mov ax,prom
    jmp end_error_b
error_b:
    call cursor
    mov ah,09h
    lea dx,oshibka_v
    int 21h
    mov osh_v,1 
end_error_b:
    ret
;
; Конец процедуры  (директива endp)
ASCII_bin_b endp
;====================================================================    
;ASCII_binw           ;процедура перевода из ASCII в bin для слова
; Вход:         список параметров vvod_w должен быть заполнен
; Выход:    ax = число в bin
 
ASCII_bin_w proc            ;процедура перевода из ASCII в bin для слова (Вход: список параметров vvod_w должен быть заполнен; выход: ax=число в bin)
;
 ; Тело процедуры
    xor ax,ax
    xor cx,cx
    mov prom,ax
    mov osh_v,al
    mov al,fact_w
    mov cl,al
    dec al
    mov si,ax
    mov bx,1
met1_w:
    mov al,field_w[si]
    cbw
    cmp ax,30h
    jb error_w
    cmp ax,39h
    ja error_w
    and al,0fh
    mul bx
    add prom,ax
    mov ax,bx
    mov bx,10
    mul bx
    mov bx,ax
    dec si
    loop met1_w
    mov ax,prom
    jmp end_error_w
error_w:
    call cursor
    mov ah,09h
    lea dx,oshibka_v
    int 21h
    mov osh_v,1 
end_error_w:
;
; Конец процедуры  (директива endp)
    ret
ASCII_bin_w endp
;====================================================================
;ascii_bind            ;процедура перевода из ASCII в bin для двойного слова
; Вход:         список параметров vvod_d должен быть заполнен
; Выход:    dx:ax = число в bin
;
; Начало процедуры (директива proc)
ASCII_bin_d proc            ;процедура перевода из ASCII в bin для дв. слова для МП 8086 (Вход: список параметров vvod_d должен быть заполнен; выход: dx:ax=число в bin)
;
; Тело процедуры
    xor ax,ax
    xor bx,bx
    xor cx,cx
    xor dx,dx
    mov word ptr promd,ax
    mov word ptr promd[2],ax
    mov word ptr fml[2],ax
    mov word ptr fml,1
    mov osh_v,al
    mov al,fact_d
    mov cl,al
    dec al
    mov si,ax
met1_d:
    mov bl,field_d[si]
    cmp bx,30h
    jb error_d
    cmp bx,39h
    ja error_d
    and bl,0fh
 
    mov dx,0
    mov ax,0
abd1:   cmp bl,0
    jz abd2
    add ax,word ptr fml
    adc dx,word ptr fml[2]
    dec bl
    jmp abd1
abd2:   add word ptr promd,ax
    adc word ptr promd[2],dx
    mov bl,9
    mov dx,word ptr fml[2]
    mov ax, word ptr fml
abd3:   cmp bl,0
    jz abd4
    add word ptr fml,ax
    adc word ptr fml[2],dx
    dec bl
    jmp abd3
abd4:       
    dec si
    loop met1_d
    mov dx,word ptr promd[2]
    mov ax,word ptr promd
    jmp end_error_d
error_d:
    call cursor
    mov ah,09h
    lea dx,oshibka_v
    int 21h
    mov osh_v,1 
end_error_d:
    ret
;
; Конец процедуры  (директива endp)
ASCII_bin_d endp
;====================================================================
; bin_ascii            ;процедура перевода из bin в ASCII
; Вход:         rezult = двоичное число
; Выход:    ascval = число в кодах ascii
;
; Начало процедуры (директива proc)
bin_ASCII proc      
; Тело процедуры
    call clrascval      ;
    lea si,ascval[19]
m1:
    cmp word ptr rezult[6],0
    jne m2
    cmp word ptr rezult[4],0
    jne m2
    cmp word ptr rezult[2],0
    jne m2
    cmp word ptr rezult,10
    jnb m2
    mov ax,word ptr rezult
    or al,30h
    mov [si],al
    dec si
    jmp m3
m2:
    sub word ptr rezult,10
    sbb word ptr rezult[2],0
    sbb word ptr rezult[4],0
    sbb word ptr rezult[6],0
    add word ptr kol,1
    adc word ptr kol[2],0
    adc word ptr kol[4],0
    adc word ptr kol[6],0
    jmp m1
m3:
    cmp word ptr kol[6],0
    jne m4
    cmp word ptr kol[4],0
    jne m4
    cmp word ptr kol[2],0
    jne m4
    cmp word ptr kol,0
    jne m4
    ret
m4:
    mov ax,word ptr kol
    mov word ptr rezult,ax
    mov ax,word ptr kol[2]
    mov word ptr rezult[2],ax
    mov ax,word ptr kol[4]
    mov word ptr rezult[4],ax
    mov ax,word ptr kol[6]
    mov word ptr rezult[6],ax
    mov word ptr kol,0
    mov word ptr kol[2],0
    mov word ptr kol[4],0
    mov word ptr kol[6],0
    jmp m1
;
; Конец процедуры  (директива endp)
bin_ASCII endp
;==================================================================== 
clrascval proc
        mov cx,20
    mov si,19
clr1:   and ascval[si],30h
    dec si
    loop clr1
    ret
clrascval endp
;=======================================================
cursor proc     ;процедура перевода курсора на след. строку
    mov ah,09
    lea dx,perevod_cursora
    int 21h
    ret
cursor endp
;=======================================================
; Конец сегмента кода  (директива ends)
codesg ends
; Конец программы  (директива end)
 end begin
Ответ: academec,
при компиляции tasm получил сообщение об ошибке в 249 строке - лишний апостроф.
После исправления попробовал выполнить - программа зависла при вводе b1, потом в другом месте.

Т.к. у вас нигде не отмечено, уточните что вы хотите получить? В каком формате осуществляется ввод и вывод данных (система счисления)?

В разделе есть закреплённая тема с примерами реализации ввода и вывода чисел в разных системах счисления

Её, конечно, можно и нужно пополнять, но и имеющееся может послужить отправной точкой.

Итак, что у вас не получается?

Добавлено через 1 минуту
---------------------
И большая просьба - реагируйте быстрее - выходные заканчиваются.
Вопрос: Как правильно составить формулу?

Здравствуйте.

Дано:
Имеется таблица неизвестной длинны (кол-ва строк)
Имеется формула Excel, которая будет выводить в колонку G разницу между датами в E и F. Вот она:

=ЕСЛИ(ЕПУСТО(E2);"";(ЕСЛИ(ЕПУСТО(F2);"ВВЕДИТЕ ДАТУ!";ЧИСТРАБДНИ(СЕГОДНЯ();F2))))

Поскольку мы не знаем длину таблицы, я попробовал скопировать формулу на весь столбец. Скопировал. Размер документа, пустого - в нём ещё нет ничего, кроме формулы - скакнул под 10Mb, и каждая операция совершалась по 5 секунд.

Возникла идея - написать макрос, чтобы при начале заполнения некой строки в соотв. столбец этой строки вставлялась эта формула
Visual Basic
1
2
3
4
5
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    If Target.Column = 1 Then
            Range("G" & Target.Row).Formula = "=ÅÑËÈ(ÅÏÓÑÒÎ(E" & Target.Row & ");"";(ÅÑËÈ(ÅÏÓÑÒÎ(F" & Target.Row & ");"ÂÂÅÄÈÒÅ ÄÀÒÓ!";×ÈÑÒÐÀÁÄÍÈ(ÑÅÃÎÄÍß();F" & Target.Row & "))))"
    End If
End Sub 
При попытке исполнения выдаёт ошибку - он считает что " в "ВВЕДИТЕ ДАТУ!" - это закрывающий " формулы.
Помогите, пожалуйста, правильно записать формулу.
Ответ: Kaji,
Visual Basic
1
Range("G" & Target.Row).FormulaR1C1 = "=IF(ISBLANK(RC[-2]),"""",(IF(ISBLANK(RC[-1]),""ВВЕДИТЕ ДАТУ!"",NETWORKDAYS(TODAY(),RC[-1]))))"
Вопрос: Перенос формул на новый лист по макросам

Всем привет!

Очень нужна ваша помощь, нужно открыть файл, чтобы понять, у меня есть база данных на первом листе, запуская макрос, по определенному Торговому представителю все данные именно по нему переносятся на новым лист. В чем проблема: переносится вся строка в этой строке есть формулы, при переносе формула начинает рассчитывать всё с первого листа, из- за этого данные по именному этому представителю не сходятся.
То есть если на первом листе в столбце Y рекомендовалось 6 точек, то на новом листе будет 7 и если проверять по ВПР то цифры совсем не сходятся, т.е. изначально на первом листе строка была на 15 строке,например, при переносе строка стала на 7 строчке и формула считает с первого листа со второй строчки, а расчет нужен именно с той же 15.
Строчки с важными формулами я выделила фиолетовым. Не могу прикрепить файл с макросом, поэтому его прикреплю его отдельно.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Sub Work()
   ' Work Macro
    Err.Clear
    Application.ScreenUpdating = False
    On Error Resume Next
    ' ssh - это исходный лист, с которого берем данные
    ' dsh - это лист, на который записывается отобранная информация, он обязательно должен быть  вторым по счету
    Dim sSH As Worksheet, dSH As Worksheet, myRa As Range
    Set sSH = ActiveSheet
    Set dSH = Sheets(2)
    If sSH.[A1] = "" Then MsgBox "Не выбран TEКСТ!", vbCritical: Exit Sub
    myName = sSH.[A1]
    dSH.Range("A17:BL1000").Clear
    Set myRa = sSH.[A5:A6]
    i = 4
    Do
        DoEvents
        i = i + 1
        If i = 10000 Then Exit Do
'        If sSH.Range("G" & i) = "" Then Exit Do
        If sSH.Range("G" & i) = myName Then
            Set myRa = Union(myRa, sSH.Range("G" & i))
        End If
    Loop
    myRa.EntireRow.Copy
    dSH.Range("A15").PasteSpecial xlPasteColumnWidths
    dSH.Range("A15").PasteSpecial xlPasteAll
    dSH.Activate
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    If Err > 0 Then MsgBox "Во время выполнения макроса были ошибки!": Exit Sub
    On Error GoTo 0
    
End Sub
Ответ: Предварительно пришлось на 2-ом листе создать объект таблица и переименовать ее в _Sheet__02
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub Work()
    ' ssh - это исходный лист, с которого берем данные
    ' dsh - это лист, на который записывается отобранная информация, он обязательно должен быть  вторым по счету
    Dim sSH As Worksheet, dSH As Worksheet, i&, j&, k&, A, myName, Z
    Set sSH = ActiveSheet
    Set dSH = Sheets(2)
    If sSH.[A1] = "" Then MsgBox "Не выбран TEКСТ!", vbCritical: Exit Sub
    myName = sSH.[A1]
    dSH.Range("A17:BL1000").Clear
    A = sSH.UsedRange.FormulaR1C1
    Application.Calculation = xlCalculationManual
    k = 16
    For i = 4 To UBound(A)
        If A(i, 7) = myName Then
            k = k + 1
            For j = 1 To 16
                dSH.Cells(k, j).FormulaR1C1 = A(i, j)
            Next
            For j = 17 To 31
                dSH.Cells(k, j).FormulaR1C1 = Replace(A(i, j), "_Sheet__01", "_Sheet__02")
            Next
            For j = 32 To 63
                dSH.Cells(k, j).FormulaR1C1 = A(i, j)
            Next
        End If
    Next
    dSH.Activate
    Application.Calculation = xlCalculationAutomatic
End Sub