CopyOrigin на вставке в Excel VBA

Вы можете использовать некоторые предустановленные переменные Dictionary, чтобы сопоставить строки с Type и операторами, а затем вручную построить Expression и скомпилировать их:

static Dictionary<string, Type> TypeMap = new Dictionary<string, Type> {
    { "int", typeof(Int32) },
    { "double", typeof(double) }
};
static Dictionary<string, (ExpressionType opType, Type methodType, string methodName)> OpMap = new Dictionary<string, (ExpressionType, Type, string)> {
    { "sum", (ExpressionType.Add, null, "") },
    { "difference", (ExpressionType.Subtract, null, "") },
    { "multiply", (ExpressionType.Multiply, null, "") },
    { "max", (ExpressionType.Call, typeof(Math), "Max") },
    { "min", (ExpressionType.Call, typeof(Math), "Min") },
};

Func<object, object, object> MakeFunction(string op, string dataType) {
    var parmType = TypeMap[dataType];
    var parma = Expression.Parameter(typeof(object), "a");
    var parmb = Expression.Parameter(typeof(object), "b");
    var changeTypeMI = typeof(Convert).GetMethod("ChangeType", new[] { typeof(object), typeof(Type) });
    var exprParmType = Expression.Constant(parmType);
    var lefta = Expression.Convert(Expression.Call(changeTypeMI, parma, exprParmType), parmType);
    var rightb = Expression.Convert(Expression.Call(changeTypeMI, parmb, exprParmType), parmType);
    Expression expr = null;
    var opTuple = OpMap[op];
    switch (opTuple.opType) {
        case ExpressionType.Call:
            var mi = opTuple.methodType.GetMethod(opTuple.methodName, new[] { parmType, parmType });
            expr = Expression.Call(mi, lefta, rightb);
            break;
        default:
            expr = Expression.MakeBinary(opTuple.opType, lefta, rightb);
            break;
    }
    var body = Expression.Convert(expr, typeof(object));
    return Expression.Lambda<Func<object, object, object>>(body, parma, parmb).Compile();
}

Примечание: я добавил позвоните на Convert.ChangeType для обработки, если вы передали, например, int для функции, которую вы сделали для "double". Вы можете удалить его и просто оставить в акте Expression.Convert, если вы собираетесь передавать только соответствующие типы.

19
задан Ben Rhys-Lewis 1 April 2016 в 16:15
поделиться

2 ответа

Это берет любой из одного параметра, как дали ниже.

Const xlFormatFromLeftOrAbove = 0

Member of Excel.XlInsertFormatOrigin

и...

Const xlFormatFromRightOrBelow = 1

Member of Excel.XlInsertFormatOrigin
22
ответ дан 30 November 2019 в 03:16
поделиться

При добавлении к комментариям Lakshmanaraj - это берет параметр форматирования в зависимости от того, где Вы вставляете ячейки и что форматирование Вас хочет выбрать.

Позволяет говорят, что Вы имеете:
первая строка, которая имеет полужирный текст,
вторая строка имеет вещи в курсиве.
Вы выбираете 2-ю строку и выполняете следующее выражение:

Selection.Insert CopyOrigin:=xlFormatFromLeftOrAbove

Новая строка вставляется между 1-й и 2-й строкой, и она выбирает правила форматирования от "строки выше" или "ячейки слева от ячейки".

В этом случае недавно вставленные ячейки будут иметь текст как полужирный без Вас устанавливающий его явно.

20
ответ дан 30 November 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: